如何为k8s中的pod配置QoS等级()

1、概述
本文介绍如何为pod分配特定的QoS等级。

我们知道,在k8s的环境中,通过使用QoS等级来做决定,在资源紧张的时候,将哪些的pod进行驱逐,或者说如何对pod进行调度。

OK,话不多说,让我们来一一的介绍和说明。

2、如何为pod定义QoS等级
在k8s中,通过为pod中的容器设置资源(cpu、内存的requests和limits)来决定pod的QoS等级。

3、QoS等级
当在k8s的集群中创建一个pod的时候,就会将下面中的一个QoS等级分配给POD:

  • Guaranteed
  • Burstable
  • BestEffort
4、实验验证
OK,那我们通过一些实验,来看下,在什么情况,会给pod分配什么样的QoS等级。

4.1、创建一个临时的命名空间
kubectl create namespace qos-example

4.2、创建Guarateed QoS等级的Pod
满足以下的条件,POD会被分配Guaranteed的QoS等级:

  • POD中的每个容器必须有内存limit和内存request
  • 对于pod中的每个容器,内存的limit和内存的request必须相等
  • pod中的每个容器必须要有cpu limit和cpu request
  • 对于pod中的每个容器,cpu的limit和cpu的request必须相等

简单来说,pod中的每个容器都要有cpu和内存的limit和request,并且limit和request要相等。

通过以下的命令创建一个pod
kubectl apply -f - <


在以上的pod的配置文件中,包含一个容器。容器中包含内存的limit和request,都是200M,容器包含CPU的limit和request,值都是700m.


查看pod的详细信息
[root@nccztsjb-node-23 ~]# kubectl get pod qos-demo -n qos-example -o yaml | grep qosClass qosClass: Guaranteed [root@nccztsjb-node-23 ~]#


通过以上pod的输出可以看到,k8s给了pod一个Guaranteed的QoS等级。


删除pod

kubectl delete pod qos-demo -n qos-example



注意:如果一个容器指定了memory的limit,但是没有指定memory的request,这个时候,在创建容器的时候,k8s会自动分配memory的requests,并且这个值会和limits的值相同。同样的,如果一个容器指定了CPU的limits但是没有指定cpu的requests,k8s也会自动的分配和cpu limit相等的cpu request.

如下示例,进行说明:

通过以下的命令(没有request 设置)创建pod
kubectl apply -f - <


查看pod的内容

kubectl get pod qos-demo -n qos-example -o yaml...省略... spec: containers: - image: 172.20.58.152/middleware/nginx:1.21.4 imagePullPolicy: IfNotPresent name: qos-demo-ctr resources: limits: cpu: 700m memory: 200Mi requests: cpu: 700m memory: 200Mi ...省略... status: ...省略... qosClass: Guaranteed

ok,我们看到,已经自动加上了requests的值,并且和limits的值相等。
requests: cpu: 700m memory: 200Mi

4.3、创建Burstable QoS等级的POD
当满足以下的条件时,pod就会被分配Burstable的QoS等级:

  • pod不满足guaranteed QoS等级的标准
  • pod中至少一个容器配置了memory或者cpu requests

ok,我们创建以下的pod
kubectl apply -f - <

以上的pod配置中,有一个容器。容器的内存 limits 是200M,内存requests是100Mi。

查看pod的信息
kubectl get pod -n qos-example qos-demo-2 -o yaml...省略... spec: containers: - image: 172.20.58.152/middleware/nginx:1.21.4 imagePullPolicy: IfNotPresent name: qos-demo-2-ctr resources: limits: memory: 200Mi requests: memory: 100Mi ...省略... status: ...省略... qosClass: Burstable

从以上的输出可以看到pod的QoS等级是Burstable。

删除pod
kubectl delete pod qos-demo-2 --namespace=qos-example

4.4、创建BestEffort QoS等级的Pod
如果在创建pod时,pod中容器都没有指定memory和cpu的request和limit的设置。那么,k8s就会给pod一个BestEffort的QoS级别。

创建以下的pod示例:

kubectl apply -f - <


查看pod的详细信息:
kubectl get pod -n qos-example qos-demo-3 -o yaml...省略... spec: containers: - image: 172.20.58.152/middleware/nginx:1.21.4 imagePullPolicy: IfNotPresent name: qos-demo-3-ctr resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: kube-api-access-ff2lf readOnly: true status: ...省略... qosClass: BestEffort ...省略...

OK,从以上的输出可以看到pod的QoS等级是BestEffort。

在创建pod的时候,没有指定任何内存、CPU的requests和limits的值。

删除pod
kubectl delete pod qos-demo-3 --namespace=qos-example

4.5、创建包含2个容器的pod
kubectl apply -f - <

通过以上的pod配置文件创建pod,其中包含2个容器,其中一个容器指定内存requests,另外的一个容器没有指定任何的资源配置。

查看pod的运行状态
[root@nccztsjb-node-23 ~]# kubectl get pod -n qos-example NAMEREADYSTATUSRESTARTSAGE qos-demo-42/2Running10 (3m55s ago)25m


查看pod的QoS等级
[root@nccztsjb-node-23 ~]# kubectl get pod -n qos-example qos-demo-4 -o yaml | grep qosClass qosClass: Burstable [root@nccztsjb-node-23 ~]#

从输出的结果来看,该pod的QoS等级是Burstable。即pod中容器的request,limits的请求不满足guaranteed和besteffort的要求的,都是Burstable。

删除pod
kubectl delete pod qos-demo-4 --namespace=qos-example

删除命名空间
kubectl delete namespace qos-example



OK,以上的验证示例,就说明了,在什么情况下,pod会被设置为什么样的QoS等级。

5、总结
pod中的所有容器都配置内存、cpu的requests和limits,并且requests的值和limits的值相等时,QoS等级:Guaranteed。

pod中的所有容器都没有设置,cpu,内存的limits和requests,QoS等级:BestEffort

【如何为k8s中的pod配置QoS等级()】其他情况,QoS等级:Burstable

    推荐阅读