番禺响应式网站开发,简述搜索引擎的工作原理,广州市建设企业网站报价,巩义建设网站以下是 Kubernetes 中 cgroups#xff08;Control Groups#xff09; 的详细解析#xff0c;涵盖其核心原理、在 Kubernetes 中的具体应用及实践操作#xff1a;
一、cgroups 基础概念
1. 是什么#xff1f; cgroups 是 Linux 内核提供的 资源隔离与控制机制#xff0c…以下是 Kubernetes 中 cgroupsControl Groups 的详细解析涵盖其核心原理、在 Kubernetes 中的具体应用及实践操作
一、cgroups 基础概念
1. 是什么 cgroups 是 Linux 内核提供的 资源隔离与控制机制用于限制、统计和监控进程组如容器的资源使用。 可管理的资源类型 CPU分配核心数、时间片权重 内存限制最大使用量、Swap 控制 I/O磁盘和网络带宽限制 进程数防止 fork bomb 设备访问限制特定设备使用
2. 核心组件
组件功能Hierarchy树状层级结构每个层级绑定一个或多个子系统如 CPU、MemorySubsystem资源控制器如 cpu、memory、blkio负责具体资源管理Cgroup层级中的节点包含一组进程及其资源限制规则Task进程线程属于某个 cgroup资源受其规则约束
3. cgroup v1 vs v2
特性cgroup v1cgroup v2层级结构多层级每个子系统独立单一层级统一管理所有子系统资源分配模型分散控制统一权重分配如 cpu.weight内存控制memory.limit_in_bytesmemory.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 Requestscpucpu.shares权重CPU Limitscpucpu.cfs_period_us cpu.cfs_quota_usMemory Limitsmemorymemory.limit_in_bytesv1或 memory.maxv2HugePageshugetlbhugetlb.size.limit_in_bytesEphemeral Storageblkio部分通过 XFS 配额或 blkio.throttle 控制
3. cgroup 路径结构
容器 cgroup 路径示例v1
# 查看容器进程的 cgroup
$ cat /proc/PID/cgroup# 示例输出
12:memory:/kubepods/burstable/podUID/容器ID
3:cpu,cpuacct:/kubepods/burstable/podUID/容器IDKubernetes 层级命名规则
/kubepods/[QoS-Class]/podPod-UID/Container-ID QoS Classburstable弹性、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所有容器设置 limitsrequests高优先级cpu.shares 根据 requests 分配内存不足时最后被 OOMKillBurstable至少一个容器设置 requestslimits 或未设置 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-driversystemd
2. 设置 cgroup 根目录
调整 kubelet 参数
--cgroup-root/custom-cgroup
3. Reserved Resources
为系统进程预留资源避免容器占用全部资源
# kubelet 配置
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:cpu: 500mmemory: 1Gi
六、常见问题排查
1. 容器被 OOMKilled 检查点 kubectl describe pod pod-name | grep -i OOM
kubectl get events --field-selectorreasonOOMKilled 解决调整 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 文件系统。