Pod 服務質量類

本頁面介紹了 Kubernetes 中的“服務質量(QoS)等級”,並解釋了 Kubernetes 如何根據你為 Pod 中容器指定的資源約束為每個 Pod 分配 QoS 等級。Kubernetes 依賴此分類來決定當節點上沒有足夠的可用資源時驅逐哪些 Pod。

服務質量等級

Kubernetes 對你執行的 Pod 進行分類,並將每個 Pod 分配到特定的**服務質量 (QoS) 等級**。Kubernetes 使用該分類來影響不同 Pod 的處理方式。Kubernetes 基於 Pod 中容器資源請求以及這些請求與資源限制的關係進行分類。這被稱為服務質量(QoS)等級。Kubernetes 根據其組成容器的資源請求和限制為每個 Pod 分配一個 QoS 等級。QoS 等級被 Kubernetes 用於決定當節點遇到節點壓力時從節點驅逐哪些 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 驅逐的情況下,只有在所有 `BestEffort` Pod 被驅逐後,這些 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` 的標準,則它具有 `BestEffort` QoS 等級。換句話說,只有當 Pod 中的所有容器都沒有記憶體限制或記憶體請求,並且 Pod 中的所有容器都沒有 CPU 限制或 CPU 請求時,Pod 才是 `BestEffort` 等級。Pod 中的容器可以請求其他資源(非 CPU 或記憶體),並且仍被歸類為 `BestEffort`。

使用 cgroup v2 的記憶體 QoS

特性狀態: Kubernetes v1.22 [alpha] (預設停用)

記憶體 QoS 使用 cgroup v2 的記憶體控制器來保證 Kubernetes 中的記憶體資源。Pod 中容器的記憶體請求和限制用於設定記憶體控制器提供的特定介面 `memory.min` 和 `memory.high`。當 `memory.min` 設定為記憶體請求時,記憶體資源被保留,永遠不會被核心回收;這就是記憶體 QoS 確保 Kubernetes Pod 記憶體可用性的方式。如果容器中設定了記憶體限制,這意味著系統需要限制容器記憶體使用;記憶體 QoS 使用 `memory.high` 來限制接近記憶體限制的工作負載,確保系統不會因瞬時記憶體分配而過載。

記憶體 QoS 依賴 QoS 等級來確定要應用哪些設定;然而,這些是不同的機制,都提供對服務質量的控制。

某些行為與 QoS 等級無關

某些行為與 Kubernetes 分配的 QoS 等級無關。例如:

  • 任何超出資源限制的容器都將被 kubelet 終止並重新啟動,而不會影響 Pod 中的其他容器。

  • 如果容器超出其資源請求並且它執行的節點面臨資源壓力,則它所在的 Pod 成為驅逐的候選物件。如果發生這種情況,Pod 中的所有容器都將被終止。Kubernetes 可能會建立一個替換 Pod,通常在不同的節點上。

  • 一個 Pod 的資源請求等於其組成容器的資源請求之和,一個 Pod 的資源限制等於其組成容器的資源限制之和。

  • kube-scheduler 在選擇要搶佔的 Pod 時不考慮 QoS 等級。當叢集沒有足夠的資源來執行你定義的所有 Pod 時,可能會發生搶佔。

下一步

最後修改時間:2024 年 4 月 20 日太平洋標準時間上午 12:16:修復了 pod-qos.md 中的特性狀態 (aeb36c0c72)