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/22 18:45:11

Open Interpreter在数据分析中的实战应用:1.5GB CSV清洗

Open Interpreter在数据分析中的实战应用&#xff1a;1.5GB CSV清洗 随着数据驱动决策成为企业运营的核心&#xff0c;数据分析的效率和灵活性变得至关重要。然而&#xff0c;传统数据分析流程往往依赖于编写大量重复代码、调试环境问题以及对编程技能的高度要求&#xff0c;这…

作者头像 李华
网站建设 2026/4/18 14:36:38

HY-MT1.5-7B+OCR联动方案:云端一站式文档翻译

HY-MT1.5-7BOCR联动方案&#xff1a;云端一站式文档翻译 你是否遇到过这样的问题&#xff1a;手头有一份扫描版的外文PDF&#xff0c;想快速翻译成中文&#xff0c;但流程繁琐——先用OCR工具提取文字&#xff0c;再复制粘贴到翻译软件&#xff0c;结果格式错乱、术语不准、效…

作者头像 李华
网站建设 2026/4/21 2:34:04

Magistral 1.2:24B多模态AI本地部署教程

Magistral 1.2&#xff1a;24B多模态AI本地部署教程 【免费下载链接】Magistral-Small-2509-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Magistral-Small-2509-GGUF 导语&#xff1a;Magistral 1.2多模态大模型正式开放本地部署&#xff0c;通过Unslot…

作者头像 李华
网站建设 2026/4/22 3:48:01

B站学习革命:AI智能总结让你的知识获取效率翻倍

B站学习革命&#xff1a;AI智能总结让你的知识获取效率翻倍 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

作者头像 李华
网站建设 2026/4/13 23:14:45

零基础入门:用Docker快速搭建RexUniNLU服务

零基础入门&#xff1a;用Docker快速搭建RexUniNLU服务 1. 引言 1.1 业务场景描述 在当前自然语言处理&#xff08;NLP&#xff09;应用日益广泛的时代&#xff0c;企业与开发者对高效、多功能、开箱即用的NLP服务需求不断增长。无论是智能客服中的实体识别、舆情分析中的情…

作者头像 李华
网站建设 2026/4/20 20:15:19

智能视频分析革命:如何快速提取B站视频精华内容

智能视频分析革命&#xff1a;如何快速提取B站视频精华内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

作者头像 李华