關於 cgroup v2

在 Linux 上,控制組(cgroups)限制分配給程序的資源。

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 來增強資源管理和隔離。例如,記憶體 QoS(MemoryQoS)功能改善了記憶體 QoS,並依賴於 cgroup v2 原語。

使用 cgroup v2

使用 cgroup v2 的推薦方法是使用預設啟用和使用 cgroup v2 的 Linux 發行版。

要檢查你的發行版是否使用 cgroup v2,請參閱識別 Linux 節點上的 cgroup 版本

要求

cgroup v2 有以下要求:

  • 作業系統發行版啟用 cgroup v2
  • Linux 核心版本為 5.8 或更高版本
  • 容器執行時支援 cgroup v2。例如:
  • 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 版本中的說明。

你也可以透過修改核心命令列引導引數,在 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 的版本:
  • 如果你正在使用 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

下一步

上次修改時間:2024 年 4 月 20 日下午 1:13 PST:修復了記憶體 QoS 的錯誤連結 (48a39c77bd)