在kubernetes中,每個POD都有個QoS標記,通過這個Qos標記來對POD進行服務質量管理。QoS的英文全稱為"Quality of Service",中文名為"服務質量",它取決於用戶對服務質量的預期,也就是期望的服務質量。對於POD來說,服務質量體現在兩個指標上,一個指標是CPU,另一個指標是內存。在實際運行過程中,當NODE節點上內存資源緊張的時候,kubernetes根據POD具有的不同QoS標記,采取不同的處理策略。
高
^ +------------------------+
| | |
| | Guaranteed |
| | |
| +------------------------+
| | |
| | Burstable |
| | |
| | |
| +------------------------+
| | |
| | BestEffort |
+ | |
低 +------------------------+
這三個QoS級別介紹,可以看下面表格:
QoS級別 |
QoS介紹 |
BestEffort |
POD中的所有容器都沒有指定CPU和內存的requests和limits,那么這個POD的QoS就是BestEffort級別 |
Burstable |
POD中只要有一個容器,這個容器requests和limits的設置同其他容器設置的不一致,那么這個POD的QoS就是Burstable級別 |
Guaranteed |
POD中所有容器都必須統一設置了limits,並且設置參數都一致,如果有一個容器要設置requests,那么所有容器都要設置,並設置參數同limits一致,那么這個POD的QoS就是Guaranteed級別 |
以下是舉例說明:
QoS級別 |
QoS配置例子 |
BestEffort |
containers: name: foo resources: name: bar resources: |
Burstable |
containers: name: foo resources: limits: cpu: 10m memory: 1Gi requests: cpu: 10m memory: 1Gi
name: bar |
containers: name: foo resources: limits: memory: 1Gi
name: bar resources: limits: cpu: 100m |
|
containers: name: foo resources: requests: cpu: 10m memory: 1Gi
name: bar |
|
Guaranteed |
containers: name: foo resources: limits: cpu: 10m memory: 1Gi name: bar resources: limits: cpu: 100m memory: 100Mi |
containers: name: foo resources: limits: cpu: 10m memory: 1Gi requests: cpu: 10m memory: 1Gi
name: bar resources: limits: cpu: 100m memory: 100Mi requests: cpu: 10m memory: 1Gi |
QoS級別決定了kubernetes處理這些POD的方式,我們以內存資源為例:
-
當NODE節點上內存資源不夠的時候,QoS級別是BestEffort的POD會最先被kill掉;當NODE節點上內存資源充足的時候,QoS級別是BestEffort的POD可以使用NODE節點上剩余的所有內存資源。
-
當NODE節點上內存資源不夠的時候,如果QoS級別是BestEffort的POD已經都被kill掉了,那么會查找QoS級別是Burstable的POD,並且這些POD使用的內存已經超出了requests設置的內存值,這些被找到的POD會被kill掉;當NODE節點上內存資源充足的時候,QoS級別是Burstable的POD會按照requests和limits的設置來使用。
-
當NODE節點上內存資源不夠的時候,如果QoS級別是BestEffort和Burstable的POD都已經被kill掉了,那么會查找QoS級別是Guaranteed的POD,並且這些POD使用的內存已經超出了limits設置的內存值,這些被找到的POD會被kill掉;當NODE節點上內存資源充足的時候,QoS級別是Burstable的POD會按照requests和limits的設置來使用。
-
從容器的角度出發,為了限制容器使用的CPU和內存,是通過cgroup來實現的,目前kubernetes的QoS只能管理CPU和內存,所以kubernetes現在也是通過對cgroup的配置來實現QoS管理的。