1. 课程导论:容器运行时容量调优的重要性、CRI与kubelet交互的定位、课程目标与学习路径
1.1 为什么需要关注容器运行时容量调优?
在 Kubernetes 生产环境中,容器运行时(Container Runtime)是承载 Pod 生命周期最底层的执行引擎。它负责从镜像拉取、容器创建到进程隔离的全过程。然而,大多数运维人员往往只关注 kubelet 与 API Server 的控制面交互,却忽略了运行时层在CPU、内存、磁盘、PID 等资源维度上的实际消耗与限制。
当集群规模增长或工作负载密度升高时,运行时层的资源瓶颈会直接导致:
- Pod 启动延迟:容器运行时在创建沙箱、挂载文件系统时消耗过多 CPU 或 I/O。
- 节点资源碎片化:运行时自身占用的内存、磁盘空间未被 kubelet 纳入可分配资源计算。
- OOM 与 PID 耗尽:运行时进程(如 containerd-shim、runc init)未受 cgroup 约束,导致节点级故障。
- 镜像存储膨胀:运行时层未及时清理临时层与挂载点,造成磁盘容量泄漏。
核心观点: 容器运行时容量调优不是“锦上添花”,而是保障节点稳定性与 Pod 调度准确性的必要手段。kubelet 与 CRI(Container Runtime Interface)之间的资源交互机制,是理解一切调优的起点。
1.2 CRI 与 kubelet 交互的定位
CRI(Container Runtime Interface)是 kubelet 与容器运行时之间的标准 gRPC 协议接口。它定义了 kubelet 如何向运行时下发 PodSandbox、Container 的创建/删除/状态查询等操作,以及运行时如何向 kubelet 上报资源使用情况。
下图展示了 kubelet、CRI 与容器运行时之间的核心交互层次:
在资源容量调优的语境下,CRI 接口中以下两个服务最为关键:
| CRI 服务 | 关键 RPC | 与容量调优的关系 |
|---|---|---|
| RuntimeService | RunPodSandbox, CreateContainer, Status, ListContainers | 控制 Pod/Container 生命周期,涉及 cgroup 路径创建、资源上限写入 |
| ImageService | PullImage, ListImages, ImageStatus, RemoveImage | 管理镜像存储与缓存,影响节点磁盘容量与拉取延迟 |
调优切入点: kubelet 通过 CRI 获取的
ContainerStats 和 PodSandboxStats 是节点资源画像的基础数据源。如果运行时层上报的数据不准确或缺失,kubelet 的驱逐(Eviction)与调度决策将出现偏差。
1.3 课程目标
本课程旨在帮助学员建立从kubelet 资源管理 → CRI 协议交互 → 运行时内部实现 → 内核资源约束的完整知识链路。完成本课程后,学员将能够:
- 理解 kubelet 资源计算模型:Node Allocatable、Capacity、Eviction Threshold 的推导逻辑。
- 掌握 CRI 资源相关 RPC 的调用链:从 Pod 创建到 cgroup 写入的完整路径。
- 诊断运行时层资源泄漏:识别 containerd/CRI-O 的 shim 进程、挂载点、镜像层带来的隐性开销。
- 实施容量调优策略:包括运行时预留资源、镜像 GC 参数、并发限制、cgroup 层级优化。
- 编写自定义资源监控与告警规则:基于 CRI 指标暴露的 Prometheus 端点。
1.4 学习路径与章节规划
课程共分为 6 个模块,按从原理到实践的递进关系组织:
| 模块 | 章节范围 | 核心内容 |
|---|---|---|
| 模块一:基础篇 | 第 1–5 章 | CRI 协议详解、kubelet 资源管理模型、运行时架构概览 |
| 模块二:资源交互篇 | 第 6–12 章 | CPU/Memory/磁盘/PID 的 CRI 交互流程、cgroup 写入机制 |
| 模块三:容量计算篇 | 第 13–18 章 | Node Allocatable 推导、运行时预留、Eviction 阈值调优 |
| 模块四:诊断与监控篇 | 第 19–23 章 | 运行时指标暴露、pprof 分析、资源泄漏排查工具 |
| 模块五:实战调优篇 | 第 24–28 章 | containerd/CRI-O 参数调优、镜像 GC、并发控制、内核参数 |
| 模块六:总结与展望 | 第 29–30 章 | 典型案例复盘、未来演进(CRI v2、WASM 运行时) |
建议学员按照模块顺序学习,每章结束后完成对应的实验或代码阅读任务。对于有经验的 Kubernetes 管理员,可以直接从模块二或模块四开始,但建议至少通读模块一的 CRI 协议基础,避免后续理解出现断层。
前置要求: 本课程假设学员已具备基本的 Kubernetes 集群管理经验(Pod、Node、kubelet 配置),并熟悉 Linux cgroups 与 namespaces 概念。如果对 cgroups v2 不熟悉,建议先阅读附录中的快速入门材料。