如何为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 - <<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
如何为k8s中的pod配置QoS等级?的更多相关文章
- [转帖]在 k8s 中通过 Ingress 配置域名访问
在 k8s 中通过 Ingress 配置域名访问 https://juejin.im/post/5db8da4b6fb9a0204520b310 在上篇文章中我们已经使用 k8s 部署了第一个应用,此 ...
- k8s 中的 Pod 细节了解
k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...
- k8s中kubeconfig的配置及使用
1.概述 kubeconfig文件保存了k8s集群的集群.用户.命名空间.认证的信息.kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯. 注意:用于配 ...
- k8s中删除pod后仍然存在问题
分析: 是因为删除了pod,但是没有删除对应的deployment,删除对应的deployment即可 实例如下: 删除pod [root@test2 ~]# kubectl get pod -n j ...
- K8S中的ingress-nginx配置
编辑在有道云笔记中,链接如下: http://note.youdao.com/noteshare?id=8d9ae3a1643e39714b36b58f7507baa2&sub=61C8C20 ...
- [转帖]在 k8s 中自动为域名配置 https
在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...
- 在k8s中收集jvm异常dump文件到OSS
现状 加参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 可以实现在jvm发生内存错误后 会生成dump文件 方便开 ...
- Pod Preset玩转K8S容器时区自动配置
缘由默认的情况,在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候 ...
- k8s中pod内dns无法解析的问题
用k8s创建了pod,然后进入pod后,发现在pod中无法解析www.baidu.com,也就是出现了无法解析外面的域名的问题.经过高人指点,做个小总结.操作如下. 一,将CoreDNS 的Confi ...
随机推荐
- 异步回调实现- Guava Retryer
为什么要使用重试利器Retryer 在实际开发中我们经常会遇到需要轮询查询一个接果,实现轮询的方式有很多种,我们经常要写许多代码,有时还会怕写出的代码有bug,如果已经有轮子了,我们就没必要重复造轮子 ...
- Nginx的优化与防盗链
Nginx的优化与防盗链 1.隐藏版本号 2.修改用户与组 3.缓存时间 4.日志切割 5.连接超时 6.更改进程数 7.配置网页压缩 8.配置防盗链 9.fpm参数优化 1.隐藏版本号: 可以使用 ...
- BumbleBee: 如丝般顺滑构建、交付和运行 eBPF 程序
本文地址:https://www.ebpf.top/post/bumblebee 1. 前言 不久前,Solo.io 公司在官网博客宣布了开源了一个名称为 BumbleBee 的新项目.该项目专注于简 ...
- 13、Linux基础--grep、sed、awk三剑客综合运用
考试 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 [root@localhost ~]# grep -E '^[sS]' /proc/meminfo [root@l ...
- 6、Linux基础--文件类型、属性信息、创建用户与用户组
笔记 1.晨考 1.解析映射文件 /etc/hosts 2.磁盘挂载文件 /etc/fstab 3.设置开机自启动脚本的步骤 1.修改/etc/rc.local 2.设置可执行权限 chmod +x ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- 字段是字段,属性是属性,字段不是属性,属性看getter或setter
1.看图猜字段和属性 2.结果是一个属性[字段麻,太明目张胆啦,就是2啦],又是哪个属性能够显示出来呢? 3.这是为什么呢? 让我们回到javabean的课堂~~~ ★ javaBean中的prope ...
- 北大博士生提出CAE,下游任务泛化能力优于何恺明MAE
大家好,我是对白. 何恺明时隔两年发一作论文,提出了一种视觉自监督学习新范式-- 用掩蔽自编码器MAE,为视觉大模型开路. 这一次,北大博士生提出一个新方法CAE,在其下游任务中展现的泛化能力超过了M ...
- Python "爬虫"出发前的装备之一正则表达式
1. 正则表达式 正则表达式是一种模板表达式语言 通过定义规则去匹配.查找.替换.分割一个长字符串中特定的子字符信息. 如在一篇文章中查找出所有合法的电子邮箱地址,则可以先用正则表达式定义一个电子邮箱 ...
- 使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)
使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...