如何为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 ...
随机推荐
- 在CentOS中安装与配置Server JRE 8
感谢大佬:https://my.oschina.net/zx0211/blog/508221?p=1 其实也很简单: 1.从http://www.oracle.com/technetwork/java ...
- UIImageView的序列帧动画
#pragma mark - 开始动画 - (IBAction)startAnimation { // 1.1 加载所有的图片 NSMutableArray<UIImage *> *ima ...
- js变量类型判断 严格通用 Object.prototype.toString.call()
Object.prototype.toString.call()判断结果: Object.prototype.toString.call(true) "[object Boolean]&qu ...
- 一个实用批处理指令制作过程分享:Perforce更新完后打开VisualStudio再编译
需求来源 笔者从事Unreal游戏客户端工作,使用VisualStudio开发,然后经常干一个事:就是使用Perforce(或svn)拉取最新代码,(一些时间后)拉取完之后然后打开 项目.sln,即V ...
- Java中File类的方法详解
File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...
- ssh一段时间无操作后自动断开连接(假死)问题
平时使用ssh远程服务器的时候(注:远程虚拟机一般不会有这个问题),一段时间没有操作,ssh连接就会处于假死状态,以至于需要重新进行ssh连接,不管你用的什么远程工具都会出现这个问题,那么通过心跳检测 ...
- Note - 千年食谱颂
其实是兔子收集的各种下饭操作与名菜食谱.( 零·策略篇 多校 NOIP 2021.11.05: 这个真的是,我每次打毛毛虫剖分都是 rush 状态 qwq.像这种 已知代码难度大.不便于调试的 ...
- [LeetCode]66.加一(Java)
原题地址: plus-one 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 ...
- MySQL数据备份/导出 创建用户及其删除
Mysql DCL 创建用户 create user '用户名'@'localhost(本机访问)/%(通配符任何ip地址都可访问本机) 分配权限 grant 权限 on 数据库.表名 to '用户名 ...
- 手把手教你在命令行(静默)部署oracle 11gR2
文章目录 环境介绍 linux发行版 cpu.内存以及磁盘空间 敲黑板 关闭防火墙以及selinux 操作系统配置 使用阿里的yum源提速 安装依赖软件 设置用户最大进程数以及最大文件打开数 内核参数 ...