写好标智库

升级 Kubernetes,不能只核对控制面和组件版本。这份写好标智库技术笔记聚焦一个容易遗漏的前置检查:Linux 节点的 cgroup 模式,以及围绕它的组件兼容性。

先查节点,再升级

cgroup 是 Linux 管理容器 CPU、内存等资源的基础。cgroup v2 采用统一层级和更一致的接口,但迁移不能只看 Kubernetes 版本:

  • v1.25 起:cgroup v2 支持进入稳定阶段。
  • v1.31 起:cgroup v1 支持进入维护模式。
  • v1.35 起:failCgroupV1 默认为 true,cgroup v1 节点上的 kubelet 默认无法启动。

因此,当前运行低于 v1.35 版本的集群,在升级到 v1.35 或更高版本前,应迁移全部 Linux 节点,或明确安排临时设置 failCgroupV1: false。已经运行 v1.35 及以上版本的集群,也需要逐节点确认,不能仅凭集群版本判断迁移是否完成。

failCgroupV1: false 不是长期方案。 这一覆盖配置后续的移除将遵循弃用政策,不应将其当作持续保留 cgroup v1 的保证。

别漏掉 kubeadm 预检

检测到 cgroup v1 时,kubeadm 的处理取决于 kubelet 版本:

kubelet 版本 初始化、加入和升级时的预检行为
v1.35 及以上 报错
更早版本 警告

升级计划需要同时考虑 kubelet 的启动条件和 kubeadm 的预检行为。

节点切换成功,不等于整体适配完成

盘点节点模式之后,还要检查容器运行时、资源采集组件和告警规则是否兼容 cgroup v2,重点核对它们对以下内容的依赖:

  • cgroup 层级结构;
  • 资源控制与读取接口;
  • 指标含义及其在告警规则中的使用方式。

节点能够启动,只能说明部分检查已经通过,不能据此认定监控和告警也已完成适配。

内存驱逐问题需要单独评估

迁移到 cgroup v2 不会自动解决内存驱逐问题。kubelet 仍将 active_file 视为不可回收,I/O 密集型负载可能因页缓存触发内存压力。

对于这类负载,可以在测量实际内存行为后,考虑将内存 requests 与 limits 设置为相等值,而不是把 cgroup 模式切换当作直接修复手段。

不要把 Memory QoS 当作稳定能力

Memory QoS 仅适用于 Linux cgroup v2 节点:它自 v1.22 引入,在 v1.27 更新,到 v1.36 仍为 alpha。

评估升级收益时,需要把“可以使用的实验性能力”与“稳定功能承诺”区分开,不能因为迁移到 v2,就默认新增内存保护能力已经适合按稳定功能依赖。

升级前检查清单

  • [ ] 逐一确认所有 Linux 节点的 cgroup 模式。
  • [ ] 核对目标 kubelet 版本与 failCgroupV1 配置。
  • [ ] 检查 kubeadm 初始化、加入和升级的预检影响。
  • [ ] 如需临时保留 cgroup v1,明确覆盖配置及后续迁移安排。
  • [ ] 确认容器运行时、资源采集组件和告警规则对 v2 的兼容性。
  • [ ] 对 I/O 密集型负载单独测量内存压力与驱逐行为。
  • [ ] 将 Memory QoS 的 alpha 状态纳入功能评估。

核心原则是:把兼容性核查放在升级窗口之前,而不是等 kubelet 启动失败或监控异常后再补做。