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 ~]#

 

posted on 2019-10-14 16:28  光阴8023  阅读(915)  评论(0编辑  收藏  举报