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

Docker底层原理:Cgroup V2的使用 若系统没有加载cgroup2文件系统,需要执行下面这条命令。 阅读详情

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

302b9e0e687d7de84134f8ae8a2a06cd.png

什么是 cgroup

📚️Reference:

control groups(控制组),通常被称为cgroup,是Linux内核的一项功能。它允许将进程组织成分层的组,然后限制和监控各种资源的使用。内核的cgroup接口是通过一个叫做cgroupfs的伪文件系统提供的。分组是在核心的cgroup内核代码中实现的,而资源跟踪和限制是在一组每个资源类型的子系统中实现的(内存、CPU等等)。

cgroup 是容器和云原生的底层技术栈. kubelet 和 CRI 都需要对接 cgroup 来强制执行为 Pod 和容器管理资源,即: requests/limits 和 cpu/memory。

Linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。

Kubernetes 自 v1.25 起 cgroup2 特性正式 stable.

cgroup v2 有哪些优势

📚️Reference:

cgroup v2 提供了一个具有增强资源管理能力的统一控制系统。

cgroup v2 对 cgroup v1 进行了多项改进,例如:

•API 中单个统一的层次结构设计•更安全的子树委派给容器•更新的功能特性, 例如压力阻塞信息(Pressure Stall Information,PSI)[1]•跨多个资源的增强资源分配管理和隔离•统一核算不同类型的内存分配(网络内存、内核内存等)•考虑非即时资源变化,例如页面缓存回写

一些 Kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。例如,MemoryQoS[2] 特性改进了内存 QoS 并依赖于 cgroup v2 原语。

使用 cgroup v2 前提

📚️Reference:

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

📝Notes:

这里以 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 功能.

References

[1] 压力阻塞信息(Pressure Stall Information,PSI): https://www.kernel.org/doc/html/latest/accounting/psi.html
[2] MemoryQoS: https://kubernetes.io/blog/2021/11/26/qos-memory-resources/
[3] containerd: https://containerd.io/
[4] cri-o: https://cri-o.io/
[5] systemd cgroup 驱动: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes#systemd-cgroup-driver
[6] ConfigMap: https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap
[7] cAdvisor: https://github.com/google/cadvisor
[8] 完全支持 cgroup v2: https://bugs.openjdk.org/browse/JDK-8230305
[9] 压力阻塞信息(Pressure Stall Information,PSI): https://www.kernel.org/doc/html/latest/accounting/psi.html
[10] 关于 cgroup v2 | Kubernetes: https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups/
[11] 配置 cgroup 驱动 | Kubernetes: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/#configuring-the-kubelet-cgroup-driver
[12] 容器运行时 | Kubernetes: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd-systemd

本文转载自:「东风微鸣技术博客」,原文:https://url.hi-linux.com/pr6Yz,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

b28f368b56d822e7ba8e3d48172f3968.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

a415487355880ff623d40756c2400d12.png

你可能还喜欢

点击下方图片即可阅读

30bfd70bdc1ebf1f4c50a30c7f5ea47e.jpeg

Phantun: 一款突破运营商 QoS 封锁的高性能 UDP 流量伪装工具,支持 WireGuard 协议

c8d5fc12009e8fb760f5e7f91ea8e7b9.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

09ffd258d0d8445f881d63b55f62b5ba.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

Ubuntu 24.04下OpenClaw+K8s部署避坑指南:cgroup v2与containerd适配 Kubernetes(K8s)是声明式容器编排的事实标准,其核心依赖于容器运行时(CRI)、cgroup资源隔离机制及systemd等内核级组件协同工作。随着Ubuntu 24.04全面启用cgroup v2并默认采用systemd作为cgroup driver,旧有Docker-centric部署范式已失效——Docker Engine仅适用于镜像构建,而非K8s运行时;真正支撑OpenClaw等Operator级智能体框架的是containerd与精准的cgroup配置。该技术组合保障了AI Agent 阅读详情

