QoS
是 Quality of Service 的縮寫,即服務質量。為了實現資源被有效調度和分配的同時提高資源利用率,kubernetes
針對不同服務質量的預期,通過 QoS(Quality of Service)來對 pod 進行服務質量管理。對於一個 pod 來說,服務質量體現在兩個具體的指標:CPU 和內存
。當節點上內存資源緊張時,kubernetes 會根據預先設置的不同 QoS 類別進行相應處理。
QoS 主要分為Guaranteed、Burstable 和 Best-Effort
三類,優先級從高到低。
Guaranteed(有保證的)
屬於該級別的pod有以下兩種:
- Pod中的所有容器都且僅設置了 CPU 和內存的 limits
- pod中的所有容器都設置了 CPU 和內存的 requests 和 limits ,且單個容器內的
requests==limits
(requests不等於0)
pod中的所有容器都且僅設置了limits:
containers: name: foo resources: limits: cpu: 10m memory: 1Gi name: bar resources: limits: cpu: 100m memory: 100Mi
pod 中的所有容器都設置了 requests 和 limits,且單個容器內的requests==limits
:
containers: name: foo resources: limits: cpu: 10m memory: 1Gi requests: cpu: 10m memory: 1Gi name: bar resources: limits: cpu: 100m memory: 100Mi requests: cpu: 100m memory: 100Mi
容器foo和bar內resources的requests和limits均相等,該pod的QoS級別屬於Guaranteed
。
Burstable(不穩定的)
pod中只要有一個容器的requests和limits的設置不相同,該pod的QoS即為Burstable
。
容器foo指定了resource,而容器bar未指定:
containers: name: foo resources: limits: cpu: 10m memory: 1Gi requests: cpu: 10m memory: 1Gi name: bar
容器foo設置了內存limits,而容器bar設置了CPU limits:
containers: name: foo resources: limits: memory: 1Gi name: bar resources: limits: cpu: 100m
注意:若容器指定了requests而未指定limits,則limits的值等於節點resource的最大值;若容器指定了limits而未指定requests,則requests的值等於limits。
Best-Effort(盡最大努力)
如果Pod中所有容器的resources均未設置requests與limits,該pod的QoS即為Best-Effort
。
容器foo和容器bar均未設置requests和limits:
containers: name: foo resources: name: bar resources:
根據QoS進行資源回收策略
Kubernetes 通過cgroup
給pod設置QoS級別,當資源不足時先kill
優先級低的 pod,在實際使用過程中,通過OOM
分數值來實現,OOM
分數值范圍為0-1000。OOM 分數值根據OOM_ADJ
參數計算得出。
對於Guaranteed
級別的 Pod,OOM_ADJ參數設置成了-998,對於Best-Effort
級別的 Pod,OOM_ADJ參數設置成了1000,對於Burstable
級別的 Pod,OOM_ADJ參數取值從2到999。
對於 kuberntes 保留資源,比如kubelet,docker,OOM_ADJ參數設置成了-999,表示不會被OOM kill掉。OOM_ADJ參數設置的越大,計算出來的OOM分數越高,表明該pod優先級就越低,當出現資源競爭時會越早被kill掉,對於OOM_ADJ參數是-999的表示kubernetes永遠不會因為OOM將其kill掉。
QoS pods被kill掉場景與順序
- Best-Effort pods:系統用完了全部內存時,該類型 pods 會最先被kill掉。
- Burstable pods:系統用完了全部內存,且沒有 Best-Effort 類型的容器可以被 kill 時,該類型的 pods 會被 kill 掉。
- Guaranteed pods:系統用完了全部內存,且沒有 Burstable 與 Best-Effort 類型的容器可以被 kill 時,該類型的 pods 會被 kill 掉。
QoS使用建議
如果資源充足,可將 QoS pods 類型均設置為Guaranteed
。用計算資源換業務性能和穩定性,減少排查問題時間和成本。如果想更好的提高資源利用率,業務服務可以設置為Guaranteed,而其他服務根據重要程度可分別設置為Burstable或Best-Effort。