Linux 中有兩個(gè) cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。
Kubernetes 自 v1.25 起 cgroup2 特性正式 stable.
cgroup v2 有哪些優(yōu)勢
cgroup v2 提供了一個(gè)具有增強(qiáng)資源管理能力的統(tǒng)一控制系統(tǒng)。
cgroup v2 對(duì) cgroup v1 進(jìn)行了多項(xiàng)改進(jìn),例如:
?API 中單個(gè)統(tǒng)一的層次結(jié)構(gòu)設(shè)計(jì)
?更安全的子樹委派給容器
?更新的功能特性, 例如壓力阻塞信息(Pressure Stall Information,PSI)[1]
?跨多個(gè)資源的增強(qiáng)資源分配管理和隔離
?統(tǒng)一核算不同類型的內(nèi)存分配(網(wǎng)絡(luò)內(nèi)存、內(nèi)核內(nèi)存等)
?考慮非即時(shí)資源變化,例如頁面緩存回寫
一些 Kubernetes 特性專門使用 cgroup v2 來增強(qiáng)資源管理和隔離。例如,MemoryQoS[2] 特性改進(jìn)了內(nèi)存 QoS 并依賴于 cgroup v2 原語。
使用 cgroup v2 前提
cgroup v2 具有以下要求:
?操作系統(tǒng)發(fā)行版啟用 cgroup v2
?Ubuntu(從 21.10 開始,推薦 22.04+)
?Debian GNU/Linux(從 Debian 11 Bullseye 開始)
?Fedora(從 31 開始)
?RHEL 和類似 RHEL 的發(fā)行版(從 9 開始)
?…
?Linux 內(nèi)核為 5.8 或更高版本
?容器運(yùn)行時(shí)支持 cgroup v2。例如:
?containerd[3] v1.4 和更高版本
?cri-o[4] v1.20 和更高版本
?kubelet 和容器運(yùn)行時(shí)被配置為使用 systemd cgroup 驅(qū)動(dòng)[5]
使用 cgroup v2
這里以 Debian 11 Bullseye + containerd v1.4 為例.
啟用并檢查 Linux 節(jié)點(diǎn)的 cgroup v2
Debian 11 Bullseye 默認(rèn)已啟用 cgroup v2.
可以通過如下命令驗(yàn)證:
stat-fc%T/sys/fs/cgroup/
?對(duì)于 cgroup v2,輸出為 cgroup2fs。
?對(duì)于 cgroup v1,輸出為 tmpfs。
如果沒有啟用, 可以通過在 /etc/default/grub 下的 GRUB_CMDLINE_LINUX 中添加 systemd.unified_cgroup_hierarchy=1, 然后執(zhí)行 sudo update-grub
Notes: 如果是樹莓派, 標(biāo)準(zhǔn) Raspberry Pi OS 安裝時(shí)不會(huì)啟用 cgroups。需要 cgroups 來啟動(dòng) systemd 服務(wù)。可以通過將 cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=1 附加到 /boot/cmdline.txt 來啟用 cgroups。并重啟生效
kubelet 使用 systemd cgroup 驅(qū)動(dòng)
kubeadm 支持在執(zhí)行 kubeadm init 時(shí),傳遞一個(gè) KubeletConfiguration 結(jié)構(gòu)體。KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驅(qū)動(dòng)。
說明:在版本 1.22 中,如果用戶沒有在 KubeletConfiguration 中設(shè)置 cgroupDriver 字段, kubeadm init 會(huì)將它設(shè)置為默認(rèn)值 systemd。
這是一個(gè)最小化的示例,其中顯式的配置了此字段:
#kubeadm-config.yaml kind:ClusterConfiguration apiVersion:kubeadm.k8s.io/v1beta3 kubernetesVersion:v1.21.0 --- kind:KubeletConfiguration apiVersion:kubelet.config.k8s.io/v1beta1 cgroupDriver:systemd
這樣一個(gè)配置文件就可以傳遞給 kubeadm 命令了:
kubeadminit--configkubeadm-config.yaml
說明:
Kubeadm 對(duì)集群所有的節(jié)點(diǎn),使用相同的 KubeletConfiguration。KubeletConfiguration 存放于 kube-system 命名空間下的某個(gè) ConfigMap[6] 對(duì)象中。
執(zhí)行 init、join 和 upgrade 等子命令會(huì)促使 kubeadm 將 KubeletConfiguration 寫入到文件 /var/lib/kubelet/config.yaml 中, 繼而把它傳遞給本地節(jié)點(diǎn)的 kubelet。
containerd 使用 systemd cgroup 驅(qū)動(dòng)
編輯 /etc/containerd/config.toml:
[plugins.cri.containerd.runtimes.runc.options] SystemdCgroup=true
升級(jí)監(jiān)控組件以支持 cgroup v2 監(jiān)控
Reference:
cgroup v2 使用一個(gè)與 cgroup v1 不同的 API,因此如果有任何應(yīng)用直接訪問cgroup 文件系統(tǒng), 則需要將這些應(yīng)用更新為支持 cgroup v2 的版本。例如:
? 一些第三方監(jiān)控和安全代理可能依賴于 cgroup 文件系統(tǒng)。你要將這些代理更新到支持 > cgroup v2 的版本。
? 如果以獨(dú)立的 DaemonSet 的形式運(yùn)行 cAdvisor[7] 以監(jiān)控 Pod 和容器, 需將其更> 新到 v0.43.0 或更高版本。
? 如果你使用 JDK,推薦使用 JDK 11.0.16 及更高版本或 JDK 15 及更高版本, 以便> 完全支持 cgroup v2[8]。
完成
總結(jié)
Kubernetes 自 v1.25 起 cgroup2 特性正式 stable. cgroup2 相比 cgroup v1 有以下優(yōu)勢:
? API 中單個(gè)統(tǒng)一的層次結(jié)構(gòu)設(shè)計(jì)
? 更安全的子樹委派給容器
? 更新的功能特性, 例如壓力阻塞信息(Pressure Stall Information,PSI)[9]
? 跨多個(gè)資源的增強(qiáng)資源分配管理和隔離
? 統(tǒng)一核算不同類型的內(nèi)存分配(網(wǎng)絡(luò)內(nèi)存、內(nèi)核內(nèi)存等)
? 考慮非即時(shí)資源變化,例如頁面緩存回寫
推薦在使用 Kubernetes v1.25及以上版本時(shí), 使用支持 cgroup v2 的linux 和 CRI. 并啟用 Kubernetes 的cgroup v2 功能.
-
Linux
+關(guān)注
關(guān)注
87文章
11203瀏覽量
208697 -
kubernetes
+關(guān)注
關(guān)注
0文章
223瀏覽量
8682
原文標(biāo)題:如何在 Kubernetes 中快速啟用 Cgroup V2 支持
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論