kubernetes(22):k8s资源限制和服务质量QoS
k8s资源限制和服务质量QoS
https://www.jianshu.com/p/b02e6bb20f03
https://www.cnblogs.com/Smbands/p/10960536.html
1 前言
熟悉Linux的孩子们都知道,当服务把物理资源内存、CPU耗尽是怎么样的场景。
Pod在不限制不设置资源的时候,可以使用整个node的资源,如果真的发生,那肯定会对其他的pod产生影响,而且当资源紧俏时,k8s会按qos服务质量等级来动态kill。
2 可压缩资源
CPU资源。
当资源紧俏,发生资源抢占时,Pod可以分享时间片。例如,在1U的node上,容器A请求0.6U,容器B请求0.4U。资源紧俏时,将会按照请求的比例分配时间片。容器A:0.6U/(0.6U+0.4U);容器B:0.4U/(0.6U+0.4U)。
当资源剩余,发生超用时,即实际使用超过请求,Pod按照比例分配剩余资源。例如,在1U的node上,容器A请求0.6U,容器B请求0.3U,剩余0.1U。两个容器都想超用,剩余的0.1U将会按照请求的比例进行2:1分配给两个容器。
关于提高资源利用率,可以将负载高峰时间错开的应用部署在一起,提高node利用率。
3 不可压缩资源
内存和磁盘资源。
4 内存和CPU的限制
requests:容器运行需求,最低保障
limits:限制,硬限制(资源上限)
CPU的单位有:
CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU)
1物理核=1000个微核(millicores)
1000m=1CPU
- 正实数,代表分配几颗CPU,可以是小数点,比如0.5代表0.5颗CPU,意思是一颗CPU的一半时间。2代表两颗CPU。
- 正整数m,也代表1000m=1,所以500m等价于0.5。
内存的单位:
- 正整数,直接的数字代表Byte
- k、K、Ki,Kilobyte
- m、M、Mi,Megabyte
- g、G、Gi,Gigabyte
- t、T、Ti,Terabyte
- p、P、Pi,Petabyte
5 QoS 服务质量等级
全称Quality of service class
- Guranteed:优先级最高。pod中每个容器同时定义了cpu和memory的request和limit,并且两者的request=limit;
- Burstable:优先级中等。pod中至少有一个容器定义了cpu或memory的request属性,且二者不一定要相等;
- BestEffort:优先级最低。pod中没有任何一个容器定义了request或limit属性;
当资源紧俏时,例如OOM,kubelet会根据QoS进行驱逐:
Best-Effort,最低优先级,第一个被kill;
Burstable,第二个被kill。
Guaranteed,最高优先级,最后kill。除非超过limit或者没有其他低优先级的Pod;
由于对于不可压缩资源,发生抢占的情况会出Pod被意外Kill掉的情况,所以建议对于不可以压缩资源(Memory,Disk)的设置成0<Request==Limit,即Guaranteed。
6 资源限制样例
# cat qos.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15 ports: - containerPort: 80 resources: requests: cpu: "250m" memory: "64Mi" limits: #资源最高限制 memory: "128Mi" cpu: "500m" #0.5核cpu
[root@k8s-master ~]# kubectl apply -f qos.yaml deployment.extensions/nginx-deployment unchanged [root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-785b9567c4-2tp9s 1/1 Running 0 74s nginx-deployment-785b9567c4-6vsrc 1/1 Running 0 74s nginx-deployment-785b9567c4-x89xb 1/1 Running 0 74s [root@k8s-master ~]# kubectl describe pod nginx-deployment-785b9567c4-2tp9s |grep QoS QoS Class: Burstable [root@k8s-master ~]#
metrics-server验证
我已经安装啦啦啦,没安装的参考下一篇
[root@k8s-master ~]# kubectl top pod NAME CPU(cores) MEMORY(bytes) nginx-deployment-785b9567c4-2tp9s 0m 2Mi nginx-deployment-785b9567c4-6vsrc 0m 2Mi nginx-deployment-785b9567c4-x89xb 0m 2Mi [root@k8s-master ~]#