diff --git a/content/zh/docs/reference/using-api/deprecation-policy.md b/content/zh/docs/reference/using-api/deprecation-policy.md new file mode 100644 index 0000000000..a5fa369e96 --- /dev/null +++ b/content/zh/docs/reference/using-api/deprecation-policy.md @@ -0,0 +1,738 @@ +--- +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 | +
+
|
+