--- title: Kubernetes 弃用策略 content_type: concept weight: 40 --- 本文档详细解释系统中各个层面的弃用策略(Deprecation Policy)。 Kubernetes 是一个组件众多、贡献者人数众多的大系统。 就像很多类似的软件,所提供的功能特性集合会随着时间推移而自然发生变化, 而且有时候某个功能特性可能需要被去除。被去除的可能是一个 API、一个参数标志或者 甚至某整个功能特性。为了避免影响到现有用户,Kubernetes 对于其中渐次移除 的各个方面规定了一种弃用策略并遵从此策略。 ## 弃用 API 的一部分 {#deprecating-parts-of-the-api} 由于 Kubernetes 是一个 API 驱动的系统,API 会随着时间推移而演化,以反映 人们对问题共建的认识的变化。Kubernetes API 实际上是一个 API 集合,其中每个 成员称作“API 组(API Group)”,并且每个 API 组都是独立管理版本的。 [API 版本](/zh/docs/reference/using-api/api-overview/#api-versioning)会有 三类,每类有不同的废弃策略: | 示例 | 分类 | |----------|----------------------------------| | v1 | 正式发布(Generally available,GA,稳定版本) | | v1beta1 | Beta (预发布)| | v1alpha1 | Alpha (试验性) | 给定的 Kubernetes 发布版本中可以支持任意数量的 API 组,且每组可以包含 任意个数的版本。 下面的规则负责指导 API 元素的弃用,具体元素包括: * REST 资源(也即 API 对象) * REST 资源的字段 * REST 资源的注解,包含“beta”类注解但不包含“alpha”类注解 * 枚举值或者常数值 * 组件配置结构 以下是跨正式发布版本时要实施的规则,不适用于对 master 或发布分支上 不同提交之间的变化。 **规则 #1:只能在增加 API 组版本号时删除 API 元素。** 一旦在某个特定 API 组版本中添加了 API 元素,则该元素不可从该版本中删除, 且其行为也不能大幅度地变化,无论属于哪一类(GA、Alpha 或 Beta)。 {{< note >}} 由于历史原因,Kubernetes 中存在两个“单体式(Monolithic)”API 组 - “core”(无组名)和“extensions”。这两个遗留 API 组中的资源会被逐渐迁移到 更为特定领域的 API 组中。 {{< /note >}} **规则 #2:在给定的发布版本中,API 对象必须能够在不同的 API 版本之间来回 转换且不造成信息丢失,除非整个 REST 资源在某些版本中完全不存在。** 例如,一个对象可被用 v1 来写入之后用 v2 来读出并转换为 v1,所得到的 v1 必须 与原来的 v1 对象完全相同。v2 中的表现形式可能与 v1 不同,但系统知道如何 在两个版本之间执行双向转换。 此外,v2 中添加的所有新字段都必须能够转换为 v1 再转换回来。这意味着 v1 必须 添加一个新的等效字段或者将其表现为一个注解。 **规则 #3:给定类别的 API 版本在新的、稳定性未降低的 API 版本发布之前不可被废弃。** 一个正式发布的(GA)API 版本可替换现有的正式 API 版本或 alpha、beta API 版本。 Beta API 版本 *不可以* 替代正式的 API 版本。 **规则 #4a:除了每类 API 版本中的最新版本,旧的 API 版本在其被宣布被废弃之后 至少以下时长内仍需被支持:** * **GA:12 个月或者 3 个发布版本(取其较长者)** * **Beta: 9 个月或者 3 个发布版本(取其较长者)** * **Alpha: 0 个发布版本** 这里也包含了关于[最大支持 2 个发布版本的版本偏差](/zh/docs/setup/release/version-skew-policy/)的约定。 {{< note >}} 在[#52185](https://github.com/kubernetes/kubernetes/issues/52185)被解决之前, 已经被保存到持久性存储中的 API 版本都不可以被去除。 你可以禁止这些版本所对应的 REST 末端(在符合本文中弃用时间线的前提下), 但是 API 服务器必须仍能解析和转换存储中以前写入的数据。 {{< /note >}} **规则 #4b:标记为“preferred(优选的)” API 版本和给定 API 组的 “storage version(存储版本)”在既支持老版本也支持新版本的 Kubernetes 发布 版本出来以前不可以提升其版本号。** 用户必须能够升级到 Kubernetes 新的发行版本,之后再回滚到前一个发行版本,且 整个过程中无需针对新的 API 版本做任何转换,也不允许出现功能损坏的情况, 除非用户显式地使用了仅在较新版本中才存在的功能特性。 就对象的存储表示而言,这一点尤其是不言自明的。 以上所有规则最好通过例子来说明。假定现有 Kubernetes 发行版本为 X,其中引入了 新的 API 组。大约每隔 3 个月会有一个新的 Kubernetes 版本被发布(每年 4 个版本)。 下面的表格描述了在一系列后续的发布版本中哪些 API 版本是受支持的。
发布版本 | API 版本 | 优选/存储版本 | 注释 |
---|---|---|---|
X | v1alpha1 | v1alpha1 | |
X+1 | v1alpha2 | v1alpha2 |
|
X+2 | v1beta1 | v1beta1 |
|
X+3 | v1beta2、v1beta1(已弃用) | v1beta1 |
|
X+4 | v1beta2、v1beta1(已弃用) | v1beta2 | |
X+5 | v1、v1beta1(已弃用)、v1beta2(已弃用) | v1beta2 |
|
X+6 | v1、v1beta2(已弃用) | v1 |
|
X+7 | v1、v1beta2(已弃用) | v1 | |
X+8 | v2alpha1、v1 | v1 |
|
X+9 | v2alpha2、v1 | v1 |
|
X+10 | v2beta1、v1 | v1 |
|
X+11 | v2beta2、v2beta1(已弃用)、v1 | v1 |
|
X+12 | v2、v2beta2(已弃用)、v2beta1(已弃用)、v1(已弃用) | v1 |
|
X+13 | v2、v2beta1(已弃用)、v2beta2(已弃用)、v1(已弃用) | v2 | |
X+14 | v2、v2beta2(已弃用)、v1(已弃用) | v2 |
|
X+15 | v2、v1(已弃用) | v2 |
|
X+16 | v2、v1(已弃用) | v2 | |
X+17 | v2 | v2 |
|