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 版本从引入到稳定的完整演进路径,以及各版本之间的关键变化节点:
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 版本不兼容导致的资源无法管理问题。