Kubernetes 服務質量 Qos 解析 - Pod 資源 requests 和 limits 如何配置?


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM