--- 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-cn/docs/reference/using-api/#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 版本可替换 Beta 或 Alpha API 版本。 * Beta API 版本可以替换早期的 Beta 和 Alpha API 版本,但 **不可以** 替换正式的 API 版本。 * Alpha API 版本可以替换早期的 Alpha API 版本,但 **不可以** 替换 Beta 或正式的 API 版本。 **规则 #4a:API 生命周期由 API 稳定性级别决定** * GA API 版本可以被标记为已弃用,但不得在 Kubernetes 的主要版本中删除 * Beta API 版本在引入后不超过 9 个月或 3 个次要版本(以较长者为准)将被弃用, 并且在弃用后 9 个月或 3 个次要版本(以较长者为准)不再提供服务 * Alpha API 版本可能会在任何版本中被删除,不另行通知 这确保了 Beta API 支持涵盖了[最多 2 个版本的支持版本偏差](/zh-cn/releases/version-skew-policy/), 并且这些 API 不会在不稳定的 Beta 版本上停滞不前,积累的生产使用数据将在对 Beta API 的支持结束时中断。 {{< note >}} 目前没有删除正式版本 API 的 Kubernetes 主要版本修订计划。 {{< /note >}} {{< 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 组。 大约每隔 4 个月会有一个新的 Kubernetes 版本被发布(每年 3 个版本)。 下面的表格描述了在一系列后续的发布版本中哪些 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 |
|