4、升级窗口定义:什么是升级窗口,窗口内的资源波动特征,以及如何用Prom指标量化窗口状态

4.1 升级窗口的核心概念

升级窗口(Upgrade Window)是指在 Kubernetes 集群版本升级过程中,从第一个节点开始执行升级操作,到最后一个节点完成升级并稳定运行所经历的时间区间。这个窗口不是简单的“开始-结束”时间线,而是一个具有明确资源波动特征和风险边界的可观测区间。

关键认知:升级窗口不是固定时长,而是由集群规模、节点池配置、Pod 调度策略、以及底层资源水位共同决定的动态区间。窗口的“打开”和“关闭”需要由 Prometheus 指标来量化判定。

4.2 窗口内的资源波动特征

在升级窗口内,集群资源会经历三个典型阶段,每个阶段都有独特的指标特征:

阶段 时间范围 资源波动特征 典型 Prom 指标表现
节点排空期 窗口前 10%-20% Pod 驱逐导致目标节点资源释放,但被驱逐 Pod 在剩余节点上引发资源争抢 kube_node_status_condition{condition="Ready"} 波动
container_cpu_usage_seconds_total 在剩余节点上升
节点升级期 窗口中间 60%-70% 节点不可用导致集群总容量下降,Pod 重新调度引发 CPU/Memory 峰值 node_memory_MemAvailable_bytes 下降
kube_pod_status_phase{phase="Pending"} 增加
稳定恢复期 窗口末尾 10%-20% 升级完成节点重新加入集群,Pod 逐步回迁,资源水位回归基线 node_memory_MemAvailable_bytes 回升
kube_pod_status_phase{phase="Running"} 稳定
常见误区:很多团队只关注“节点升级期”的 CPU 和内存指标,忽略了“排空期”的 Pod 驱逐风暴和“恢复期”的流量回切冲击。完整的窗口量化必须覆盖全部三个阶段。

4.3 用 Prom 指标量化窗口状态

要精确量化升级窗口的状态,需要建立一组核心 PromQL 指标来定义窗口的“打开条件”、“进行中状态”和“关闭条件”。

4.3.1 窗口打开条件(Window Open)

当集群中任意节点开始执行排空操作时,窗口打开。量化指标:

# 检测是否有节点进入排空状态(通过 annotation 或 cordon 标记)
# 当返回 > 0 时,窗口打开
count(
  kube_node_spec_unschedulable == 1
  AND ON(node)
  (kube_node_annotation{annotation="upgrade.kubernetes.io/drain"} == "true")
) > 0

4.3.2 窗口进行中状态(Window In-Progress)

窗口进行中需要同时监控三个维度的指标:

  • 容量维度:集群可分配资源总量下降比例
  • 调度维度:Pending Pod 数量变化
  • 稳定性维度:节点 Ready 状态翻转频率
# 容量维度:计算当前可分配 CPU 与基线(升级前 1h 均值)的偏差
(
  sum(kube_node_status_allocatable_cpu_cores)
  -
  avg_over_time(sum(kube_node_status_allocatable_cpu_cores)[1h:1m] offset 1h)
) / avg_over_time(sum(kube_node_status_allocatable_cpu_cores)[1h:1m] offset 1h)

# 调度维度:检测 Pending Pod 是否超过阈值
sum(kube_pod_status_phase{phase="Pending"}) > 5

# 稳定性维度:节点 Ready 状态变化率
rate(kube_node_status_condition{condition="Ready",status="true"}[5m]) < 0.8

4.3.3 窗口关闭条件(Window Close)

窗口关闭需要满足以下全部条件:

  1. 所有节点完成升级并恢复为 Ready=True
  2. 集群可分配资源恢复到基线值的 95% 以上
  3. Pending Pod 数量归零且持续 5 分钟
  4. 节点 Ready 状态变化率稳定在 1.0 附近
# 窗口关闭判定复合 PromQL
(
  count(kube_node_status_condition{condition="Ready",status="true"})
  /
  count(kube_node_status_condition{condition="Ready"})
) == 1
AND
(
  sum(kube_node_status_allocatable_cpu_cores)
  /
  avg_over_time(sum(kube_node_status_allocatable_cpu_cores)[1h:1m] offset 1h)
) > 0.95
AND
sum(kube_pod_status_phase{phase="Pending"}) == 0
实践建议:将上述 PromQL 封装为 upgrade_window_open、upgrade_window_in_progress、upgrade_window_closed 三个 Recording Rule,在 Grafana 中建立升级窗口状态面板,实现窗口状态的实时可视化。

4.4 升级窗口状态机与指标映射

下图展示了升级窗口的完整状态机,以及每个状态对应的 Prom 指标判定逻辑:

升级窗口状态机与 Prom 指标映射 初始态 集群资源基线稳定 窗口打开 节点开始排空 窗口进行中 资源波动期 窗口关闭 资源恢复基线 异常态 资源超限/回滚 排空触发 节点开始升级 资源恢复 > 95% 资源超限 回滚后重试 判定指标: • kube_node_spec_unschedulable • upgrade.kubernetes.io/drain • 排空 annotation 存在 判定指标: • 可分配资源下降 > 5% • Pending Pod > 5 • Ready 变化率 < 0.8 判定指标: • 全部节点 Ready • 资源恢复 > 95% • Pending Pod = 0 持续 5m

4.5 窗口状态量化实践清单

在实际集群升级中,建议按照以下清单配置 Prometheus 告警规则和 Grafana 面板:

窗口状态 Prometheus 告警规则 Grafana 面板类型 阈值建议
窗口打开 upgrade_window_open == 1 状态指示灯(红色) 触发即告警
窗口进行中 upgrade_window_in_progress == 1 时间序列折线图 持续 > 30m 触发 Warning
资源超限 node_memory_MemAvailable_bytes < 0.2 * node_memory_MemTotal_bytes 仪表盘 + 阈值线 低于 20% 触发 Critical
窗口关闭 upgrade_window_closed == 1 状态指示灯(绿色) 触发即恢复