news 2026/4/22 18:46:40

浅谈Kubernetes在systemd cgroup模式下的Slice/Scope组织结构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
浅谈Kubernetes在systemd cgroup模式下的Slice/Scope组织结构

在 Kubernetes 生产环境中,容器资源隔离是否可靠,并不取决于我们写了多少resources.limits,而取决于:

kubelet、container runtime(containerd / runc)和 systemd 是否使用了同一套 cgroup 管理体系

本文通过实际运行的 K8S 节点,结合systemd-cgls实际输出,从工程角度讲解:

  • systemd 下的slice / scope 是什么
  • Kubernetes 的Pod / QoS / Container是如何映射到 cgroup 的
  • 每一层是谁创建的、管什么资源
  • 以及如何在机器上验证集群是否处在“正确状态”

一、背景:为什么要关心 systemd cgroup?

在现代 Linux 发行版(Ubuntu / RHEL / 麒麟 / 欧拉等)中:

  • systemd 是默认的进程管理器
  • cgroup(尤其是 cgroup v2)通常由 systemd 统一管理

Kubernetes 在这些系统上,如果配置正确,会形成一棵结构清晰、可观测且可预测的 cgroup 树,其中:

  • kubelet 负责声明资源模型
  • containerd / runc 负责创建容器进程
  • systemd 负责真正落地 cgroup 层级

如果这三者cgroup 管理方式不一致,则会出现:

  • Pod 启动失败
  • CPU / 内存 的 requests / limits 不生效
  • OOM 行为异常
  • 资源统计混乱

二、slice / scope 到底是什么?

在 systemd 的世界里,所有进程都被放进 cgroup,其中有两种核心cgroup单元:

