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% 的节点资源作为调度缓冲。
1.5 课程目标与学习路径
本课程将围绕以下核心能力展开:
- 理解升级窗口的完整生命周期: 从窗口规划、节点排水、Pod 重调度到窗口关闭与验证。
- 掌握资源预留的配置与验证方法: kubelet 参数、Node Allocatable、Eviction Thresholds。
- 实战测试 Pod 调度行为: 在升级窗口内模拟资源争抢、PDB 阻塞、优先级抢占等场景。
- 构建自动化升级流水线: 结合 Cluster API、Karpenter、Descheduler 实现安全升级。
前置要求: 建议学员已具备 K8s 集群搭建基础、熟悉 kubectl drain/cordon/uncordon 命令、了解 Pod 资源 Requests/Limits 概念。本课程所有测试均在非生产环境进行。