相关推荐

K8s v1.35移除cgroup v1,节点迁移cgroup v2实操指南

cgroup(控制组)是Linux内核实现资源隔离与限制的底层机制,容器运行时和编排平台都依赖它进行CPU、内存等资源的精细管控。传统cgroup v1采用多树分散设计,导致资源视图割裂、统计口径不一,成为大规模容器集群管理中的隐患。cgroup v2通过统一层级树整合所有控制器,让资源管理更简洁、一致,并被现代systemd原生支持。随着Kubernetes v1.35彻底移除cgroup v1支持,仍运行在旧版cgroup上的节点将无法启动kubelet,集群升级面临硬性门槛。本文从底层原理出发,解析c

weixin_29295541的博客 276

几个你需要关注的 Kubernetes 迁移 Cgroup V2 注意事项

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !随着Kubernetes 1.25关于cgroup v2 特性的正式发布(GA), kubelet容器资源管理能力得到加强。本文针对K8s迁移cgroup v2做了如下的checklist,主要分为:cgroup v2是什么,对于K8s意味着什么以及如何迁移等相关内容。“简介”Pod资源管理Kubernetes通过...

easylife206的专栏 1667

Docker cgroup 版本切换实战:从 v2 降级到 v1 的完整指南

本文提供了将Docker运行环境从cgroup v2降级到cgroup v1的完整实战指南。针对Kubernetes老版本兼容性等常见问题,详细讲解了通过修改GRUB内核启动参数(如添加systemd.unified_cgroup_hierarchy=0)并执行update-grub命令的核心步骤,涵盖操作前检查、具体实施、重启后验证及生产环境注意事项,帮助解决因cgroup版本不匹配导致的容器资源管理问题。

qqq44的博客 464

k8s--架构基础--cgroup v2

cgroup v2是Linux cgroup API的下一个版本。cgroup v2提供了一个统一的控制系统,具有增强的资源管理能力。单一统一的层次结构设计更安全的子树委派给容器支持新特性,如Pressure Stall Information(压力停顿信息)提供跨多个资源的增强资源分配管理和隔离对不同类型的内存分配(网络内存、内核内存等)进行统一的记账记账非即时资源变化,例如页面缓存写回某些Kubernetes特性专门使用cgroup v2来增强资源管理和隔离。

IT艺术家-rookie的博客 3040

openEuler22.03LTS开启cgroup v2

cgroup 是容器和云原生的底层技术栈. kubelet 和 CRI 都需要对接 cgroup 来强制执行为 Pod 和容器管理资源,即: requests/limits 和 cpu/memory。Linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。Kubernetes 自 v1.25 起 cgroup2 特性正式 stable.cgroup v2 提供了一个具有增强资源管理能力的统一控制系统。

刀刀叨叨 1607

【CGroup原理篇V1】三、CGroup Kernel API介绍

每个内核子系统都希望钩入到通用cgroup系统都需要创建一个cgroup_subsys对象。这里有很多方法,有一些是cgroup机制的回调函数以及相应cgroup机制分配给cgroup子系统的ID。

从0到1,突破自己 915

Kubernetes集群架构-关于 cgroup v2

功能状态:Kubernetes v1.25 [stable]cgroup v2 是 LinuxcgroupAPI 的下一个版本。cgroup v2 提供了一个统一的控制系统,具有增强的资源管理功能。API 中单个统一的层次结构设计更安全的子树委派给容器更新的功能特性, 例如压力阻塞信息(Pressure Stall Information,PSI)跨多个资源的增强资源分配管理和隔离统一核算不同类型的内存分配(网络内存、内核内存等)考虑非即时资源变化,例如页面缓存回写。

qichengzong的博客 1726

云原生之深入解析如何在Kubernetes中快速启用Cgroup V2支持

