4. Kubernetes 版本升级路径:跨版本升级的API兼容性矩阵

Kubernetes 社区遵循 N-2 支持策略(即仅维护最近三个次要版本),但实际生产集群往往存在多个大版本跨越。跨版本升级时,API 资源的增删改、废弃(Deprecated)与移除(Removed)是导致工作负载中断的首要风险。本节构建跨版本 API 兼容性矩阵,帮助运维人员精准识别升级路径中的依赖断裂点。

4.1 版本跳跃与 API 生命周期阶段

Kubernetes API 版本遵循 Alpha → Beta → Stable → Deprecated → Removed 的生命周期。跨版本升级时,必须检查每个 API 资源在源版本与目标版本之间的状态变化。

API 版本阶段 默认启用 跨版本兼容性 升级风险等级
v1 (Stable) 是 GA 后保持向后兼容 低
v1beta1 / v1beta2 是(部分版本需 feature gate) 可能在下个版本移除或升级为 v1 中
v1alpha1 否(需显式开启 feature gate) 不保证兼容,随时可能删除 高
Deprecated(已废弃) 是(但标记废弃) 当前版本仍可用,后续版本移除 高
Removed(已移除) 否 完全不可用,必须迁移 致命
⚠️ 关键原则: 跨版本升级时,不能跳过次要版本(例如 1.20 → 1.23 必须经过 1.21、1.22)。但即使逐版本升级,每个中间版本都可能废弃或移除 API。必须逐版本检查 kubectl convert 与 kubectl api-resources --cached 的输出差异。

4.2 跨版本 API 兼容性矩阵(1.20 → 1.28)

以下矩阵展示从 Kubernetes 1.20 到 1.28 之间,常见 API 资源在每次升级时的状态变化。矩阵行代表 API 资源(含版本),列代表升级目标版本;单元格标记该资源在目标版本中的状态。

API 资源(版本) 1.20 → 1.21 1.21 → 1.22 1.22 → 1.23 1.23 → 1.24 1.24 → 1.25 1.25 → 1.26 1.26 → 1.27 1.27 → 1.28
Deployment (apps/v1) ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable
Ingress (networking.k8s.io/v1beta1) ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — — — —
Ingress (networking.k8s.io/v1) ✅ 可用 ✅ 可用 ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable
PodSecurityPolicy (policy/v1beta1) ✅ 可用 ✅ 可用 ⚠️ Deprecated ⚠️ Deprecated ❌ Removed — — —
HorizontalPodAutoscaler (autoscaling/v2beta2) ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — — — —
HorizontalPodAutoscaler (autoscaling/v2) ✅ 可用 ✅ 可用 ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable
CronJob (batch/v1beta1) ✅ 可用 ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — — —
CronJob (batch/v1) ✅ 可用 ✅ 可用 ✅ 可用 ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable
EndpointSlice (discovery.k8s.io/v1beta1) ✅ 可用 ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — — —
EndpointSlice (discovery.k8s.io/v1) ✅ 可用 ✅ 可用 ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable
FlowSchema (flowcontrol.apiserver.k8s.io/v1beta1) — ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — — —
FlowSchema (flowcontrol.apiserver.k8s.io/v1beta2) — — ✅ 可用 ✅ 可用 ⚠️ Deprecated ❌ Removed — —
FlowSchema (flowcontrol.apiserver.k8s.io/v1beta3) — — — ✅ 可用 ✅ 可用 ✅ Stable ✅ Stable ✅ Stable
💡 解读方法: 如果集群当前使用 networking.k8s.io/v1beta1 的 Ingress,在升级到 1.22 之前必须迁移到 networking.k8s.io/v1。同理,policy/v1beta1 的 PodSecurityPolicy 在 1.25 被彻底移除,需提前迁移到 Pod Security Admission 或 OPA/Gatekeeper。

4.3 跨版本升级 API 依赖分析流程

在节点池巡检中,针对跨版本升级的 API 依赖分析应遵循以下步骤:

  1. 枚举当前集群 API 资源使用清单:
    kubectl api-resources --verbs=list --namespaced -o name | sort > current_apis.txt
    kubectl get --raw /openapi/v2 | jq '.paths | keys' > current_api_paths.json
  2. 获取目标版本的 API 可用清单:
    # 使用 kubectl convert 或模拟集群
    kubectl api-resources --cached --api-version=1.28 -o name | sort > target_apis.txt
  3. 对比差异,标记废弃/移除项:
    diff current_apis.txt target_apis.txt | grep '^<' | awk '{print $2}' > removed_apis.txt
  4. 检查每个废弃/移除 API 的实际使用对象:
    for api in $(cat removed_apis.txt); do
      kubectl get $api --all-namespaces -o name 2>/dev/null
    done > affected_resources.txt
  5. 生成迁移计划:对每个受影响资源,确定目标版本中的替代 API 版本,并执行 kubectl convert 或手动修改 YAML。

4.4 跨版本升级 API 兼容性决策流程图

