启用Kubernetes特权模式后/sys/fs/cgroup/cpuset.cpus丢失问题
Kubernetes特权Pod中cpuset.cpus文件消失问题解析
问题描述
在Kubernetes Pod中启用特权模式后,/sys/fs/cgroup/cpuset.cpus文件消失,具体测试步骤:
- 创建无特权模式的Pod(test.yaml),配置CPU请求与限制均为4核、内存2Gi;
- 进入容器执行
cat /sys/fs/cgroup/cpuset.cpus,可正常返回分配的CPU列表(如44,46,100,102),环境采用cgroupv2文件系统; - 删除原Pod后,添加
securityContext.privileged: true参数创建新Pod; - 再次进入容器执行相同命令,提示
cat: /sys/fs/cgroup/cpuset.cpus: No such file or directory。
环境信息
- Kubernetes版本:1.26.2
- Cgroup驱动:systemd
- Containerd版本:1.6.20
- OS版本:Ubuntu 22.04.2
- 内核:5.15.0-76-generic
原因分析
当Pod启用特权模式时,容器会直接挂载宿主机的完整cgroup根目录,而非Kubernetes为普通Pod创建的独立cgroup子层级:
- 普通Pod的cgroup逻辑:在cgroupv2环境下,Kubernetes会为每个非特权Pod创建独立的cgroup子层级(路径类似
/sys/fs/cgroup/kubepods/...),该层级会继承并应用Pod配置的CPU限制,因此子层级下存在cpuset.cpus文件,记录分配给Pod的CPU核心列表。 - 特权Pod的cgroup逻辑:特权容器会直接使用宿主机的cgroup根目录(
/sys/fs/cgroup),而根cgroup默认不会生成cpuset.cpus文件——因为根cgroup包含宿主机全部CPU资源,无需通过该文件指定可用CPU,系统会直接使用所有核心。 - systemd驱动的影响:当采用systemd作为cgroup驱动时,特权容器的cgroup管理会跳过Kubernetes的资源隔离层,直接复用宿主机的cgroup命名空间,进一步导致容器内无法看到针对该Pod的专属cpuset配置文件。
内容的提问来源于stack exchange,提问作者PJConnol
相关产品推荐
相关产品推荐

