K8S cgroups详解
以下是 Kubernetes 中 cgroups(Control Groups) 的详细解析,涵盖其核心原理、在 Kubernetes 中的具体应用及实践操作:
一、cgroups 基础概念
1. 是什么?
-
cgroups 是 Linux 内核提供的 资源隔离与控制机制,用于限制、统计和监控进程组(如容器)的资源使用。
-
可管理的资源类型:
-
CPU:分配核心数、时间片权重
-
内存:限制最大使用量、Swap 控制
-
I/O:磁盘和网络带宽限制
-
进程数:防止 fork bomb
-
设备访问:限制特定设备使用
-
2. 核心组件
组件 | 功能 |
---|---|
Hierarchy | 树状层级结构,每个层级绑定一个或多个子系统(如 CPU、Memory) |
Subsystem | 资源控制器(如 cpu 、memory 、blkio ),负责具体资源管理 |
Cgroup | 层级中的节点,包含一组进程及其资源限制规则 |
Task | 进程(线程),属于某个 cgroup,资源受其规则约束 |
3. cgroup v1 vs v2
特性 | cgroup v1 | cgroup v2 |
---|---|---|
层级结构 | 多层级,每个子系统独立 | 单一层级,统一管理所有子系统 |
资源分配模型 | 分散控制 | 统一权重分配(如 cpu.weight ) |
内存控制 | memory.limit_in_bytes | memory.max |
兼容性 | 广泛支持 | 需较新内核(≥4.15) |
二、Kubernetes 中的 cgroups 实现
1. 资源模型
Kubernetes 通过 Resource Requests/Limits 定义容器的资源需求,底层由容器运行时(如 containerd、Docker)转换为 cgroup 配置。
resources:requests:cpu: "500m" # 0.5 CPU 核心memory: "1Gi" # 1 GB 内存limits:cpu: "1" # 1 CPU 核心memory: "2Gi" # 内存硬限制
2. 核心子系统映射
Kubernetes 参数 | cgroup 子系统 | 关键文件/参数 |
---|---|---|
CPU Requests | cpu | cpu.shares (权重) |
CPU Limits | cpu | cpu.cfs_period_us + cpu.cfs_quota_us |
Memory Limits | memory | memory.limit_in_bytes (v1)或 memory.max (v2) |
HugePages | hugetlb | hugetlb.<size>.limit_in_bytes |
Ephemeral Storage | blkio (部分) | 通过 XFS 配额或 blkio.throttle 控制 |
3. cgroup 路径结构
容器 cgroup 路径示例(v1):
# 查看容器进程的 cgroup
$ cat /proc/<PID>/cgroup# 示例输出:
12:memory:/kubepods/burstable/pod<UID>/<容器ID>
3:cpu,cpuacct:/kubepods/burstable/pod<UID>/<容器ID>
Kubernetes 层级命名规则:
/kubepods/[QoS-Class]/pod<Pod-UID>/<Container-ID>
-
QoS Class:
burstable
(弹性)、besteffort
(尽力而为)、guaranteed
(保证)
三、实战操作:验证 cgroup 配置
1. 查看容器的 cgroup 限制
进入容器所在节点的 cgroup 目录(以内存为例):
# 查找容器对应的 cgroup 路径
$ CONTAINER_ID=$(docker ps | grep <容器名> | awk '{print $1}')
$ CGROUP_PATH=$(docker inspect $CONTAINER_ID | grep -i cgroup | grep memory | head -1 | cut -d'"' -f4)# 查看内存限制
$ cat /sys/fs/cgroup/memory/$CGROUP_PATH/memory.limit_in_bytes
2147483648 # 2Gi
2. 动态调整 cgroup 参数(调试用)
# 临时修改 CPU 配额(慎用!)
echo 50000 > /sys/fs/cgroup/cpu/$CGROUP_PATH/cpu.cfs_quota_us # 限制为 50ms/100ms 周期
四、Kubernetes 资源 QoS 与 cgroup
1. QoS 等级
QoS 级别 | 条件 | cgroup 表现 |
---|---|---|
Guaranteed | 所有容器设置 limits=requests | 高优先级,cpu.shares 根据 requests 分配,内存不足时最后被 OOMKill |
Burstable | 至少一个容器设置 requests<limits 或未设置 limits | 中等优先级,资源超用时可能被限制或终止 |
BestEffort | 所有容器未设置 requests 和 limits | 最低优先级,资源紧张时优先被终止 |
2. OOM 处理机制
-
当节点内存不足时,OOM Killer 按优先级终止容器:
-
BestEffort
→ 2.Burstable
→ 3.Guaranteed
-
-
查看 OOM 事件:
dmesg | grep -i "oom" journalctl -k | grep -i "oom"
五、高级配置
1. 自定义 cgroup 驱动
Kubernetes 支持两种 cgroup 驱动:
-
cgroupfs:直接写入 cgroup 文件系统(默认)。
-
systemd:通过 systemd 管理 cgroup(需节点使用 systemd)。
配置 kubelet 使用 systemd 驱动:
--cgroup-driver=systemd
2. 设置 cgroup 根目录
调整 kubelet 参数:
--cgroup-root=/custom-cgroup
3. Reserved Resources
为系统进程预留资源,避免容器占用全部资源:
# kubelet 配置
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:cpu: "500m"memory: "1Gi"
六、常见问题排查
1. 容器被 OOMKilled
-
检查点:
kubectl describe pod <pod-name> | grep -i "OOM" kubectl get events --field-selector=reason=OOMKilled
-
解决:调整
spec.containers[].resources.limits.memory
2. CPU 节流(Throttling)
-
检查点:
kubectl top pod --containers cat /sys/fs/cgroup/cpu/$CGROUP_PATH/cpu.stat | grep nr_throttled
-
解决:优化应用 CPU 使用或增加
limits.cpu
总结
-
核心作用:Kubernetes 通过 cgroups 实现容器资源隔离,保障多租户环境稳定性。
-
配置关键:合理设置
requests/limits
,结合 QoS 策略优化资源分配。 -
调试工具:
docker stats
、kubectl top
、直接查看 cgroup 文件系统。
相关文章:
K8S cgroups详解
以下是 Kubernetes 中 cgroups(Control Groups) 的详细解析,涵盖其核心原理、在 Kubernetes 中的具体应用及实践操作: 一、cgroups 基础概念 1. 是什么? cgroups 是 Linux 内核提供的 资源隔离与控制机制,…...

