如何为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 ...
随机推荐
- 如何在pyqt中实现win10亚克力效果
亚克力效果的实现思路 上一篇博客<如何在pyqt中实现窗口磨砂效果> 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味.所以今天早上又在网上搜了一 ...
- Android图表库hellocharts详解
感谢大佬:https://www.cnblogs.com/huolongluo/p/5988644.html 因为项目需要搞一个折线图,按照日期显示相应的成绩,所以有了本文. 以前用过一次XCL-ch ...
- js注释和数据类型转换
单行注释 用来描述下面一个或多行代码的作用 // 这是一个变量var name = 'hm'; 多行注释 用来注释多条代码 /*var age = 18;var name = 'zs';console ...
- ios 类别和扩展-赵小波
类别 @interface ClassName ( CategoryName ) // method declarations @end Category在iOS开发中使用非常频繁.尤其是在为系统类进 ...
- BGP路由协议(Border Gateway Protocol)
BGP路由协议(Border Gateway Protocol) 目录 BGP路由协议(Border Gateway Protocol) 一.BGP概述 1.自治系统(AS,autonomous sy ...
- .NET 6全文检索引擎Lucene.NET 4.8简单封装
前言 因为最近在做一个检索数据的工具.最开始用的Mysql8自带的全文检索功能.但是发现这货数据量超过百万之后,检索速度直线下降. 于是想到Lucene.net.花了一晚上时间做了简单的封装.可以直接 ...
- Mac下Charles踩坑记录
初次使用Charles,摸索着抓包的过程中遇到了很多问题.在这里一一记录一下,避免其他初学者踩坑. 问题1:不显示request和response? 在Charles的配置页面可以勾选是否把reque ...
- 汉明码、海明校验码(Hamming Code)
目录 基础知识 汉明码/海明校验码 计算 基础知识 码距:又叫海明距离,是在信息编码中,两个编码之间对应位上编码不同的位数.例如编码100110和010101,第1.2.5.6位都不相同,所以这两个编 ...
- MXNet学习-第一个例子:训练MNIST数据集
一个门外汉写的MXNET跑MNIST的例子,三层全连接层最后验证率是97%左右,毕竟是第一个例子,主要就是用来理解MXNet怎么使用. #导入需要的模块 import numpy as np #num ...
- CentOS7搭建yum源仓库(阿里源)
文章目录 注意:环境要求 1.配置服务器端yum 1.1.安装yum源工具 1.2.配置nginx 1.2.1.配置nginx页面目录 1.3.替换yum源文件 1.4.建立yum源仓库 2.配置客户 ...