2. K8s集群升级基础概念:控制面升级、节点升级、工作负载迁移、滚动更新策略
K8s集群升级并非单一操作,而是由多个独立但相互依赖的阶段组成。理解每个阶段的目标、风险与操作方式,是制定容量规划的前提。本章将拆解升级过程中的四个核心概念:控制面升级、节点升级、工作负载迁移与滚动更新策略。
2.1 控制面升级(Control Plane Upgrade)
控制面是集群的大脑,包含 kube-apiserver、kube-controller-manager、kube-scheduler 以及 etcd。升级顺序必须严格遵循:先升级控制面组件,再升级节点。控制面升级期间,API Server 可能短暂不可用,但已运行的 Pod 不会中断。
| 组件 | 升级影响 | 容量关注点 |
|---|---|---|
| kube-apiserver | API 请求中断,kubectl 不可用 | 客户端重试队列积压,需预留 API 请求缓冲 |
| kube-controller-manager | 控制器循环暂停,Deployment/StatefulSet 扩缩容延迟 | 工作负载副本数可能短暂偏离期望值 |
| kube-scheduler | 新 Pod 无法调度 | 待调度 Pod 积压,恢复后可能出现调度突发 |
| etcd | 集群状态读写阻塞 | Leader 选举期间写入延迟升高,需监控磁盘 IO |
--max-requests-inflight 和 --max-mutating-requests-inflight 参数临时提升 20%-30%,以应对客户端重试带来的请求洪峰。
2.2 节点升级(Node Upgrade)
节点升级通常采用“逐节点”或“滚动节点”方式。每个节点在升级前需要执行 drain(排空)操作,将节点上的 Pod 优雅驱逐到其他可用节点。节点升级完成后,再执行 uncordon(取消隔离)使其重新加入调度池。
# 节点排空命令示例
kubectl drain node-01 --ignore-daemonsets --delete-emptydir-data
# 节点升级完成后取消隔离
kubectl uncordon node-01
节点升级期间,集群总可用容量会暂时减少。假设集群有 N 个节点,每次升级 1 个节点,则可用节点数为 N-1。如果集群资源利用率已经接近 80%,排空一个节点可能导致剩余节点资源过载。
emptyDir 卷的 Pod,drain 时会强制删除这些 Pod 的数据。务必确认业务是否容忍数据丢失,或提前迁移有状态工作负载。
2.3 工作负载迁移(Workload Migration)
工作负载迁移是指将 Pod 从正在升级的节点上安全地转移到其他节点的过程。K8s 通过 PodDisruptionBudget(PDB) 控制迁移速率,确保业务可用性不受影响。
PDB 定义了一个工作负载在自愿中断(如节点 drain)期间允许的最大不可用 Pod 数量或比例。
# PDB 示例:确保 my-app 至少有 2 个副本可用
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: my-app
迁移过程中,调度器会将新 Pod 分配到剩余节点。如果剩余节点资源不足,Pod 将处于 Pending 状态,直到有节点释放资源或扩容完成。
- 节点资源余量: 每个节点 CPU/Memory 的 allocatable 减去当前 request 后的剩余值。
- PDB 容忍度: 工作负载允许的最大不可用副本数,直接影响迁移速度。
- Pod 启动时间: 从 Pending 到 Ready 的平均耗时,决定迁移窗口长度。
2.4 滚动更新策略(Rolling Update Strategy)
滚动更新是工作负载自身版本升级的机制,与集群节点升级不同。它通过逐步替换旧版本 Pod 为新版本 Pod 来实现零停机发布。滚动更新策略由 Deployment 或 StatefulSet 的 spec.strategy.rollingUpdate 字段控制。
| 参数 | 说明 | 默认值 | 容量影响 |
|---|---|---|---|
| maxUnavailable | 更新过程中允许的最大不可用 Pod 数量(值或百分比) | 25% | 值越大,更新越快,但业务容量下降越多 |
| maxSurge | 更新过程中允许超出期望副本数的最大 Pod 数量(值或百分比) | 25% | 值越大,需要预留的额外资源越多 |
滚动更新与节点升级可能同时发生,形成“双重资源消耗”:节点升级 drain 旧 Pod,同时滚动更新创建新 Pod。如果两者叠加,集群资源压力会急剧上升。
# Deployment 滚动更新策略示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 3
template:
spec:
containers:
- name: web
image: nginx:1.25
2.5 升级流程关系图
下图展示了集群升级过程中,控制面升级、节点升级、工作负载迁移与滚动更新之间的时序与依赖关系。
2.6 升级阶段资源消耗对比
不同升级阶段对集群资源的影响差异显著。下表总结了各阶段的关键资源消耗特征,用于指导容量预留计算。
| 阶段 | CPU 消耗 | Memory 消耗 | 网络带宽 | API Server 压力 |
|---|---|---|---|---|
| 控制面升级 | 低(控制面组件重启) | 低 | 低 | 高(客户端重试) |
| 节点 drain | 中(Pod 驱逐与重新调度) | 中 | 高(镜像拉取) | 中 |
| 节点升级 | 低(节点重启) | 低 | 低 | 低 |
| 工作负载迁移 | 高(新 Pod 启动与业务初始化) | 高 | 高 | 中 |
| 滚动更新 | 高(新旧 Pod 共存) | 高 | 中 | 中 |