本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.25:cgroup v2 畢業晉升為 GA

Kubernetes 1.25 將 cgroup v2 帶入 GA (正式發行),讓 kubelet 使用最新的容器資源管理功能。

什麼是 cgroup?

有效的資源管理是 Kubernetes 的一個關鍵面向。這涉及管理節點中的有限資源,例如 CPU、記憶體和儲存空間。

cgroup 是一種 Linux 核心功能,可建立資源管理功能,例如限制 CPU 使用率或設定執行中程序的記憶體限制。

當您使用 Kubernetes 中的資源管理功能時,例如設定 Pod 和容器的請求和限制,Kubernetes 會使用 cgroup 來強制執行您的資源請求和限制。

Linux 核心提供兩個版本的 cgroup:cgroup v1 和 cgroup v2。

什麼是 cgroup v2?

cgroup v2 是 Linux cgroup API 的最新版本。cgroup v2 提供了一個統一的控制系統,具有增強的資源管理功能。

自 2016 年以來,cgroup v2 一直在 Linux 核心中開發,近年來在容器生態系統中已趨於成熟。隨著 Kubernetes 1.25 的發布,cgroup v2 支援已升級為正式發行。

許多最新版本的 Linux 發行版已預設切換到 cgroup v2,因此 Kubernetes 繼續在這些新的更新發行版上良好運作非常重要。

cgroup v2 提供了相較於 cgroup v1 的多項改進,例如以下

  • API 中的單一統一階層設計
  • 更安全的子樹委派給容器
  • 更新的功能,例如 Pressure Stall Information
  • 跨多個資源增強的資源分配管理和隔離
    • 用於不同類型記憶體分配 (網路和核心記憶體等) 的統一計帳
    • 用於非立即資源變更 (例如頁面快取寫回) 的計帳

某些 Kubernetes 功能專門使用 cgroup v2 來增強資源管理和隔離。例如,MemoryQoS 功能 提高了記憶體利用率,並依賴 cgroup v2 功能來啟用它。kubelet 中的新資源管理功能也將利用未來推出的新 cgroup v2 功能。

如何使用 cgroup v2?

許多 Linux 發行版正在預設切換到 cgroup v2;您下次更新控制平面和節點的 Linux 版本時,可能會開始使用它!

建議使用預設使用 cgroup v2 的 Linux 發行版。一些使用 cgroup v2 的熱門 Linux 發行版包括以下

  • Container Optimized OS (自 M97 起)
  • Ubuntu (自 21.10 起)
  • Debian GNU/Linux (自 Debian 11 Bullseye 起)
  • Fedora (自 31 起)
  • Arch Linux (自 2021 年 4 月起)
  • RHEL 和類似 RHEL 的發行版 (自 9 起)

若要檢查您的發行版是否預設使用 cgroup v2,請參閱檢查您的 cgroup 版本或查閱您發行版的說明文件。

如果您使用的是託管 Kubernetes 產品,請諮詢您的供應商,以確定他們如何採用 cgroup v2,以及您是否需要採取措施。

若要將 cgroup v2 與 Kubernetes 搭配使用,您必須符合以下要求

  • 您的 Linux 發行版在核心版本 5.8 或更高版本上啟用 cgroup v2
  • 您的容器執行期支援 cgroup v2。例如
  • kubelet 和容器執行期已設定為使用 systemd cgroup 驅動程式

kubelet 和容器執行期使用 cgroup 驅動程式 來設定 cgroup 參數。當使用 cgroup v2 時,強烈建議 kubelet 和您的容器執行期都使用 systemd cgroup 驅動程式,以便系統上有單一 cgroup 管理器。若要設定 kubelet 和容器執行期以使用驅動程式,請參閱 systemd cgroup 驅動程式文件

移轉到 cgroup v2

當您在啟用 cgroup v2 的 Linux 發行版上執行 Kubernetes 時,kubelet 應自動調整,而無需任何額外的組態,前提是您符合要求。

在大多數情況下,當您切換到使用 cgroup v2 時,您不會看到使用者體驗有任何差異,除非您的使用者直接存取 cgroup 檔案系統。

如果您的應用程式直接存取 cgroup 檔案系統 (無論是在節點上還是從容器內部),您必須更新應用程式以使用 cgroup v2 API 而不是 cgroup v1 API。

您可能需要更新到 cgroup v2 的情境包括以下

  • 如果您執行依賴 cgroup 檔案系統的第三方監控和安全代理程式,請將代理程式更新為支援 cgroup v2 的版本。
  • 如果您以獨立 DaemonSet 執行 cAdvisor 以監控 Pod 和容器,請將其更新至 v0.43.0 或更高版本。
  • 如果您部署 Java 應用程式,請優先使用完全支援 cgroup v2 的版本

瞭解更多

參與其中

隨時歡迎您的意見反應!SIG Node 定期舉行會議,並可在 Kubernetes Slack#sig-node 頻道中找到,或使用 SIG 郵寄清單

cgroup v2 經歷了漫長的旅程,是整個產業開放原始碼社群協作的一個很好的例子,因為它需要跨堆疊的工作,從 Linux 核心到 systemd 到各種容器執行期,以及 (當然) Kubernetes。

致謝

我們要感謝 Giuseppe Scrivano,他發起了 Kubernetes 中的 cgroup v2 支援,以及 SIG Node 社群 (包括主席 Dawn ChenDerek Carr) 的評論和領導。

我們還要感謝 Docker、containerd 和 CRI-O 等容器執行期的維護者,以及 cAdvisorrunc、libcontainer 等組件的維護者,它們是許多容器執行期的基礎。最後,如果沒有 systemd 和上游 Linux 核心維護者的支援,這一切都不可能實現。

這是團隊的努力!