2. K8s API 版本演进机制:API组、版本化、废弃策略及生命周期

Kubernetes API 是集群的“控制面语言”,所有资源(包括 Deployment)的创建、更新、查询都通过 API 完成。理解 API 的版本演进机制,是掌握 Deployment 配置在集群升级前后兼容性适配的基础。Kubernetes 通过 API 组(API Group)、版本化(Versioning) 和 废弃策略(Deprecation Policy) 三个核心设计,实现了 API 的平滑演进。

2.1 API 组:资源分类与隔离

Kubernetes 将 API 划分为多个逻辑组,每个组包含一组相关的资源。API 组解决了早期单一路径(/api/v1)下资源膨胀、命名冲突的问题。

  • 核心组(Core Group):路径为 /api/v1,包含 Pod、Service、Node、Namespace 等最基础的资源。
  • 命名组(Named Group):路径为 /apis/<group-name>/<version>,例如 apps/v1、batch/v1、networking.k8s.io/v1。Deployment 属于 apps 组。
关键点:Deployment 在 apps/v1 中稳定下来。早期版本(如 extensions/v1beta1、apps/v1beta1、apps/v1beta2)中的 Deployment 已被废弃。集群升级时,必须确保 Deployment 的 apiVersion 字段指向 apps/v1。

2.2 版本化:Alpha → Beta → GA(Stable)

每个 API 组内的资源会经历三个成熟度阶段。每个阶段对应不同的稳定性、功能完整性和默认启用状态。

阶段 命名约定 默认启用 功能完整性 向后兼容性 生产推荐
Alpha v1alpha1, v1alpha2 否(需 Feature Gate) 不完整,可能有大变更 不保证 不推荐
Beta v1beta1, v1beta2 是 基本完整,经过测试 通常兼容,但可能弃用 谨慎使用
GA / Stable v1 是 完整且稳定 长期保证 强烈推荐
升级陷阱:在集群升级前,必须检查所有 Deployment 的 apiVersion。如果使用了 extensions/v1beta1 或 apps/v1beta1 等已废弃版本,升级后 API Server 将拒绝这些资源,导致 Pod 无法正常调度。

2.3 废弃策略与生命周期

Kubernetes 官方定义了清晰的 API 废弃策略,确保用户有足够时间迁移。核心规则如下:

  • GA 版本:标记为废弃后,至少保留 12 个月或 3 个次要版本(取较长者)。
  • Beta 版本:标记为废弃后,至少保留 9 个月或 3 个次要版本(取较长者)。
  • Alpha 版本:可在任何版本中移除,不提供兼容性保证。

以下表格展示了 Deployment 相关 API 版本的演进与废弃时间线:

API 版本 引入版本 废弃版本 移除版本 状态
extensions/v1beta1 1.2 1.9 1.16 已移除
apps/v1beta1 1.8 1.9 1.16 已移除
apps/v1beta2 1.8 1.9 1.16 已移除
apps/v1 1.9 — — 当前稳定版
实践建议:在集群升级前,使用 kubectl convert 或 kubectl apply --dry-run=server 验证所有 Deployment 的 API 版本兼容性。推荐将所有 Deployment 的 apiVersion 统一为 apps/v1。

2.4 API 版本演进流程示意图

下图展示了 API 版本从 Alpha 到 GA 的演进路径,以及废弃后的移除时间线:

Kubernetes API 版本演进与生命周期 Alpha v1alpha1 / v1alpha2 Beta v1beta1 / v1beta2 GA / Stable v1 可随时移除 无兼容性保证 废弃后保留 ≥9个月 或 ≥3个次要版本 废弃后保留 ≥12个月 或 ≥3个次要版本 早期开发 功能验证 生产就绪

2.5 废弃 API 的检测与迁移

在集群升级前,SRE 必须主动检测并迁移已废弃的 API 版本。以下是推荐的检测步骤:

  1. 使用 kubectl convert 命令:将旧版本资源转换为目标版本。
  2. 使用 kubectl apply --dry-run=server:在服务端验证资源是否被当前 API Server 接受。
  3. 审计集群中的资源:通过 kubectl get --raw 或第三方工具(如 pluto)扫描所有资源。
迁移示例:将 Deployment 从 extensions/v1beta1 迁移到 apps/v1。
# 查看当前 Deployment 的 apiVersion
kubectl get deployment my-deploy -o jsonpath='{.apiVersion}'

# 使用 kubectl convert 转换
kubectl convert -f old-deploy.yaml --output-version apps/v1 > new-deploy.yaml

# 应用新版本
kubectl apply -f new-deploy.yaml

2.6 版本兼容性矩阵

以下表格总结了不同 Kubernetes 版本中 Deployment 可用的 API 版本,帮助你在升级前快速判断兼容性:

K8s 版本 可用 Deployment API 版本 推荐版本
1.8 及更早 extensions/v1beta1, apps/v1beta1, apps/v1beta2 apps/v1beta2
1.9 – 1.15 extensions/v1beta1, apps/v1beta1, apps/v1beta2, apps/v1 apps/v1
1.16 及以上 apps/v1(其他版本已移除) apps/v1
重要提醒:从 Kubernetes 1.16 开始,extensions/v1beta1、apps/v1beta1 和 apps/v1beta2 中的 Deployment 已被完全移除。如果集群版本 ≥ 1.16,必须使用 apps/v1。

2.7 内部存储版本与外部版本

Kubernetes API Server 内部使用一个“存储版本”(Storage Version)来持久化资源。外部版本(External Version)用于客户端与 API Server 的交互。API Server 负责在外部版本和内部版本之间进行转换。

  • 存储版本:通常是 GA 版本(如 apps/v1),所有数据以该版本写入 etcd。
  • 外部版本:客户端可以请求任何支持的版本,API Server 自动转换。

这种设计允许客户端使用旧版本 API 读取资源,即使 etcd 中存储的是新版本格式。但前提是旧版本 API 尚未被移除。

升级影响:当集群升级时,如果存储版本发生变化(例如从 apps/v1beta2 变为 apps/v1),API Server 会自动转换 etcd 中的数据。但客户端必须使用新的外部版本,否则会收到 404 错误。

2.8 总结:API 版本演进对 Deployment 配置的影响

API 版本演进机制直接决定了 Deployment 配置在集群升级前后的兼容性。核心要点如下:

  • 始终使用 apps/v1:这是 Deployment 的 GA 版本,长期稳定且兼容。
  • 升级前审计:检查所有 Deployment 的 apiVersion,确保没有使用已废弃版本。
  • 利用转换工具:使用 kubectl convert 或 kubectl apply --dry-run=server 验证兼容性。
  • 关注废弃时间线:每个版本都有明确的废弃和移除时间,提前规划迁移窗口。