1. 课程导论:K8s集群升级的背景与挑战、升级窗口概念、Pod调度与资源预留的重要性

1.1 为什么需要关注集群升级?

Kubernetes 版本迭代速度极快,社区通常每 3 个月发布一个次要版本。企业生产集群若长期停留在旧版本,将面临安全漏洞无法修复、API 特性被废弃、无法使用新调度与弹性能力等风险。然而,升级操作本身是集群生命周期中最容易引发故障的环节之一。

核心矛盾: 版本演进的安全性与新特性收益 vs. 升级过程中业务 Pod 中断、资源争抢、调度失败的风险。

1.2 升级过程中的三大挑战

挑战维度 典型问题 影响范围
控制面抖动 API Server 滚动重启、etcd 领导者选举、Controller Manager 重复调度 API 请求超时、资源创建/更新失败
节点排水阻塞 PDB 配置不合理、Pod 长时间 Terminating、Local Storage 无法迁移 节点无法完成升级,集群卡在中间状态
资源预留失效 升级窗口内突发 Pod 调度到剩余节点,导致 CPU/Memory 过载 Pod OOMKill、节点 NotReady、级联故障

1.3 升级窗口概念

升级窗口(Upgrade Window)是指集群中允许执行节点升级操作的时间段与资源约束策略。它不是简单的“定时任务”,而是一套包含以下要素的管控机制:

  • 时间窗口: 业务低峰期(如凌晨 2:00-5:00),减少对在线服务的影响。
  • 并发窗口: 同时允许升级的最大节点数(如 maxUnavailable=1 或 10%)。
  • 资源窗口: 升级期间剩余节点必须能承载被排水 Pod 的调度请求。
  • 回滚窗口: 节点升级后观察期(如 15 分钟),失败则自动回滚。
最佳实践: 升级窗口应结合集群的 Pod 资源请求(Requests)与节点容量,提前计算“安全排水水位线”,而非仅依赖时间。

1.4 Pod 调度与资源预留的重要性

在升级窗口内,节点逐台被封锁(cordon)并排水(drain),其上的 Pod 会被重新调度到剩余节点。如果剩余节点的可分配资源不足以容纳这些 Pod,就会发生调度失败、Pending 堆积甚至节点过载。资源预留(Resource Reservation)正是为了解决这一矛盾:

  • 系统预留: kubelet 为操作系统守护进程(sshd、systemd)预留的 CPU/Memory。
  • K8s 预留: kubelet 为 kubelet 自身及系统组件预留的资源。
  • 驱逐阈值: 节点压力驱逐时保留的硬性资源余量。
  • 升级缓冲区: 在升级窗口内,额外保留 10%-20% 的节点资源作为调度缓冲。
升级窗口 Pod 调度与资源预留关系图 升级前集群 Node-1 (Ready) Node-2 (Ready) Node-3 (Ready) 资源利用率 65% 升级窗口 升级中 Node-1 (Cordoned) Node-2 (Draining) Node-3 (Ready) 资源利用率 85% 调度决策 资源预留 系统预留 5% K8s 预留 5% 驱逐阈值 10% 升级缓冲 10% 调度结果 Pod 成功调度 → 集群稳定 | Pod Pending/OOMKill → 升级失败 关键结论 升级窗口内,资源预留不足是导致 Pod 调度失败的首要原因。 提前计算“安全排水水位线”可避免 90% 以上的升级中断问题。

1.5 课程目标与学习路径

本课程将围绕以下核心能力展开:

  1. 理解升级窗口的完整生命周期: 从窗口规划、节点排水、Pod 重调度到窗口关闭与验证。
  2. 掌握资源预留的配置与验证方法: kubelet 参数、Node Allocatable、Eviction Thresholds。
  3. 实战测试 Pod 调度行为: 在升级窗口内模拟资源争抢、PDB 阻塞、优先级抢占等场景。
  4. 构建自动化升级流水线: 结合 Cluster API、Karpenter、Descheduler 实现安全升级。
前置要求: 建议学员已具备 K8s 集群搭建基础、熟悉 kubectl drain/cordon/uncordon 命令、了解 Pod 资源 Requests/Limits 概念。本课程所有测试均在非生产环境进行。