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 - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr
image: 172.20.58.152/middleware/nginx:1.21.4
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
EOF

在以上的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 - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr
image: 172.20.58.152/middleware/nginx:1.21.4
resources:
limits:
memory: "200Mi"
cpu: "700m"
EOF

查看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 - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-2
namespace: qos-example
spec:
containers:
- name: qos-demo-2-ctr
image: 172.20.58.152/middleware/nginx:1.21.4
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
EOF

以上的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 - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-3
namespace: qos-example
spec:
containers:
- name: qos-demo-3-ctr
image: 172.20.58.152/middleware/nginx:1.21.4
EOF

查看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 - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-4
namespace: qos-example
spec:
containers: - name: qos-demo-4-ctr-1
image: 172.20.58.152/middleware/nginx:1.21.4
resources:
requests:
memory: "200Mi" - name: qos-demo-4-ctr-2
image: 172.20.58.152/middleware/redis:6.2.6
EOF

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

查看pod的运行状态

[root@nccztsjb-node-23 ~]# kubectl get pod -n qos-example
NAME READY STATUS RESTARTS AGE
qos-demo-4 2/2 Running 10 (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

其他情况,QoS等级:Burstable

最新文章

  1. 【无私分享:ASP.NET CORE 项目实战(第八章)】读取配置文件(二) 读取自定义配置文件
  2. 【数据库】_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。
  3. 基于Ruby的watir-webdriver自动化测试方案与实施(一)
  4. some things
  5. JavaScript强化教程——jQuery UI API 类别
  6. linux.打包与压缩
  7. SQLServer2005 常用语法大全
  8. POJ 1986(LCA and RMQ)
  9. Unhandled Exxception “Unhandled exception type IOException”?
  10. 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB
  11. 关于sql中去换行符的问题
  12. 读APUE分析散列表的使用
  13. echarts饼图点击事件
  14. python怎么实现数组增加一行或多行
  15. 【memcache】windos下 memcache更改默认的端口和最大使用内存
  16. Spring结合log4j(slf4j)
  17. 洛谷P3247 最小公倍数 [HNOI2016] 分块+并查集
  18. [android] 优酷环形菜单-相对布局练习
  19. MikroTik RouterOS安装到SATA硬盘
  20. LINUX-vmstat命令讲解

热门文章

  1. django之js模板插件artTemplate的使用
  2. 使用 TensorFlow 构建机器学习项目中文版&amp;#183;翻译完成
  3. Uwl.Admin.Core开源框架(二) 使用QuartzNet
  4. ARC-124 部分题解
  5. 读取数据库Blob类型的文本数据
  6. 封装jar问题java.lang.SecurityException: Invalid signature file digest for Manifest main attributes以及maven依赖重提解决
  7. Callable接口及Futrue接口详解
  8. iOS UIWebView与JavaScript的交互 相关资料
  9. tip8:CentOS8安装ftp服务器
  10. 零基础自学Python十天的时候,写的一款猜数字小游戏,附源码和软件下载链接!