能源设备数据采集
在全球可持续发展目标与环境保护理念日益深入人心的时代背景下,有效管理和优化能源使用已成为企业实现绿色转型、提升竞争力的关键路径。能源设备数据采集系统,作为能源管理的核心技术支撑,通过对各类能源生产设备运行数据的全面收集、深度分…...

Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)
1.protobuf简介 protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的,占用空…...

[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化
文章目录 [Linux性能优化] 线程卡顿优化。0、省流版本一、问题定位:CPU 资源分析二、线程卡顿现场复现线程优化前图片 三、线程卡顿优化方向1.如果是轮询方式2.如果是事件驱动方式 四、修改方式线程优化后图片 [Linux性能优化] 线程卡顿优化。 0、省流版本 如果采…...

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合
一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…...
Java中的策略模式和模板方法模式
文章目录 1. 策略模式(Strategy Pattern)案例:支付方式选择 2. 模板方法模式(Template Method Pattern)案例:制作饮料流程 3. 策略模式 vs 模板方法模式4.总结 在Java中,策略模式和模板方法模式…...

26考研——中央处理器_数据通路的功能和基本结构(5)
408答疑 文章目录 三、数据通路的功能和基本结构数据通路的功能数据通路的组成组合逻辑元件(操作元件)时序逻辑元件(状态元件) 数据通路的基本结构CPU 内部单总线方式CPU 内部多总线方式专用数据通路方式 数据通路的操作举例通用寄…...

区块链大纲笔记
中心化出现的原因是由于网络的形成(不然就孤立了,这显然不符合现实,如,社会,计算机网路),接着由于网络中结点能力一般不对等同时为了便于管理等一系列问题,导致中心化网络的出现。&a…...
IntelliJ IDEA 集成AI编程助手全解析:从Copilot到GPT-4o Mini的实践
目录 AI编程助手的演进与核心价值GitHub Copilot深度集成指南国产新星DeepSeek配置实战GPT-4o Mini低成本接入方案三大助手对比与场景适配企业级安全与本地化部署未来发展趋势与开发者启示1. AI编程助手的演进与核心价值 1.1 技术演进图谱 #mermaid-svg-LwYPrW2Y2Pqvqgf0 {fon…...

浏览器自动化:RPA 解决方案的崛起
1. 引言 在 2025 年,浏览器自动化已成为企业和开发者不可或缺的工具。从网页数据抓取到自动化测试,这项技术不仅提高了效率,还推动了 Web 生态的发展。然而,随着浏览器指纹识别和反机器人检测的进步,传统的本地自动化…...
主流编程语言中ORM工具全解析
在不同编程语言中,ORM(Object-Relational Mapping,对象关系映射)工具的设计目标都是简化数据库操作。 以下是主流语言中最常用的 ORM 工具,按语言分类介绍其特点、适用场景和典型案例。 一、Python 生态 Python 社区…...
《数字分身进化论:React Native与Flutter如何打造沉浸式虚拟形象编辑》
React Native,依托JavaScript语言,借助其成熟的React生态系统,开发者能够快速上手,将前端开发的经验巧妙运用到移动应用开发中。它通过JavaScript桥接机制调用原生组件,实现与iOS和Android系统的深度交互,这…...
React学习———React.memo、useMemo和useCallback
React.memo React.memo是React提供的一个高阶组件,用于优化函数组件的性能,它通过记忆组件的渲染结果,避免在父组件重新渲染时,子组件不必要的重新渲染 React.memo会对组件的props进行浅比较,如果props没有变化&#…...

手机换地方ip地址会变化吗?深入解析
在移动互联网时代,我们经常带着手机穿梭于不同地点,无论是出差旅行还是日常通勤。许多用户都好奇:当手机更换使用地点时,IP地址会随之改变吗?本文将深入解析手机IP地址的变化机制,帮助您全面了解这一常见但…...
【Spring Cloud Gateway】Nacos整合遇坑记:503 Service Unavailable
一、场景重现 最近在公司进行微服务架构升级,将原有的 Spring Cloud Hoxton 版本升级到最新的 2021.x 版本,同时使用 Nacos 作为服务注册中心和配置中心。在完成基础框架搭建后,我使用 Spring Cloud Gateway 作为API 网关,通过 N…...
力扣-49.字母异位词分组
题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String…...
OpenCV光流估计:原理、实现与应用
一、什么是光流? 光流(Optical Flow)是计算机视觉中描述图像序列中像素运动模式的重要概念。它表示图像中物体在连续帧之间的表观运动,是由物体或相机的运动引起的。 光流的基本假设 亮度恒常性:同一物体点在连续帧中的亮度保持不变时间持…...
C语言经典笔试题目分析(持续更新)
1. 描述下面代码中两个static 各自的含义 static void func (void) {static unsigned int i; }static void func(void) 中的 static 作用对象:函数 func。 含义: 限制函数的作用域(链接属性),使其仅在当前源文件&…...

AI工具分享篇 | recraft.ai + figma 复刻技术路线图
recraft 介绍 recraft.ai 主要生成和编辑适合网站、印刷和营销的各种风格的矢量艺术、图标、3d图像和插图。其矢量化功能可将路线图转化为一个矢量图。 recraft 的注册流程非常的简单,邮箱注册即可,无需科学上网,3分钟就能搞定。看不懂英文…...

部署安装jenkins.war(2.508)
实验目的:部署jenkins,并与gitlab关联bulid 所需软件:jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机:8.10具有java环境,内存最少为4G,cpu双核 目录 jdk安装 …...

JS手写代码篇---手写 Object.create
JS手写代码篇 在做手写题的时候,我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路:创造一个对象,类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…...
前端最新面试题及答案 (2025)
前端最新面试题及答案 (2025) JavaScript 核心 1. ES6+ 新特性 问题: 请解释 ES6 中 let/const 与 var 的区别,以及箭头函数的特点。 答案: let/const vs var: 作用域: let/const 是块级作用域,var 是函数作用域 变量提升: var会提升变量,let/const不会(有暂时性死区) 重…...
视频编解码学习十二之Android疑点
一、android.view.SurfaceControl.setDisplaySurface的作用 android.view.SurfaceControl.setDisplaySurface 是 Android 系统中一个 native 层级别的 API,主要用于 设置某个物理显示屏(Display)的输出 Surface,属于 SurfaceFlin…...
绘制时间对应的数据曲线
头文件#pragma once #include "ChartControl.h" #include <vector> #include "DBOperate.h&...
HTTP 请求中 Content-Type 头部
HTTP 请求中 Content-Type 头部可以设置的各种不同的传输格式。multipart/form-data 只是其中一种,主要用于传输包含文件的数据。 以下是一些常见的 HTTP 请求体的 Content-Type 及其用途: 常见的数据传输格式 (Content-Type) 列表: application/json: 描述: 用于传输 JSO…...

spring boot Controller 和 RestController 的区别
spring boot Controller 和 RestController 的区别 5.3.1常用注解 Spring MVC控制器中常使用的注解有如下几种。 Controller Controller 标记在类上。使用Controller 标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类,并检测其中的…...

LeRobot 项目部署运行逻辑(七)—— ACT 在 Mobile ALOHA 训练与部署
全部流程为:硬件配置 -> 环境安装 -> 遥操作数据采集 -> 数据集可视化 -> 策略训练 -> 策略评估 在之前的笔记中已经完成了绝大部分,最后再记录一下最后的训练部署,算是最简单的部分了 目录 1 ACT 训练 2 ALOHA 部署 3 更…...

高频交直流电流测量技术:射频PA与MEMS测试的简单解决方案
随着5G通信和智能传感器技术的快速发展,传统电流测量手段已难以满足现代电子设备的测试需求。最新一代交直流混合测量探头通过突破性的技术创新,正在重新定义射频功率器件和微机电系统的测试标准。 射频功率放大器测试新范式: 在5G基站等高…...

原生微信小程序 textarea组件placeholder无法换行的问题解决办法
【问题描述】 微信小程序原生代码,使用文本域,placeholder使用\n 没有效果,网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客,找到解决办法,CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...

网络协议分析 实验二 IP分片与IPv6
文章目录 索引及重要内容实验2 IP 高级实验实验2.1 IPv4协议分片实验实验2.2 IPV6协议实验2.3 ARP初级 索引及重要内容 实验2 IP 高级实验 实验2.1 IPv4协议分片实验 icmp的不可达报文 实验2.2 IPV6协议 实验2.3 ARP初级 arp –a 查看ARP缓存表内容 arp –s IP地址(格式&…...