Kubernetes 自 v1.25 起 cgroup2 特性正式 stable,cgroup2 相比 cgroup v1 有以下优势:API 中单个统一的层次结构设计;更安全的子树委派给容器;更新的功能特性, 例如压力阻塞信息(Pressure Stall Information,PSI);跨多个资源的增强资源分配管理和隔离;统一核算不同类型的内存分配(网络内存、内核内存等);考虑非即时资源变化,例如页面缓存回写。

╰つ栺尖篴夢ゞ 1359

CentOS Linux升级内核kernel方法及启用cgroup v2

本文详细介绍了CentOS 7.9系统内核升级的全过程。首先说明了升级背景,当默认3.10.0内核无法满足Kubernetes等需求时需升级至4.x以上版本。重点内容包括:强烈推荐先升级systemd至234版本以支持cgroupv2;通过rpm方式安装6.9.7新版内核;配置grub2设置默认启动内核;完整的内核版本验证流程。此外还提供了内核回退方法,以及从cgroupv1切换到v2的具体操作步骤,包括模式配置、文件修改和结果验证等。整个过程以root用户操作,确保系统兼容性和稳定性。

zyplanke的专栏 4152

海康威视web控件开发+vue结合做网页开发

需求:vue的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能. 准备:web开发包(包含插件以及demo,在海康官网即可下载32位64位的都有.那些需要积分下载的博主良心不疼么.) 点击这里下载:链接: https://pan.baidu.com/s/12FrbycWyWWyiRJH5Yd1tPA 提取码: gam5 开始开发: 1.安装demo目录下的WebComponentsKit.exe插件(根据自己的浏览器以及系统选择32位还是64位的插件) 2.打.

u013682258的博客 8473

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 453

K8s如何启用cgroup2支持?

什么是 cgroup 📚️Reference: control groups(控制组),通常被称为cgroup,是Linux内核的一项功能。它允许将进程组织成分层的组,然后限制和监控各种资源的使用。 内核的cgroup接口是通过一个叫做cgroupfs的伪文件系统提供的。 分组是在核心的cgroup内核代码中实现的,而资源跟踪和限制是在一组每个资源类型的子系统中实现的(内存、CPU等等)。 cgroup 是容器和云原生的底层技术栈. kubelet 和 CRI 都需要对接 cgroup 来强制执行为 P

east4ming的博客 1367

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 126

k8s kubernetes

(Container Runtime Interface): 容器运行时接口,用来运行容器,k8s通过这个接口去兼容不同的容器,目前主要的CRI有CRI-O和containered,dockershim在k8s的1.24版本后从kubelet中剥离出来,主要由docker维护(不是亲儿子k8s也不会管了):containerd由docker开发,是docker用来操作runc的handler,与docker平级,docker生成的images等资源与containerd生成的images等资源不共享。

六月长安的博客 2694

使用 VPN 访问太理内部网相关问题总结【太原理工大学】

电脑连接 VPN,访问校园内部网相关问题总结,太原理工大学。

m0_52861684的博客 9829

VIIRS-NPP夜间灯光遥感数据下载和预处理

右侧搜索框搜索“按掩膜提取”,提取出夜光影像中国区域。将其转换为Albers积投影和重采样到400m。点击右上角Export,选择shp格式。最后点export导出就行。点击复制按钮,来到这个。,ctrl + v粘贴。将小于0.3的值置为0。下载好月合成产品后,

热爱分享,热爱记录 1万+

cgroup v1 还是 cgroup v2 ?

如你需要进一步确认某个 K8s 节点或容器运行在哪个 cgroup 版本上,也可以提供你的系统版本或。输出,我可以帮你判断。是否需要我帮你写一个一键检测脚本?说明使用的是 cgroup v1,每个子系统单独挂载。说明使用的是统一的 cgroup v2 控制器。你可以通过以下方法快速判断当前系统使用的是。

喝醉酒的小白 1038

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 706

深入解析cgroup v2:从核心改进到实战配置

