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等级?的更多相关文章

  1. [转帖]在 k8s 中通过 Ingress 配置域名访问

    在 k8s 中通过 Ingress 配置域名访问 https://juejin.im/post/5db8da4b6fb9a0204520b310 在上篇文章中我们已经使用 k8s 部署了第一个应用,此 ...

  2. k8s 中的 Pod 细节了解

    k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...

  3. k8s中kubeconfig的配置及使用

    1.概述 kubeconfig文件保存了k8s集群的集群.用户.命名空间.认证的信息.kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯. 注意:用于配 ...

  4. k8s中删除pod后仍然存在问题

    分析: 是因为删除了pod,但是没有删除对应的deployment,删除对应的deployment即可 实例如下: 删除pod [root@test2 ~]# kubectl get pod -n j ...

  5. K8S中的ingress-nginx配置

    编辑在有道云笔记中,链接如下: http://note.youdao.com/noteshare?id=8d9ae3a1643e39714b36b58f7507baa2&sub=61C8C20 ...

  6. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

  7. 在k8s中收集jvm异常dump文件到OSS

    现状 加参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 可以实现在jvm发生内存错误后 会生成dump文件 方便开 ...

  8. Pod Preset玩转K8S容器时区自动配置

    缘由默认的情况,在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候 ...

  9. k8s中pod内dns无法解析的问题

    用k8s创建了pod,然后进入pod后,发现在pod中无法解析www.baidu.com,也就是出现了无法解析外面的域名的问题.经过高人指点,做个小总结.操作如下. 一,将CoreDNS 的Confi ...

随机推荐

  1. 异步回调实现- Guava Retryer

    为什么要使用重试利器Retryer 在实际开发中我们经常会遇到需要轮询查询一个接果,实现轮询的方式有很多种,我们经常要写许多代码,有时还会怕写出的代码有bug,如果已经有轮子了,我们就没必要重复造轮子 ...

  2. Nginx的优化与防盗链

    Nginx的优化与防盗链 1.隐藏版本号 2.修改用户与组 3.缓存时间 4.日志切割 5.连接超时 6.更改进程数 7.配置网页压缩 8.配置防盗链 9.fpm参数优化 1.隐藏版本号: 可以使用 ...

  3. BumbleBee: 如丝般顺滑构建、交付和运行 eBPF 程序

    本文地址:https://www.ebpf.top/post/bumblebee 1. 前言 不久前,Solo.io 公司在官网博客宣布了开源了一个名称为 BumbleBee 的新项目.该项目专注于简 ...

  4. 13、Linux基础--grep、sed、awk三剑客综合运用

    考试 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 [root@localhost ~]# grep -E '^[sS]' /proc/meminfo [root@l ...

  5. 6、Linux基础--文件类型、属性信息、创建用户与用户组

    笔记 1.晨考 1.解析映射文件 /etc/hosts 2.磁盘挂载文件 /etc/fstab 3.设置开机自启动脚本的步骤 1.修改/etc/rc.local 2.设置可执行权限 chmod +x ...

  6. Solution -「WF2011」「BZOJ #3963」MachineWorks

    \(\mathcal{Description}\)   Link.   给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...

  7. 字段是字段,属性是属性,字段不是属性,属性看getter或setter

    1.看图猜字段和属性 2.结果是一个属性[字段麻,太明目张胆啦,就是2啦],又是哪个属性能够显示出来呢? 3.这是为什么呢? 让我们回到javabean的课堂~~~ ★ javaBean中的prope ...

  8. 北大博士生提出CAE,下游任务泛化能力优于何恺明MAE

    大家好,我是对白. 何恺明时隔两年发一作论文,提出了一种视觉自监督学习新范式-- 用掩蔽自编码器MAE,为视觉大模型开路. 这一次,北大博士生提出一个新方法CAE,在其下游任务中展现的泛化能力超过了M ...

  9. Python "爬虫"出发前的装备之一正则表达式

    1. 正则表达式 正则表达式是一种模板表达式语言 通过定义规则去匹配.查找.替换.分割一个长字符串中特定的子字符信息. 如在一篇文章中查找出所有合法的电子邮箱地址,则可以先用正则表达式定义一个电子邮箱 ...

  10. 使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)

    使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...