分析 K8s CSI 控制器如何调度并保障 K8s CNI网络插件工作原理的持久化数据一致性流程
2026/6/2 8:41:08
内核版本 cgroup v2 支持情况 ───────────────────────────────── 3.10 ❌ 完全没有支持(2013年发布) 3.15 ⚠️ 开始原型开发 4.3 ✅ 实验性支持(2015年底) 4.5 ✅ 主要功能基本完成 4.6+ ✅ 生产环境可用 5.0+ ✅ 默认启用(systemd 226+)# CentOS 7 默认内核版本uname-r# 输出示例:3.10.0-1160.el7.x86_64# 检查内核配置grepCGROUP /boot/config-$(uname-r)# 查看内核是否包含 cgroup v2 支持# 在内核 3.10 中应该全部是 CONFIG_CGROUP=y 而不是 CONFIG_CGROUP2grep-E"CGROUP|CGROUP2"/boot/config-$(uname-r)# 典型 3.10 内核输出:CONFIG_CGROUPS=yCONFIG_CGROUP_DEBUG=yCONFIG_CGROUP_FREEZER=yCONFIG_CGROUP_DEVICE=yCONFIG_CGROUP_CPUACCT=yCONFIG_CGROUP_SCHED=yCONFIG_BLK_CGROUP=y# ❌ 没有 CONFIG_CGROUP2 选项# 查看当前挂载的 cgroupmount|grepcgroup# 在 CentOS 7 (3.10) 中的典型输出:# cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)# cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)# cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)# cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)# cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)# cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)# cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)# cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)# cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)# cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)# 注意:所有都是 type cgroup (v1),没有 cgroup2# 尝试挂载 cgroup v2(会失败)mount-t cgroup2 cgroup2 /tmp/test_cgroup22>&1# 输出:mount: unknown filesystem type 'cgroup2'# 检查 /proc/filesystems 是否包含 cgroup2grepcgroup2 /proc/filesystems# 在 3.10 中不会有输出# 特点:# 1. 多层级结构(每个子系统独立)# 2. 通过挂载点管理# 3. 功能分散在不同目录# 查看 cgroup v1 结构ls-la /sys/fs/cgroup/# 典型结构:# /sys/fs/cgroup/# ├── systemd/ # systemd 管理的 cgroup# ├── cpu,cpuacct/ # CPU 相关控制# ├── memory/ # 内存控制# ├── cpuset/ # CPU 集绑定# ├── blkio/ # 块 I/O 控制# ├── devices/ # 设备访问控制# ├── freezer/ # 进程冻结# ├── net_cls,net_prio/ # 网络控制# └── ...# 特点:# 1. 统一层级结构# 2. 所有控制器在一个挂载点# 3. 更简洁的API# 在支持 v2 的系统上查看mount-t cgroup2# 输出:cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)# 使用 systemd 的资源控制(基于 cgroup v1)systemctl show<service>|grep-i memory systemctl show<service>|grep-i cpu# 为服务设置内存限制(实际使用 cgroup v1)# /etc/systemd/system/myapp.service[Service]MemoryLimit=1GCPUQuota=50%# 创建带资源限制的临时进程systemd-run --unit=test-app\--slice=test.slice\--property=MemoryLimit=500M\--property=CPUQuota=30%\/path/to/app# 查看创建的 cgroupsystemd-cgls /test.slice# 监控资源使用systemd-cgtop /test.slice# CentOS 8 使用内核 4.18+,支持 cgroup v2# 但需要手动启用grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"# 添加 ELRepo 仓库rpm--import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm-Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm# 安装主线内核yum --enablerepo=elrepo-kernelinstallkernel-ml# 重启到新内核#!/bin/bash# check-cgroup-version.shecho"=== CGroup 版本检查 ==="echo"内核版本:$(uname-r)"echo"发行版:$(cat/etc/redhat-release2>/dev/null||cat/etc/os-release|grepPRETTY_NAME)"echo-e"\n1. 检查内核编译选项:"ifgrep-q"CONFIG_CGROUP2=y"/boot/config-$(uname-r)2>/dev/null;thenecho"✅ 内核支持 cgroup v2"elseecho"❌ 内核不支持 cgroup v2"fiecho-e"\n2. 检查已挂载的 cgroup:"ifmount|grep-q"type cgroup2";thenecho"✅ 已挂载 cgroup v2"mount|grep"type cgroup2"elseecho"📌 仅挂载 cgroup v1"mount|grep"type cgroup"|head-5fiecho-e"\n3. 检查 systemd 版本:"systemctl --version|head-1SD_VERSION=$(systemctl --version|head-1|awk'{print $2}')if[$SD_VERSION-ge226];thenecho"✅ systemd 版本支持 unified cgroup hierarchy"elseecho"📌 systemd 版本较低"fiecho-e"\n4. 检查 cgroup 控制器:"if[-d /sys/fs/cgroup/unified];thenecho"发现 unified cgroup 目录"ls/sys/fs/cgroup/unified/elseecho"只有传统的 cgroup v1 目录"ls/sys/fs/cgroup/|head-10fiecho-e"\n5. 检查进程的 cgroup 信息:"echo"当前进程 cgroup:"cat/proc/self/cgroup#!/bin/bash# cgroup-compatible-check.sh# 检查 cgroup 版本并执行相应操作detect_cgroup_version(){if[-e /sys/fs/cgroup/cgroup.controllers];thenecho"v2"elseecho"v1"fi}CGROUP_VERSION=$(detect_cgroup_version)case$CGROUP_VERSIONinv1)# cgroup v1 路径MEMORY_PATH="/sys/fs/cgroup/memory"CPU_PATH="/sys/fs/cgroup/cpu,cpuacct";;v2)# cgroup v2 路径CGROUP_ROOT="/sys/fs/cgroup";;*)echo"Unknown cgroup version"exit1;;esacecho"检测到 cgroup$CGROUP_VERSION"# 在 CentOS 7 上优化 cgroup v1 使用# 1. 合理组织 cgroup 结构# 2. 使用 systemd 管理服务资源# 3. 监控 cgroup 内存和CPU使用# 4. 考虑逐步迁移到支持 cgroup v2 的平台如果必须使用 cgroup v2 的新功能(如 cgroup 命名空间、改进的内存控制等),建议升级到更新的内核版本或操作系统版本。