本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.25: cgroup v2 進階至 GA
Kubernetes 1.25 將 cgroup v2 推向 GA(普遍可用),讓 kubelet 能夠使用最新的容器資源管理功能。
什麼是 cgroups?
有效的資源管理是 Kubernetes 的一個關鍵方面。這涉及到管理節點中有限的資源,例如 CPU、記憶體和儲存。
cgroups 是一種 Linux 核心功能,它提供了資源管理功能,例如限制 CPU 使用率或為正在執行的程序設定記憶體限制。
當您使用 Kubernetes 中的資源管理功能時,例如配置Pod 和容器的請求和限制,Kubernetes 使用 cgroups 來強制執行您的資源請求和限制。
Linux 核心提供了兩個版本的 cgroups:cgroup v1 和 cgroup v2。
什麼是 cgroup v2?
cgroup v2 是 Linux cgroup API 的最新版本。cgroup v2 提供了一個統一的控制系統,具有增強的資源管理功能。
cgroup v2 自 2016 年以來一直在 Linux 核心中開發,近年來已在容器生態系統中成熟。隨著 Kubernetes 1.25 的釋出,cgroup v2 支援已升級到普遍可用。
許多最近釋出的 Linux 發行版已預設切換到 cgroup v2,因此 Kubernetes 能夠在新更新的發行版上良好執行至關重要。
cgroup v2 相對於 cgroup v1 提供了多項改進,例如:
- API 中的單一統一層級設計
- 更安全的子樹委託給容器
- 新功能,如 壓力停滯資訊
- 增強的多資源分配管理和隔離
- 不同型別記憶體分配(網路和核心記憶體等)的統一記賬
- 非即時資源更改(例如頁面快取寫回)的記賬
某些 Kubernetes 功能專門使用 cgroup v2 來增強資源管理和隔離。例如,MemoryQoS 功能改進了記憶體利用率,並依賴 cgroup v2 功能來實現。kubelet 中的新資源管理功能也將利用新的 cgroup v2 功能向前發展。
如何使用 cgroup v2?
許多 Linux 發行版預設切換到 cgroup v2;下次更新控制平面和節點的 Linux 版本時,您可能會開始使用它!
使用預設使用 cgroup v2 的 Linux 發行版是推薦的方法。一些流行的預設使用 cgroup v2 的 Linux 發行版包括:
- 容器最佳化作業系統 (自 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。例如:
- containerd v1.4 或更高版本
- cri-o v1.20 或更高版本
- kubelet 和容器執行時已配置為使用 systemd cgroup 驅動程式
kubelet 和容器執行時使用 cgroup 驅動程式來設定 cgroup 引數。使用 cgroup v2 時,強烈建議 kubelet 和您的容器執行時都使用 systemd cgroup 驅動程式,以便系統上只有一個 cgroup 管理器。要將 kubelet 和容器執行時配置為使用該驅動程式,請參閱 systemd cgroup 驅動程式文件。
遷移到 cgroup v2
當您使用啟用 cgroup v2 的 Linux 發行版執行 Kubernetes 時,只要您滿足要求,kubelet 應該會自動適應,無需進行任何額外配置。
在大多數情況下,除非您的使用者直接訪問 cgroup 檔案系統,否則切換到 cgroup v2 後,您不會看到使用者體驗上的差異。
如果您的應用程式直接訪問 cgroup 檔案系統,無論是在節點上還是在容器內部,您都必須更新應用程式以使用 cgroup v2 API 而不是 cgroup v1 API。
您可能需要更新到 cgroup v2 的場景包括:
- 如果您執行依賴 cgroup 檔案系統的第三方監控和安全代理,請將代理更新到支援 cgroup v2 的版本。
- 如果您執行 cAdvisor 作為獨立的 DaemonSet 來監控 Pod 和容器,請將其更新到 v0.43.0 或更高版本。
- 如果您部署 Java 應用程式,請優先使用完全支援 cgroup v2 的版本。
- OpenJDK / HotSpot: jdk8u372、11.0.16、15 及更高版本
- IBM Semeru Runtimes: 8.0.382.0、11.0.20.0、17.0.8.0 及更高版本
- IBM Java: 8.0.8.6 及更高版本
瞭解更多
- 閱讀 Kubernetes cgroup v2 文件
- 閱讀增強提案,KEP 2254
- 在 Linux 手冊頁上了解更多關於 cgroups 的資訊,以及在 Linux 核心文件上了解更多關於 cgroup v2 的資訊
參與其中
我們始終歡迎您的反饋!SIG Node 定期開會,您可以透過 Kubernetes Slack 中的 #sig-node
頻道或使用 SIG 郵件列表聯絡我們。
cgroup v2 經歷了漫長的歷程,是跨行業開源社群協作的典範,因為它需要跨堆疊(從 Linux 核心到 systemd,再到各種容器執行時,當然還有 Kubernetes)的工作。
致謝
我們要感謝 Giuseppe Scrivano,他啟動了 Kubernetes 中的 cgroup v2 支援,並感謝 SIG Node 社群(包括主席 Dawn Chen 和 Derek Carr)的審查和領導。
我們還要感謝 Docker、containerd 和 CRI-O 等容器執行時的維護者,以及 cAdvisor 和 runc, libcontainer 等元件的維護者,它們支撐著許多容器執行時。最後,如果沒有 systemd 和上游 Linux 核心維護者的支援,這一切都不可能實現。
這是團隊的努力!