如何在Kubernetes中快速启用Cgroup V2支持

linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup api。
kubernetes 自 v1.25 起 cgroup2 特性正式 stable.
cgroup v2 有哪些优势
cgroup v2 提供了一个具有增强资源管理能力的统一控制系统。
cgroup v2 对 cgroup v1 进行了多项改进,例如:
•api 中单个统一的层次结构设计
•更安全的子树委派给容器
•更新的功能特性, 例如压力阻塞信息(pressure stall information,psi)[1]
•跨多个资源的增强资源分配管理和隔离
•统一核算不同类型的内存分配(网络内存、内核内存等)
•考虑非即时资源变化,例如页面缓存回写
一些 kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。例如,memoryqos[2] 特性改进了内存 qos 并依赖于 cgroup v2 原语。
使用 cgroup v2 前提
cgroup v2 具有以下要求:
•操作系统发行版启用 cgroup v2
•ubuntu(从 21.10 开始,推荐 22.04+)
•debian gnu/linux(从 debian 11 bullseye 开始)
•fedora(从 31 开始)
•rhel 和类似 rhel 的发行版(从 9 开始)
•…
•linux 内核为 5.8 或更高版本
•容器运行时支持 cgroup v2。例如:
•containerd[3] v1.4 和更高版本
•cri-o[4] v1.20 和更高版本
•kubelet 和容器运行时被配置为使用 systemd cgroup 驱动[5]
使用 cgroup v2
这里以 debian 11 bullseye + containerd v1.4 为例.
启用并检查 linux 节点的 cgroup v2
debian 11 bullseye 默认已启用 cgroup v2.
可以通过如下命令验证:
stat -fc %t /sys/fs/cgroup/
•对于 cgroup v2,输出为 cgroup2fs。
•对于 cgroup v1,输出为 tmpfs。
如果没有启用, 可以通过在 /etc/default/grub 下的 grub_cmdline_linux 中添加 systemd.unified_cgroup_hierarchy=1, 然后执行 sudo update-grub
notes: 如果是树莓派, 标准 raspberry pi os 安装时不会启用 cgroups。需要 cgroups 来启动 systemd 服务。可以通过将 cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=1 附加到 /boot/cmdline.txt 来启用 cgroups。并重启生效
kubelet 使用 systemd cgroup 驱动
kubeadm 支持在执行 kubeadm init 时,传递一个 kubeletconfiguration 结构体。kubeletconfiguration 包含 cgroupdriver 字段,可用于控制 kubelet 的 cgroup 驱动。
说明:在版本 1.22 中,如果用户没有在 kubeletconfiguration 中设置 cgroupdriver 字段, kubeadm init 会将它设置为默认值 systemd。
这是一个最小化的示例,其中显式的配置了此字段:
# kubeadm-config.yaml kind: clusterconfiguration apiversion: kubeadm.k8s.io/v1beta3 kubernetesversion: v1.21.0 --- kind: kubeletconfiguration apiversion: kubelet.config.k8s.io/v1beta1 cgroupdriver: systemd
这样一个配置文件就可以传递给 kubeadm 命令了:
kubeadm init --config kubeadm-config.yaml
说明:
kubeadm 对集群所有的节点,使用相同的 kubeletconfiguration。kubeletconfiguration 存放于 kube-system 命名空间下的某个 configmap[6] 对象中。
执行 init、join 和 upgrade 等子命令会促使 kubeadm 将 kubeletconfiguration 写入到文件 /var/lib/kubelet/config.yaml 中, 继而把它传递给本地节点的 kubelet。
containerd 使用 systemd cgroup 驱动
编辑 /etc/containerd/config.toml:
[plugins.cri.containerd.runtimes.runc.options]     systemdcgroup = true
升级监控组件以支持 cgroup v2 监控
reference:
cgroup v2 使用一个与 cgroup v1 不同的 api,因此如果有任何应用直接访问cgroup 文件系统, 则需要将这些应用更新为支持 cgroup v2 的版本。例如:
• 一些第三方监控和安全代理可能依赖于 cgroup 文件系统。你要将这些代理更新到支持 > cgroup v2 的版本。
• 如果以独立的 daemonset 的形式运行 cadvisor[7] 以监控 pod 和容器, 需将其更> 新到 v0.43.0 或更高版本。
• 如果你使用 jdk,推荐使用 jdk 11.0.16 及更高版本或 jdk 15 及更高版本, 以便> 完全支持 cgroup v2[8]。
完成
总结
kubernetes 自 v1.25 起 cgroup2 特性正式 stable. cgroup2 相比 cgroup v1 有以下优势:
• api 中单个统一的层次结构设计
• 更安全的子树委派给容器
• 更新的功能特性, 例如压力阻塞信息(pressure stall information,psi)[9]
• 跨多个资源的增强资源分配管理和隔离
• 统一核算不同类型的内存分配(网络内存、内核内存等)
• 考虑非即时资源变化,例如页面缓存回写
推荐在使用 kubernetes v1.25及以上版本时, 使用支持 cgroup v2 的linux 和 cri. 并启用 kubernetes 的cgroup v2 功能.

台达C200系列变频器在雕刻机电主轴的调试过程
魅族参展MWC 2017 新技术与“快”有关
AI如何辅助宫颈癌筛查获
企业快讯 | 志奋领科技荣膺“红帆奖”
宁德时代重要“孙公司”工厂尾气罐发生爆炸
如何在Kubernetes中快速启用Cgroup V2支持
众多企业正在加速8K技术的布局
选择一款高防服务器成为了企业首要的任务
GLPOLY 导热凝胶XK-G30遇上了2018年高交会
OLED迎来爆发期,国内企业面临双重机遇
2023上海全球投资促进大会 | 宝武集团和亮风台现场签约元宇宙重点应用场景
高低温磁场型霍尔效应测试仪技术参考
推进5G网络信息技术和实体经济深度融合的三大措施
基于AVR单片机的万年历程序设计
兆芯与中孚正式达成产品兼容互认证明
电压波形驱动喇叭发音的原理
SpaceX的2020年第一次发射,携带60星链卫星
云服务、OEM 借助 NVIDIA AI让AI训练更上层楼
边缘AI所面临的挑战 边缘计算的显著优势分析
奥拓电子表示已在全世界范围内申请30项Mini LED相关技术专利