關於 cgroup v2
在 Linux 上,控制群組約束分配給程序的資源。
kubelet 和底層容器執行期需要與 cgroup 介接,以強制執行 Pod 和容器的資源管理,其中包括容器化工作負載的 CPU/記憶體請求和限制。
Linux 中有兩個版本的 cgroup:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup
API。
什麼是 cgroup v2?
Kubernetes v1.25 [穩定]
cgroup v2 是 Linux cgroup
API 的下一個版本。cgroup v2 提供具有增強資源管理功能的統一控制系統。
cgroup v2 提供比 cgroup v1 更多的改進,例如以下
- API 中單一統一階層設計
- 更安全的子樹委派給容器
- 更新的功能,例如 Pressure Stall Information
- 跨多個資源增強的資源分配管理和隔離
- 不同類型記憶體分配 (網路記憶體、核心記憶體等) 的統一計帳
- 非立即資源變更 (例如頁面快取寫回) 的計帳
某些 Kubernetes 功能專門使用 cgroup v2 來增強資源管理和隔離。例如,MemoryQoS 功能改進了記憶體 QoS,並依賴 cgroup v2 原語。
使用 cgroup v2
使用 cgroup v2 的建議方式是使用預設啟用和使用 cgroup v2 的 Linux 發行版本。
要檢查您的發行版本是否使用 cgroup v2,請參閱 識別 Linux 節點上的 cgroup 版本。
需求
cgroup v2 具有以下需求
- OS 發行版本啟用 cgroup v2
- Linux 核心版本為 5.8 或更高版本
- 容器執行期支援 cgroup v2。例如
- containerd v1.4 及更高版本
- cri-o v1.20 及更高版本
- kubelet 和容器執行期已配置為使用 systemd cgroup 驅動程式
Linux 發行版本 cgroup v2 支援
如需使用 cgroup v2 的 Linux 發行版本列表,請參閱 cgroup v2 文件
- Container Optimized OS (自 M97 起)
- Ubuntu (自 21.10 起,建議 22.04+)
- Debian GNU/Linux (自 Debian 11 bullseye 起)
- Fedora (自 31 起)
- Arch Linux (自 2021 年 4 月起)
- RHEL 和 RHEL 類似的發行版本 (自 9 起)
若要檢查您的發行版本是否正在使用 cgroup v2,請參閱您的發行版本文件,或按照 在 Linux 節點上識別 cgroup 版本 中的指示操作。
您也可以透過修改核心 cmdline 啟動引數,在您的 Linux 發行版本上手動啟用 cgroup v2。如果您的發行版本使用 GRUB,則應在 /etc/default/grub
下的 GRUB_CMDLINE_LINUX
中新增 systemd.unified_cgroup_hierarchy=1
,然後執行 sudo update-grub
。但是,建議的方法是使用預設已啟用 cgroup v2 的發行版本。
遷移至 cgroup v2
若要遷移至 cgroup v2,請確保您符合需求,然後升級到預設啟用 cgroup v2 的核心版本。
kubelet 會自動偵測到作業系統正在 cgroup v2 上執行,並據此執行,無需額外配置。
切換到 cgroup v2 時,使用者體驗不應有任何明顯差異,除非使用者直接存取節點上或容器內的 cgroup 檔案系統。
cgroup v2 使用與 cgroup v1 不同的 API,因此如果有任何直接存取 cgroup 檔案系統的應用程式,則需要將它們更新到支援 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 及更高版本
- 如果您正在使用 uber-go/automaxprocs 套件,請確保您使用的版本為 v1.5.1 或更高版本。
在 Linux 節點上識別 cgroup 版本
cgroup 版本取決於正在使用的 Linux 發行版本以及在作業系統上配置的預設 cgroup 版本。若要檢查您的發行版本使用哪個 cgroup 版本,請在節點上執行 stat -fc %T /sys/fs/cgroup/
命令
stat -fc %T /sys/fs/cgroup/
對於 cgroup v2,輸出為 cgroup2fs
。
對於 cgroup v1,輸出為 tmpfs.
下一步
- 深入瞭解 cgroups
- 深入瞭解 容器執行期
- 深入瞭解 cgroup 驅動程式