下图展示从源版本到目标版本的 API 兼容性检查与迁移决策路径:

跨版本升级 API 兼容性决策流程图 跨版本升级 API 兼容性决策流程图 开始升级检查 枚举当前集群 API 资源清单 获取目标版本 API 可用清单 存在废弃/ 移除 API? 否 直接升级 无阻断风险 是 标记受影响资源清单 检查目标版本替代 API 执行 API 迁移(kubectl convert)

4.5 节点池巡检中的 API 兼容性检查清单

在节点池巡检场景中,针对每个节点池的 API 依赖,应逐项检查以下内容:

  • 节点池内所有工作负载的 API 版本:通过 kubectl get --all-namespaces -o yaml 导出并解析 apiVersion 字段。
  • 废弃 API 使用统计:使用 kubectl get apiservice 查看已注册的 API 服务,结合 kubectl get --raw /apis 获取完整 API 组版本列表。
  • 自定义资源定义(CRD)兼容性:检查 CRD 的 spec.versions 中是否包含即将废弃的版本,以及是否已提供 storage: true 的稳定版本。
  • Webhook 与 Admission 插件:确认 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 引用的 API 版本在目标集群中仍然存在。
  • Helm Chart 与 Operator:检查 Helm Chart 的 apiVersion 字段(v1 或 v2),以及 Operator 管理的 CRD 版本是否与目标集群兼容。
📋 巡检自动化脚本片段:
#!/bin/bash
# 检查当前集群中所有使用废弃 API 的资源
UPGRADE_TARGET="1.28"
CURRENT_VERSION=$(kubectl version --short | grep Server | awk '{print $3}')

echo "=== 当前版本: $CURRENT_VERSION → 目标版本: $UPGRADE_TARGET ==="

# 获取所有 API 资源及其版本
kubectl api-resources --verbs=list -o name | while read resource; do
  # 检查每个资源是否在目标版本中可用
  if ! kubectl api-resources --cached --api-version=$UPGRADE_TARGET | grep -q "$resource"; then
    echo "⚠️  废弃资源: $resource"
    kubectl get $resource --all-namespaces -o name 2>/dev/null | head -5
  fi
done

4.6 常见跨版本升级阻断场景

场景 源版本 目标版本 阻断原因 解决方案
Ingress v1beta1 未迁移 1.21 1.22 networking.k8s.io/v1beta1 在 1.22 被移除 迁移到 networking.k8s.io/v1
PodSecurityPolicy 未替换 1.24 1.25 policy/v1beta1 在 1.25 被移除 迁移到 Pod Security Admission
CronJob v1beta1 未更新 1.24 1.25 batch/v1beta1 在 1.25 被移除 迁移到 batch/v1
FlowSchema v1beta1 未升级 1.25 1.26 flowcontrol.apiserver.k8s.io/v1beta2 在 1.26 被移除 迁移到 v1beta3 或 v1
自定义控制器使用废弃 API 1.23 1.24 控制器硬编码 v1beta1 版本 更新控制器代码或使用版本转换
⚠️ 特别提醒: 即使 API 在目标版本中标记为 Deprecated 而非 Removed,也建议在升级前完成迁移。因为 Deprecated API 可能在下一个补丁版本中突然移除(如安全漏洞导致),且集群升级后可能无法回退。节点池巡检应强制要求:不允许任何 Deprecated API 存在于即将升级的节点池中。

4.7 跨版本升级 API 兼容性矩阵可视化

以下 SVG 图展示从 Kubernetes 1.20 到 1.28 的 API 版本演进路径,突出显示每个版本中废弃(黄色)与移除(红色)的 API 资源:

Kubernetes 1.20 → 1.28 API 版本演进路径 Kubernetes 1.20 → 1.28 API 版本演进路径 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 Ingress v1beta1 废弃 PodSecurityPolicy 废弃 HPA v2beta2 废弃 CronJob v1beta1 废弃 FlowSchema v1beta1 废弃 Ingress v1beta1 移除 PSP / HPA v2beta2 移除 CronJob v1beta1 移除 图例 稳定版本 废弃版本 移除版本

4.8 升级路径推荐策略

基于上述兼容性矩阵,针对不同源版本到目标版本的升级路径,推荐以下策略:

源版本 目标版本 推荐中间版本 关键检查点 预计迁移工作量
1.20 1.28 1.21 → 1.22 → 1.23 → 1.24 → 1.25 → 1.26 → 1.27 1.22(Ingress v1beta1 移除)、1.25(PSP 移除) 高(需逐版本迁移)
1.22 1.28 1.23 → 1.24 → 1.25 → 1.26 → 1.27 1.25(PSP、CronJob v1beta1 移除) 中
1.24 1.28 1.25 → 1.26 → 1.27 1.25(PSP、CronJob v1beta1 移除)、1.26(FlowSchema v1beta2 移除) 中低
1.26 1.28 1.27 1.27(FlowSchema v1beta3 稳定化) 低
💡 最佳实践: 在节点池巡检中,建议为