Pod 服務品質類別
本頁介紹 Kubernetes 中的服務品質 (QoS) 類別,並說明 Kubernetes 如何根據您為該 Pod 中容器指定的資源限制,為每個 Pod 指派 QoS 類別。Kubernetes 依賴此分類來決定在節點上沒有足夠可用資源時,應逐出哪些 Pod。
服務品質類別
Kubernetes 對您執行的 Pod 進行分類,並將每個 Pod 分配到特定的服務品質 (QoS) 類別。Kubernetes 使用該分類來影響如何處理不同的 Pod。Kubernetes 根據 Pod 中容器的資源請求,以及這些請求與資源限制的關聯性來進行此分類。這稱為服務品質 (QoS) 類別。Kubernetes 根據其元件容器的資源請求和限制,為每個 Pod 指派一個 QoS 類別。Kubernetes 使用 QoS 類別來決定從遇到節點壓力的節點中逐出哪些 Pod。可能的 QoS 類別為 Guaranteed
、Burstable
和 BestEffort
。當節點資源耗盡時,Kubernetes 將首先逐出該節點上執行的 BestEffort
Pod,然後是 Burstable
,最後是 Guaranteed
Pod。當此逐出是由於資源壓力引起時,只有超出資源請求的 Pod 才會成為逐出的候選者。
Guaranteed
Guaranteed
Pod 具有最嚴格的資源限制,並且最不可能面臨逐出。保證它們在超出其限制或沒有可以從節點搶佔的較低優先順序 Pod 之前不會被終止。它們可能不會獲取超出其指定限制的資源。這些 Pod 也可以使用 static
CPU 管理策略來使用獨佔 CPU。
準則
為了使 Pod 獲得 Guaranteed
的 QoS 類別
- Pod 中的每個容器都必須具有記憶體限制和記憶體請求。
- 對於 Pod 中的每個容器,記憶體限制必須等於記憶體請求。
- Pod 中的每個容器都必須具有 CPU 限制和 CPU 請求。
- 對於 Pod 中的每個容器,CPU 限制必須等於 CPU 請求。
Burstable
Burstable
Pod 具有基於請求的某些下限資源保證,但不要求特定的限制。如果未指定限制,則預設為相當於節點容量的限制,這允許 Pod 在資源可用時彈性地增加其資源。在由於節點資源壓力而導致 Pod 逐出的情況下,這些 Pod 僅在所有 BestEffort
Pod 被逐出後才被逐出。由於 Burstable
Pod 可以包含沒有資源限制或請求的容器,因此 Burstable
Pod 可以嘗試使用任何數量的節點資源。
準則
如果 Pod 符合以下條件,則會被賦予 Burstable
的 QoS 類別
- Pod 不符合 QoS 類別
Guaranteed
的準則。 - Pod 中至少有一個容器具有記憶體或 CPU 請求或限制。
BestEffort
BestEffort
QoS 類別中的 Pod 可以使用未明確分配給其他 QoS 類別中 Pod 的節點資源。例如,如果您的節點有 16 個 CPU 核心可供 kubelet 使用,並且您為 Guaranteed
Pod 分配了 4 個 CPU 核心,那麼 BestEffort
QoS 類別中的 Pod 可以嘗試使用剩餘 12 個 CPU 核心中的任何數量。
如果節點處於資源壓力之下,kubelet 優先逐出 BestEffort
Pod。
準則
如果 Pod 不符合 Guaranteed
或 Burstable
的準則,則該 Pod 的 QoS 類別為 BestEffort
。換句話說,只有當 Pod 中沒有任何容器具有記憶體限制或記憶體請求,並且 Pod 中沒有任何容器具有 CPU 限制或 CPU 請求時,Pod 才是 BestEffort
。Pod 中的容器可以請求其他資源(非 CPU 或記憶體),並且仍然被歸類為 BestEffort
。
使用 cgroup v2 的記憶體 QoS
Kubernetes v1.22 [alpha]
(預設啟用:false)Memory QoS 使用 cgroup v2 的記憶體控制器,以確保 Kubernetes 中的記憶體資源。Pod 中容器的記憶體請求和限制用於設定記憶體控制器提供的特定介面 memory.min
和 memory.high
。當 memory.min
設定為記憶體請求時,記憶體資源會被保留,且永遠不會被核心回收;這就是 Memory QoS 如何確保 Kubernetes Pod 的記憶體可用性。如果容器中設定了記憶體限制,則表示系統需要限制容器的記憶體使用量;Memory QoS 使用 memory.high
來限制工作負載接近其記憶體限制,確保系統不會因瞬間的記憶體分配而過載。
Memory QoS 依賴 QoS 類別來決定要套用哪些設定;然而,這些是不同的機制,但都提供對服務品質的控制。
某些行為與 QoS 類別無關
某些行為與 Kubernetes 指定的 QoS 類別無關。例如:
任何容器超出資源限制都將被 kubelet 終止並重新啟動,而不會影響該 Pod 中的其他容器。
如果容器超出其資源請求,且其運行的節點面臨資源壓力,則該容器所在的 Pod 將成為驅逐的候選者。如果發生這種情況,Pod 中的所有容器都將被終止。Kubernetes 可能會建立一個替換 Pod,通常在不同的節點上。
Pod 的資源請求等於其組件容器的資源請求之總和,而 Pod 的資源限制等於其組件容器的資源限制之總和。
kube-scheduler 在選擇要搶佔哪些 Pod 時,不會考慮 QoS 類別。當叢集沒有足夠的資源來運行您定義的所有 Pod 時,可能會發生搶佔。
下一步
- 了解關於 Pod 和容器的資源管理。
- 了解關於 節點壓力驅逐。
- 了解關於 Pod 優先順序和搶佔。
- 了解關於 Pod 中斷。
- 了解如何為容器和 Pod 指派記憶體資源。
- 了解如何為容器和 Pod 指派 CPU 資源。
- 了解如何為 Pod 設定服務品質。