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
容量规划提示: 控制面升级窗口内,建议将 API Server 的 --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 升级流程关系图

下图展示了集群升级过程中,控制面升级、节点升级、工作负载迁移与滚动更新之间的时序与依赖关系。

K8s 集群升级流程关系图 控制面升级 API / Scheduler / Controller 节点升级 Drain → 升级 → Uncordon 工作负载迁移 PDB 控制驱逐速率 先升级 触发迁移 滚动更新策略(工作负载版本升级) maxUnavailable / maxSurge 控制资源消耗 可能同时发生 双重资源消耗风险 节点 drain 释放 Pod + 滚动更新创建新 Pod → 集群资源压力峰值 容量规划输出 预留资源比例 / 并发升级数 / PDB 阈值 升级窗口容量规划 需同时考虑节点与工作负载

2.6 升级阶段资源消耗对比

不同升级阶段对集群资源的影响差异显著。下表总结了各阶段的关键资源消耗特征,用于指导容量预留计算。

阶段 CPU 消耗 Memory 消耗 网络带宽 API Server 压力
控制面升级 低(控制面组件重启) 低 低 高(客户端重试)
节点 drain 中(Pod 驱逐与重新调度) 中 高(镜像拉取) 中
节点升级 低(节点重启) 低 低 低
工作负载迁移 高(新 Pod 启动与业务初始化) 高 高 中
滚动更新 高(新旧 Pod 共存) 高 中 中
核心结论: 节点 drain 与滚动更新是资源消耗最高的两个阶段。当两者叠加时,集群需要额外预留 30%-50% 的缓冲资源,否则可能导致 Pod 调度失败或业务响应延迟。