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 依赖分析应遵循以下步骤:
- 枚举当前集群 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 - 获取目标版本的 API 可用清单:
# 使用 kubectl convert 或模拟集群 kubectl api-resources --cached --api-version=1.28 -o name | sort > target_apis.txt - 对比差异,标记废弃/移除项:
diff current_apis.txt target_apis.txt | grep '^<' | awk '{print $2}' > removed_apis.txt - 检查每个废弃/移除 API 的实际使用对象:
for api in $(cat removed_apis.txt); do kubectl get $api --all-namespaces -o name 2>/dev/null done > affected_resources.txt - 生成迁移计划:对每个受影响资源,确定目标版本中的替代 API 版本,并执行
kubectl convert或手动修改 YAML。
4.4 跨版本升级 API 兼容性决策流程图
下图展示从源版本到目标版本的 API 兼容性检查与迁移决策路径:
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 资源:
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 稳定化) | 低 |
💡 最佳实践: 在节点池巡检中,建议为