3. Deployment API版本变迁:从extensions/v1beta1到apps/v1的完整历史

Kubernetes Deployment API 经历了从 extensions/v1beta1 到 apps/v1 的漫长演进过程。理解这一变迁历史,对于集群升级时的兼容性适配至关重要。不同版本的 API 在字段结构、默认行为、校验规则上存在显著差异,直接影响到存量 Deployment 配置的迁移策略。

3.1 版本演进时间线与里程碑

下表梳理了 Deployment API 从引入到稳定的关键版本节点及其核心变化:

API 版本 Kubernetes 版本 状态 核心变化与里程碑
extensions/v1beta1 v1.2 – v1.5 Alpha → Beta Deployment 首次引入,作为 extensions 组下的 beta 资源;支持基本的滚动更新与回滚
apps/v1beta1 v1.6 – v1.8 Beta 从 extensions 组迁移至 apps 组;新增 spec.progressDeadlineSeconds、spec.revisionHistoryLimit 等字段
apps/v1beta2 v1.8 – v1.9 Beta 引入 spec.selector 必须匹配 spec.template.metadata.labels 的强校验;spec.rollbackTo 字段被标记为废弃
apps/v1 v1.9+ GA / Stable Deployment API 正式稳定;spec.rollbackTo 被彻底移除;spec.progressDeadlineSeconds 成为标准字段
extensions/v1beta1 废弃 v1.16 废弃 extensions/v1beta1 中的 Deployment 被正式移除,集群不再提供该版本的 API 服务
关键时间节点: 如果你的集群版本低于 v1.16,extensions/v1beta1 仍然可用;但自 v1.16 起,所有 Deployment 必须使用 apps/v1。升级前务必完成 API 版本的迁移。

3.2 核心字段差异对比

不同 API 版本之间,Deployment 的字段结构存在以下关键差异:

字段路径 extensions/v1beta1 apps/v1beta1 apps/v1beta2 apps/v1
spec.selector 可选(optional) 可选 必填(required) 必填
spec.rollbackTo 支持 支持 废弃(deprecated) 已移除
spec.progressDeadlineSeconds 不支持 新增 支持 支持
spec.revisionHistoryLimit 默认 10 默认 10 默认 10 默认 10
spec.strategy.rollingUpdate.maxSurge 默认 1 默认 25% 默认 25% 默认 25%
spec.strategy.rollingUpdate.maxUnavailable 默认 1 默认 25% 默认 25% 默认 25%
⚠ 默认值变更风险: 从 extensions/v1beta1 迁移到 apps/v1 时,maxSurge 和 maxUnavailable 的默认值从整数 1 变为百分比 25%。对于大规模 Deployment,这一变化可能导致滚动更新期间出现远超预期的 Pod 数量波动。建议在迁移时显式设置这两个字段。

3.3 版本变迁架构图

下图展示了 Deployment API 版本从引入到稳定的完整演进路径,以及各版本之间的关键变化节点:

Deployment API 版本演进路径 extensions/v1beta1 v1.2 – v1.5 apps/v1beta1 v1.6 – v1.8 apps/v1beta2 v1.8 – v1.9 apps/v1 (GA) v1.9+ 关键变化说明: • extensions/v1beta1 → apps/v1beta1:API 组迁移,新增 progressDeadlineSeconds 字段 • apps/v1beta1 → apps/v1beta2:selector 变为必填,rollbackTo 被废弃 • apps/v1beta2 → apps/v1:rollbackTo 被彻底移除,滚动更新默认值从整数变为百分比 • v1.16+:extensions/v1beta1 中的 Deployment 被正式移除,不再提供服务

3.4 废弃与移除时间线

Kubernetes 社区遵循严格的 API 废弃策略。Deployment 相关 API 的废弃与移除时间线如下:

  • v1.8:apps/v1beta1 和 apps/v1beta2 被标记为废弃,但功能仍可用。
  • v1.9:apps/v1 达到 GA 状态,成为推荐版本;extensions/v1beta1 中的 Deployment 开始进入废弃倒计时。
  • v1.13:extensions/v1beta1 中的 Deployment 被正式标记为废弃,不再接收新功能。
  • v1.16:extensions/v1beta1 中的 Deployment 被彻底移除,集群 API Server 不再提供该版本的端点。
  • v1.20:apps/v1beta1 和 apps/v1beta2 被移除,仅保留 apps/v1。
迁移窗口: 从 v1.9 到 v1.16 之间有 7 个 minor 版本的过渡期,建议在此期间完成所有 Deployment 配置从 extensions/v1beta1 到 apps/v1 的迁移。不要等到废弃版本被移除时才进行适配。

3.5 迁移示例:从 extensions/v1beta1 到 apps/v1

以下是一个典型的 Deployment 配置迁移示例,展示字段结构的调整:

# 旧版本:extensions/v1beta1
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
# 新版本:apps/v1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:                    # 新增必填字段
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
迁移要点: 从 extensions/v1beta1 迁移到 apps/v1 时,必须添加 spec.selector 字段,且其 matchLabels 必须与 spec.template.metadata.labels 完全匹配。如果原配置中使用了 spec.rollbackTo,需要改用 kubectl rollout undo 命令替代。

3.6 版本兼容性矩阵

下表总结了不同 Kubernetes 集群版本对 Deployment API 版本的支持情况,帮助你在升级前评估兼容性:

集群版本 extensions/v1beta1 apps/v1beta1 apps/v1beta2 apps/v1
v1.5 及以下 ✅ 可用 ❌ 不支持 ❌ 不支持 ❌ 不支持
v1.6 – v1.7 ✅ 可用 ✅ 可用 ❌ 不支持 ❌ 不支持
v1.8 ✅ 可用 ✅ 可用 ✅ 可用 ❌ 不支持
v1.9 – v1.15 ✅ 可用(废弃) ✅ 可用(废弃) ✅ 可用(废弃) ✅ 可用
v1.16 – v1.19 ❌ 已移除 ✅ 可用(废弃) ✅ 可用(废弃) ✅ 可用
v1.20+ ❌ 已移除 ❌ 已移除 ❌ 已移除 ✅ 唯一可用
⚠ 升级路径建议: 如果你的集群版本低于 v1.16,请优先将 Deployment 的 API 版本升级到 apps/v1,然后再进行集群版本升级。这样可以避免因 API 版本不兼容导致的资源无法管理问题。