(1)Slice(.slice

  • 本质是cgroup目录
  • 用于分组
  • 资源限制可以向下继承

例如:

  • kubepods.slice
  • kubepods-burstable.slice

可以理解为:“一组进程的父目录”


(2)Scope(.scope

  • 用于承载一个具体的进程树
  • 生命周期通常由外部程序(如runc)触发

例如:

  • cri-containerd-xxx.scope

可以理解为:“某一个容器实例”

slice = 分组(目录)scope = 具体对象(容器 / 进程)


三、Kubernetes 在 systemd 下的标准 cgroup 树结构

当满足以下条件时:

  • kubelet 使用--cgroup-driver=systemd
  • containerd / runc 设置SystemdCgroup = true

Kubernetes 会在 systemd 中形成如下结构:

systemd └── kubepods.slice ├── kubepods-burstable.slice │ └── kubepods-burstable-pod<uid>.slice │ └── cri-containerd-<cid>.scope │ └── container process ├── kubepods-besteffort.slice │ └── ... └── kubepods-pod<uid>.slice (Guaranteed Pod)

四、systemd-cgls 输出解析

systemd-cgls是 Linux 系统中用于以树状结构显示 systemd 控制组(cgroups)层级的命令行工具。它帮助用户直观地查看当前系统中由systemd 管理的 cgroup 层级结构,包括服务、用户会话、容器等资源分组情况。

当在K8S节点上执行:

systemd-cgls

得到(节选):

kubepods.slice ├─kubepods-podxxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx.slice │ └─cri-containerd-xxxxxxxxxxx....scope │ ├─362594 ./bin/xxxxservice_daemon │ ├─663693 xxx_backend │ └─664542 xxx_backend ├─kubepods-burstable.slice │ └─kubepods-burstable-podxxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx.slice │ └─cri-containerd-xxxxxxxxxx....scope │ └─xxx_backend └─kubepods-besteffort.slice └─kubepods-besteffort-podxxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx.slice └─cri-containerd-xxxxxxxxxx....scope └─node_exporter

关键点

  • 一 Pod 一个 slice
  • 一容器一个 scope
  • QoS(Guaranteed / Burstable / BestEffort)体现在slice 层级

五、逐层拆解:每一层是谁创建的?管什么?

(1)kubepods.slice—— Kubernetes 的 cgroup 总入口

  • 创建者:kubelet(通过 systemd D-Bus 接口)

  • 含义

    “这个节点上,所有 Kubernetes Pod 的 cgroup,都必须在这里”

  • 作用

    • 统一统计节点 Pod 资源
    • systemd 层面的集中管理

一般不建议在这一层施加资源限制。


(2)kubepods-burstable / besteffort.slice—— QoS 分组层

Kubernetes 会根据 Pod 的资源配置自动分类:

QoS判定条件
Guaranteedrequests == limits(CPU/内存)
Burstablerequests < limits
BestEffort没有 requests / limits

对应的 systemd 分组:

  • kubepods-guaranteed.slice(有些版本直接显示在根下)
  • kubepods-burstable.slice
  • kubepods-besteffort.slice

这一步是K8S QoS 策略真正落地的地方,OOM 优先级、资源竞争顺序,都与此有关。


(3)kubepods-pod<uid>.slice—— 单个 Pod 的 cgroup

  • 一 Pod 一 slice
  • <uid>是 Pod UID(systemd 中-被转义成_
  • 这是 Pod 级资源控制的核心层

作用包括:

  • Pod 级 CPU / memory 限制
  • Pod 级资源统计
  • Pod 内多个容器的“共同父 cgroup”

Pod 本质是一组容器,所以必须有这一层。


(4)cri-containerd-xxx.scope—— 单个容器实例

  • 创建者:containerd / runc(通过 systemd)
  • 一容器一 scope
  • scope 里包含:
    • 容器主进程
    • 容器内 fork 出来的所有子进程

例如,服务容器中:

cri-containerd-xxx.scope ├─xxxservice_daemon ├─xxx_backend ├─xxx_backend

多进程并不意味着多个容器,而是同一容器内的进程树。


六、Guaranteed Pod 的验证

在 systemd 中,这个 Pod 直接挂在kubepods.slice下:

kubepods-podxxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx.slice

我们进一步通过 Kubernetes API 验证:

kubectl get pod -A\-o custom-columns=NS:.metadata.namespace,NAME:.metadata.name,UID:.metadata.uid,QOS:.status.qosClass\--no-headers\|grepxxxxxxxx(注:对应pod编号的前八位)

输出:

xxx-inference xxx-deployment-... xxxxxxxx(注:对应pod编号的前八位)-... Guaranteed

说明:这是一个 Guaranteed Pod,同时也解释了为什么它不在burstable / besteffort分组下。


七、如何在任何节点上验证集群是否“健康”

1️⃣ 查看 cgroup 树是否是 slice / scope 结构

systemd-cgls|grepkubepods -n

2️⃣ 确认 runtime 是否启用 systemd cgroup

containerd config dump|grepSystemdCgroup

应为:

SystemdCgroup = true

3️⃣ 确认 kubelet 使用 systemd

ps-ef|grepkubelet

我们会看到类似:

/usr/bin/kubelet\--config=/var/lib/kubelet/config.yaml

然后,

cat/var/lib/kubelet/config.yaml|grep-i cgroup

看到cgroupDriver: systemd


八、结论

Kubernetes 的资源模型从根本上讲是 systemd + cgroup 真正跑出来的

如果我们在 systemd-cgls 中看到:

  • 清晰的kubepods.slice
  • QoS 分组 slice
  • Pod slice
  • Container scope

那么我们可以确定:

✅ 资源隔离可信
✅ QoS 生效
✅ OOM / throttling 行为可预期

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:29:04

Proteus中模拟变频器控制过程:一文说清

在Proteus中“造”一台变频器&#xff1a;从SPWM到H桥的完整仿真实战你有没有过这样的经历&#xff1f;想搞懂变频器是怎么调速电机的&#xff0c;翻遍资料却总被一堆公式和波形图绕晕&#xff1b;想动手搭个电路验证&#xff0c;结果一接线就炸MOS管&#xff0c;电源冒烟、芯片…

作者头像 李华
网站建设 2026/4/17 20:34:53

GLM-4.6V-Flash-WEB实测体验:中文图文理解能力太强了

GLM-4.6V-Flash-WEB实测体验&#xff1a;中文图文理解能力太强了 1. 引言&#xff1a;多模态大模型的中文理解新高度 在当前AI技术快速演进的背景下&#xff0c;视觉语言模型&#xff08;Vision-Language Model, VLM&#xff09;正逐步成为智能交互系统的核心组件。从图文问答…

作者头像 李华
网站建设 2026/4/17 16:52:24

Ventoy终极教程:一U盘启动所有系统的完整指南

Ventoy终极教程&#xff1a;一U盘启动所有系统的完整指南 【免费下载链接】Ventoy 一种新的可启动USB解决方案。 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 厌倦了为每个系统单独制作启动盘&#xff1f;Ventoy彻底改变了这一传统模式&#xff01;这款开…

作者头像 李华
网站建设 2026/4/23 11:28:12

麦橘超然Flux实测体验:float8量化让AI绘画更轻量

麦橘超然Flux实测体验&#xff1a;float8量化让AI绘画更轻量 1. 麦橘超然 - Flux 离线图像生成控制台 在当前AI绘画技术快速发展的背景下&#xff0c;高显存需求成为制约本地部署高质量文生图模型的主要瓶颈。尤其对于使用消费级GPU的开发者和创作者而言&#xff0c;如何在有…

作者头像 李华
网站建设 2026/3/28 15:52:43

Qwen3-Reranker-4B详解:支持100+语言的底层原理

Qwen3-Reranker-4B详解&#xff1a;支持100语言的底层原理 1. 技术背景与核心挑战 在现代信息检索系统中&#xff0c;尤其是在大规模多语言环境下&#xff0c;如何从海量候选文档中精准排序并返回最相关的结果&#xff0c;是搜索引擎、推荐系统和问答系统面临的核心挑战。传统…

作者头像 李华
网站建设 2026/4/23 11:36:42

Wan2.2视频大模型:MoE技术驱动电影级创作革命

Wan2.2视频大模型&#xff1a;MoE技术驱动电影级创作革命 【免费下载链接】Wan2.2-T2V-A14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-T2V-A14B 导语&#xff1a;Wan2.2视频大模型通过创新的混合专家&#xff08;MoE&#xff09;架构和增强训练数据…

作者头像 李华