开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
1.什么是QoS
QoS(Quality of Service),可译为“服务质量等级”,或者译作“服务质量保证”,是作用在Pod上的一个配置,当kubernetes创建一个pod时,它就会给这个Pod分配一个QoS等级。
在kubernetes的环境中,kubernetes允许节点的Pod过载使用资源,这意味着节点无法同时满足所有Pod以过载的方式运行。因此在内存资源紧缺的情况下,kubernetes需要借助Pod对象的服务质量和优先级等完成判定,进而挑选对应的Pod杀死。kubernetes根据Pod的Requests和Limits属性,把Pod对象归类为三类BestEffort、BurStable、Guaranteed。
2.QoS类别
- Guaranteed:Pod对象为每个容器都设置了CPU资源需求和资源限制,且两者的值相同;还同时为每个容器设置了内存需求与内存限制,并且两者的值相同。这类Pod对象具有最高级别服务质量。
- Burstable:至少有一个容器设置了CPU或内存资源Requests属性,但不满足Guaranteed,这类Pod具有中级服务质量
- BestEffort:没有为任何容器设置Requests和Limits属性,这类Pod对象服务质量是最低级别 当kubernetes集群内存资源紧缺,优先杀死BestEffort类别的容器,因为系统不为该类资源提供任何服务保证,但 此类资源最大的好处就是能够尽可能的使用资源 如果系统中没有BestEffort类型的容器,接下来就轮到Burstable类型的容器,如果有多个Burstable类型的容器, 就看谁的内存资源占用多,就优先干掉谁。比如A容器申请1G内存资源,实际使用了95%,而B容器申请了2G内存资源 实际使用了80%,但任然会优先干掉A容器,虽然A容器的用量少,但与自身的Requests值相比,他的占比要大于B容器 对于Guaranteed类型的容器拥有最高优先级,它们不会被杀死,除非其内存资源需求超限,或者OOM时没有其他更低 优先级的Pod对象存在,才会干掉Guaranteed类容器
3.创建Guaranteed的Pod
对于QoS类为Guaranteed的Pod:
- Pod中的每个容器都必须指定内存请求和内存限制,且Pod中每个容器内存请求必须等于内存限制。
- Pod中的每个容器都必须指定CPU请求和CPU限制,且Pod中每个容器CPU请求必须等于CPU限制。
1.创建一个Pod,容器设置了内存请求和内存限制,值都是200MiB。容器设置了CPU请求和CPU限制,值都是700milliCPU
[root@k8s-master /k8s/deploy]# vim pod-guaranteed.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-guaranteed
spec:
containers:
- name: guaranteed-container
image: nginx
resources:
requests:
cpu: "700m"
memory: "200Mi"
limits:
cpu: "700m"
memory: "200Mi"
[root@k8s-master /k8s/deploy]# kubectl apply -f pod-guaranteed.yaml
pod/pod-guaranteed created
[root@k8s-master /k8s/deploy]# kubectl describe pod pod-guaranteed
3.1.创建Burstable的Pod
如果满足下面条件,将会指定Pod的QoS类为Burstable:
- Pod不符合Guaranteed QoS类的标准。
- Pod中至少一个容器指定了内存或CPU的请求或限制。
创建一个Pod,容器设置了内存请求100MiB,以及内存限制200MiB
[root@k8s-master /k8s/deploy]# vim pod-burstable.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-burstable
spec:
containers:
- name: burstable-container
image: nginx
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
[root@k8s-master /k8s/deploy]# kubectl apply -f pod-burstable.yaml
pod/pod-burstable created
[root@k8s-master /k8s/deploy]# kubectl describe pod pod-burstable
3.2.创建BestFeeort的Pod
对于QoS类的BestEffort的Pod,Pod中的容器必须没有设置内存和CPU限制或请求。
创建一个Pod,容器没有设置内存和CPU限制或请求
[root@k8s-master /k8s/deploy]# vim pod-besteffort.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-besteffort
spec:
containers:
- name: besteffort-container
image: nginx
[root@k8s-master /k8s/deploy]# kubectl apply -f pod-besteffort.yaml
pod/pod-besteffort created
[root@k8s-master /k8s/deploy]# kubectl describe pod pod-besteffort
3.3.创建多容器Pod
创建一个Pod,一个容器指定了内存请求200MiB。另外一个容器没有指定任何请求和限制。此Pod满足Burstable QoS类的标准。但它不满足Guaranteed QoS类标准,因为它的一个容器设有内存请求。
[root@k8s-master /k8s/deploy]# vim pod-mutil.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-mutil
spec:
containers:
- name: mutil-container
image: nginx
resources:
requests:
memory: "200Mi"
- name: mutil2
image: redis
[root@k8s-master /k8s/deploy]# kubectl apply -f pod-mutil.yaml
pod/pod-mutil created
[root@k8s-master /k8s/deploy]# kubectl describe pod pod-mutil