cgroup v2作为Linux内核资源管理的重大升级,解决了cgroup v1在容器化场景中的核心痛点。相比v1的多层级混乱、隔离性差等问题,v2采用统一层级结构,强化命名空间隔离,提供精细化的CPU/内存/IO控制策略,并增强安全性。本文详细解析了cgroup v1的局限性,系统阐述v2的核心改进,包括与Kubernetes的深度适配、eBPF集成等特性,并给出从内核参数配置到容器运行时集成的完整启用步骤。

专注于系统运维、数据库、DevOps、虚拟化技术、docker、kubernetes、等云原生技术。 1038

OpenCV实现文档扫描OCR识别(基于Python + OpenCV,含完整代码)

在当今数字化时代,文档处理的自动化需求日益增长。文档扫描OCR(Optical Character Recognition,光学字符识别)技术成为了将纸质文档转换为可编辑电子文本的关键手段。通过Python与OpenCV库的结合,我们能够实现高效、准确的文档扫描OCR识别。这一技术在办公自动化、数字图书馆、档案管理等众多领域都有着广泛的应用。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2016

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

官网:www.SZLCSC.COM以芯片为例器件类——>芯片类——>对应芯片确定芯片——>数据手册1:原理图2:PCB3:打开操作流程选中原理图——>文件——>导出——>AD1: ✔2:导出AD文件操作流程选中PCB图——>文件——>导出——>AD1: ✔2:导出AD文件1:PCB图2:原理图操作流程文件——>打开操作流程选中文件——>打开操作流程项目文件——>添加新的...到工程——>Schematic Library新原理图库操作流程项目文件——>添加新的...到工程——>PCB Library新的PC

XU157303764的博客 5426

Kubernetes 1.35 Ubuntu 24.04 部署:cgroup v2 与 containerd 深度配置指南

Kubernetes 是一个用于自动化容器部署、扩展和管理的开源平台,其核心依赖于 Linux 内核的资源隔离机制(如 cgroup)与容器运行时(如 containerd)。随着 Kubernetes 1.35 强制要求 cgroup v2 并弃用 Docker,理解 cgroup v2 的三层验证(挂载、启动参数、运行时结构)和 containerd 的 SystemdCgroup 配置逻辑,已成为部署成功的关键技术前提。该版本不再容忍配置模糊性,而是将复杂性显式暴露在系统层——例如内核模块加载顺序、s

weixin_30654419的博客 521

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

k8s 和容器运行时(Docker)、cgroup

为什么 Kubernetes 不直接使用容器运行时的 cgroup 驱动方式?历史原因:早期运行时多样,默认行为不一,K8s 需要强制统一。架构设计:Kubelet 是资源的主动管理者,而不是被动的消费者。它必须精确控制 cgroup 的布局以实现监控、限制和驱逐等核心功能。它不能将如此关键的责任“外包”给另一个组件。确定性与可靠性:显式配置避免了因底层组件默认值变化而导致的集群不一致和潜在故障。发展趋势。

qq_53349769的博客 2043

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Rook Ceph RBD QoS 配置指南:基于 VolumeAttributesClass 与 cgroup v2 的卷级 IOPS/带宽限速

RBD 块存储的 QoS(Quality of Service)允许管理员为每个 RBD 块卷单独设置 IOPS 与带宽上限,从而在多租户集群中有效抑制"吵闹邻居"(noisy-neighbor)问题,防止单个工作负载占满整个存储集群的 I/O 能力。本文以 Rook Ceph 当前仓库为基准,完整讲解其工作原理、参数含义、全新集群与存量集群的两种启用路径,以及常见故障排查方法,读完即可在自己的

gitblog_00533的博客 610

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

云原生时代下 K8s CGroup/CRI 的优劣势

云原生时代下 K8s CGroup/CRI 的优劣势。

RAB 1267
上一篇: 开源容器安全平台 NeuVector 中文入门指南
下一篇: 五分钟入门 eBPF
运维之美
博客等级 码龄21年 2764粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值