cgroup子系统3_freezer子系统

本文介绍了Linux内核中的Freezer子系统,它主要用于挂起和恢复cgroup内的进程。通过写入特定的状态到控制文件freezer.state,可以实现对进程的冻结与解冻。文章深入解析了Freezer的操作原理和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

freezer子系统用于挂起和恢复cgroup中的进程。freezer有一个控制文件:freezer.state,将FROZEN写入该文件,

可以将cgroup中的进程挂起,将THAWED写入该文件,可以将已挂起的进程恢复。通过遍历cgroup中的进程,对其freeze或者wake_up。

freeze操作通过freeze框架实现,设置进程的TIF_SIGPENDING函数(伪信号),唤醒进程,然后进程在返回用户态时,信号处理入

口get_signal_to_deliver中通过try_to_freeze冻结进程(设置进程为TASK_UNINTERRUPTABLE,然后重调度)

参考博客:

1.freezer子系统

2.linux新内核的freeze框架以及意义


[root@k8s-master01 ~]# kubeadm init --config /root/new.yaml --upload-certs [init] Using Kubernetes version: v1.28.2 [preflight] Running pre-flight checks [preflight] The system verification failed. Printing the output from the verification: KERNEL_VERSION: 5.14.0-284.30.1.el9_2.x86_64 CONFIG_NAMESPACES: enabled CONFIG_NET_NS: enabled CONFIG_PID_NS: enabled CONFIG_IPC_NS: enabled CONFIG_UTS_NS: enabled CONFIG_CGROUPS: enabled CONFIG_CGROUP_CPUACCT: enabled CONFIG_CGROUP_DEVICE: enabled CONFIG_CGROUP_FREEZER: enabled CONFIG_CGROUP_PIDS: enabled CONFIG_CGROUP_SCHED: enabled CONFIG_CPUSETS: enabled CONFIG_MEMCG: enabled CONFIG_INET: enabled CONFIG_EXT4_FS: enabled (as module) CONFIG_PROC_FS: enabled CONFIG_NETFILTER_XT_TARGET_REDIRECT: enabled (as module) CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled (as module) CONFIG_FAIR_GROUP_SCHED: enabled CONFIG_OVERLAY_FS: enabled (as module) CONFIG_AUFS_FS: not set - Required for aufs. CONFIG_BLK_DEV_DM: enabled (as module) CONFIG_CFS_BANDWIDTH: enabled CONFIG_CGROUP_HUGETLB: enabled CONFIG_SECCOMP: enabled CONFIG_SECCOMP_FILTER: enabled OS: Linux CGROUPS_CPU: missing CGROUPS_CPUSET: enabled CGROUPS_DEVICES: enabled CGROUPS_FREEZER: enabled CGROUPS_MEMORY: enabled CGROUPS_PIDS: enabled CGROUPS_HUGETLB: enabled CGROUPS_IO: enabled error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR SystemVerification]: missing required cgroups: cpu [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
03-31
<think>好的,我需要帮助用户解决他们在使用kubeadm初始化Kubernetes集群时遇到的cgroups错误。首先,用户执行的命令是kubeadm init,但系统预检失败,提示缺少cgroups的cpu子系统。错误信息显示CGROUPS_CPU: missing,导致初始化失败。我需要逐步分析可能的原因,并提供解决方法。 首先,了解cgroups的作用。cgroups是Linux内核功能,用于资源管理和隔离。Kubernetes依赖cgroups来管理容器资源。缺少cpu子系统会影响Pod的资源限制。 接下来,检查错误信息中的具体部分。系统验证失败,指出CGROUPS_CPU缺失。其他cgroup子系统如cpuset、devices等都正常。可能的问题在于内核未启用CPU cgroup,或者配置不正确。 常见的可能原因有几个: 1. 内核未启用CPU cgroup支持。需要检查内核编译选项CONFIG_CGROUP_SCHED和CONFIG_CFS_BANDWIDTH是否启用。用户输出的信息中显示CONFIG_CFS_BANDWIDTH: enabled,这可能意味着相关配置已开启,但实际加载的模块可能有问题。 2. cgroup的CPU子系统未正确挂载。检查/proc/mounts或mount命令输出,查看是否有cgroup的cpu挂载点。例如,应该存在类似/sys/fs/cgroup/cpu的目录。 3. 系统使用cgroup v2而Kubernetes尚未完全支持。虽然Kubernetes 1.25+支持cgroup v2,但需要确认配置是否正确,比如设置cgroupDriver为systemd,并确保内核参数systemd.unified_cgroup_hierarchy=0(如果要用cgroup v1)。 接下来,用户需要执行以下步骤进行排查: 首先,检查当前cgroup版本。执行命令stat -fc %T /sys/fs/cgroup/,如果输出cgroup2fs则是v2,tmpfs是v1。或者检查是否存在/sys/fs/cgroup/cpu目录,存在则为v1。 如果系统使用cgroup v2,可能需要启用v1。编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中添加systemd.unified_cgroup_hierarchy=0,然后更新grub并重启。 如果使用cgroup v1,检查是否挂载了cpu子系统。执行mount | grep cgroup,查看是否有cpu的挂载点。如果没有,需要修改/etc/fstab,添加挂载项,并重启或重新挂载。 另外,检查内核模块是否加载。执行lsmod | grep cpu_cgroup,确认相关模块是否存在。如果没有,尝试加载模块:modprobe cpu_cgroup。 还有,确认kubelet的cgroup驱动配置是否正确,通常在kubeadm的配置文件中指定cgroupDriver为systemd或cgroupfs,需与容器运行时一致。 最后,处理步骤总结:检查cgroup版本,确保v1启用;挂载cpu子系统;检查内核模块;配置kubeadm的cgroupDriver。之后重新运行kubeadm init命令,并确认忽略错误参数是否必要,但建议解决根本问题而非忽略。</think>您在执行 `kubeadm init` 初始化 Kubernetes 集群时遇到了系统预检(preflight)错误,具体原因是 **缺少 cgroups 的 CPU 子系统**(`[ERROR SystemVerification]: missing required cgroups: cpu`)。以下是逐步分析和解决方法: --- ### 1. **问题定位** 错误信息显示 `CGROUPS_CPU: missing`,这意味着: - Linux 内核未正确启用 CPU cgroup 支持。 - 系统未正确挂载 CPU cgroup 子系统。 - 可能使用了 cgroup v2 而 Kubernetes 依赖 cgroup v1(需确认版本兼容性)。 --- ### 2. **检查 cgroup 状态** #### (1) 确认 cgroup 版本 运行以下命令查看当前使用的 cgroup 版本: ```bash stat -fc %T /sys/fs/cgroup/ ``` - 输出 `cgroup2fs`:表示使用 **cgroup v2**。 - 输出 `tmpfs`:表示使用 **cgroup v1**。 #### (2) 检查 CPU cgroup 挂载 查看是否挂载了 CPU 子系统: ```bash mount | grep cgroup ``` 如果输出中 **缺少 `cpu` 或 `cpu,cpuacct`**,则说明未正确挂载。 --- ### 3. **解决方法** #### 情况一:系统使用 **cgroup v2**,但 Kubernetes 需要 **cgroup v1** Kubernetes 1.25+ 已支持 cgroup v2,但需确保容器运行时(如 containerd、CRI-O)和 kubelet 配置兼容。若仍需降级到 cgroup v1: 1. 编辑 GRUB 配置文件: ```bash vi /etc/default/grub ``` 2. 在 `GRUB_CMDLINE_LINUX` 中添加参数: ```bash systemd.unified_cgroup_hierarchy=0 ``` 3. 更新 GRUB 并重启: ```bash grub2-mkconfig -o /boot/grub2/grub.cfg reboot ``` #### 情况二:系统使用 **cgroup v1**,但未挂载 CPU 子系统 1. 手动挂载 CPU 子系统(临时生效): ```bash mkdir -p /sys/fs/cgroup/cpu,cpuacct mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct ``` 2. 永久挂载(需修改 `/etc/fstab`): ```bash echo "none /sys/fs/cgroup/cpu,cpuacct cgroup defaults 0 0" >> /etc/fstab mount -a ``` #### 情况三:内核未启用 CPU cgroup 检查内核编译选项: ```bash grep -E "CONFIG_CGROUP_SCHED|CONFIG_CFS_BANDWIDTH" /boot/config-$(uname -r) ``` - 若输出 `CONFIG_CGROUP_SCHED=y` 和 `CONFIG_CFS_BANDWIDTH=y`,说明已启用。 - 若未启用,需升级内核或重新编译内核。 --- ### 4. **验证修复** 重新运行预检命令: ```bash kubeadm init phase preflight --config /root/new.yaml ``` 确认错误 `[ERROR SystemVerification]: missing required cgroups: cpu` 已消失。 --- ### 5. **重新初始化集群** 修复后执行原始命令: ```bash kubeadm init --config /root/new.yaml --upload-certs ``` --- ### 附:关键配置文件建议 在 `new.yaml` 中检查 kubelet 的 cgroup 驱动配置: ```yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock kubeletExtraArgs: cgroup-driver: "systemd" # 确保与容器运行时一致 ``` --- 通过上述步骤,您应能修复缺失 CPU cgroup 的问题并成功初始化集群。如果问题仍然存在,可通过 `kubeadm init --v=5` 查看详细日志进一步排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值