Pod服务质量QoS

114 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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

图片.png

3.1.创建Burstable的Pod

如果满足下面条件,将会指定Pod的QoS类为Burstable:

  • Pod不符合Guaranteed QoS类的标准。
  • Pod中至少一个容器指定了内存或CPU的请求或限制。

图片.png

创建一个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

图片.png

图片.png

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

图片.png

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

图片.png