本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes API 和 1.22 中的功能删除:您需要了解的内容
随着 Kubernetes API 的发展,API 会定期重组或升级。当 API 发展时,它们替换的旧 API 会被弃用,并最终被删除。请参阅 Kubernetes API 删除,以了解有关 Kubernetes 删除 API 策略的更多信息。
我们希望确保您了解一些即将进行的删除。这些是您可以在当前受支持的 Kubernetes 版本中使用的 beta API,并且它们已被弃用。所有这些删除的原因是它们已被更新、稳定的(“GA”)API 取代。
Kubernetes 1.22 计划于 2021 年 8 月发布,它将删除许多已弃用的 API。更新:Kubernetes 1.22:达到新的高峰 提供了有关 v1.22 版本的详细信息。
Kubernetes v1.22 的 API 删除
v1.22 版本将立即停止服务我们下面列出的 API 版本。这些都是先前已被弃用以支持更新、更稳定的 API 版本的 beta API。
ValidatingWebhookConfiguration
和MutatingWebhookConfiguration
API 的 beta 版本(admissionregistration.k8s.io/v1beta1 API 版本)- beta 版
CustomResourceDefinition
API (apiextensions.k8s.io/v1beta1) - beta 版
APIService
API (apiregistration.k8s.io/v1beta1) - beta 版
TokenReview
API (authentication.k8s.io/v1beta1) SubjectAccessReview
、LocalSubjectAccessReview
、SelfSubjectAccessReview
的 beta API 版本(来自 authorization.k8s.io/v1beta1 的 API 版本)- beta 版
CertificateSigningRequest
API (certificates.k8s.io/v1beta1) - beta 版
Lease
API (coordination.k8s.io/v1beta1) - 所有 beta 版
Ingress
API(extensions/v1beta1 和 networking.k8s.io/v1beta1 API 版本)
Kubernetes 文档涵盖了这些 v1.22 的 API 删除,并解释了每个 API 在 beta 版和稳定版之间的变化。
该怎么做
我们将逐一介绍受这些删除影响的每个资源,并解释您需要采取的步骤。
Ingress
- 迁移到使用 networking.k8s.io/v1 Ingress API,自 v1.19 起可用。
相关的 API IngressClass 旨在补充 Ingress 的概念,允许您在一个集群内配置多种类型的 Ingress。如果您目前正在使用已弃用的kubernetes.io/ingress.class
注释,请计划切换到使用.spec.ingressClassName
字段。
在任何运行 Kubernetes v1.19 或更高版本的集群上,您都可以使用 v1 API 来检索或更新现有的 Ingress 对象,即使它们是使用较旧的 API 版本创建的。当您将 Ingress 转换为 v1 API 时,您应该检查该 Ingress 中的每个规则。较旧的 Ingress 使用旧的
ImplementationSpecific
路径类型。将 路径匹配 从ImplementationSpecific
切换到Prefix
或Exact
。迁移到这些替代路径类型的好处之一是,它使得在不同 Ingress 类之间迁移变得更加容易。ⓘ 除了升级您自己对 Ingress API 的使用作为客户端之外,请确保您使用的每个 Ingress 控制器都与 v1 Ingress API 兼容。阅读 Ingress 先决条件,了解有关 Ingress 和 Ingress 控制器的更多背景信息。
ValidatingWebhookConfiguration
和MutatingWebhookConfiguration
- 迁移到使用 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 的 admissionregistration.k8s.io/v1 API 版本,自 v1.16 起可用。
您可以使用 v1 API 来检索或更新现有对象,即使它们是使用较旧的 API 版本创建的。 CustomResourceDefinition
- 迁移到使用 CustomResourceDefinition apiextensions.k8s.io/v1 API,自 v1.16 起可用。
您可以使用 v1 API 来检索或更新现有对象,即使它们是使用较旧的 API 版本创建的。如果您在集群中定义了任何自定义资源,则在升级后仍然可以提供这些资源。如果您正在使用外部 CustomResourceDefinitions,则可以使用
kubectl convert
将现有清单转换为使用更新的 API。由于 beta 版和稳定版 CustomResourceDefinitions 之间存在一些功能差异,我们的建议是测试每个定义,以确保它在升级后按预期工作。 APIService
- 迁移到使用 apiregistration.k8s.io/v1 APIService API,自 v1.10 起可用。
您可以使用 v1 API 来检索或更新现有对象,即使它们是使用较旧的 API 版本创建的。如果您已经使用 APIService 对象进行 API 聚合,则在升级后此聚合将继续工作。 TokenReview
- 迁移到使用 authentication.k8s.io/v1 TokenReview API,自 v1.10 起可用。
除了通过 HTTP 服务此 API 之外,Kubernetes API 服务器使用相同的格式将 TokenReviews 发送到 Webhook。v1.22 版本默认继续对发送到 Webhook 的 TokenReviews 使用 v1beta1 API。请参阅 展望未来,了解有关切换到稳定 API 的一些具体技巧。
SubjectAccessReview
、SelfSubjectAccessReview
和LocalSubjectAccessReview
- 迁移到使用自 v1.6 起可用的那些 授权 API 的 authorization.k8s.io/v1 版本。
CertificateSigningRequest
- 迁移到使用 certificates.k8s.io/v1 CertificateSigningRequest API,自 v1.19 起可用。
您可以使用 v1 API 来检索或更新现有对象,即使它们是使用较旧的 API 版本创建的。现有已颁发的证书在升级时保留其有效性。 Lease
- 迁移到使用 coordination.k8s.io/v1 Lease API,自 v1.14 起可用。
您可以使用 v1 API 来检索或更新现有对象,即使它们是使用较旧的 API 版本创建的。
kubectl convert
有一个 kubectl
插件提供 kubectl convert
子命令。它是您可以作为 Kubernetes 一部分下载的官方插件。有关更多详细信息,请参阅 下载 Kubernetes。
您可以使用 kubectl convert
更新清单文件以使用不同的 API 版本。例如,如果您的源代码管理中有使用 beta 版 Ingress API 的清单,您可以签出该定义,然后运行 kubectl convert -f <manifest> --output-version <group>/<version>
。您可以使用 kubectl convert
命令自动转换现有清单。
例如,要将较旧的 Ingress 定义转换为 networking.k8s.io/v1
,您可以运行
kubectl convert -f ./legacy-ingress.yaml --output-version networking.k8s.io/v1
自动转换使用与 Kubernetes 控制平面更新最初使用较旧 API 版本创建的对象类似的技术。因为它是一种机械转换,您可能需要进入并更改清单以调整默认值等。
排练升级
如果您管理集群的 API 服务器组件,您可以在升级到 Kubernetes v1.22 之前尝试这些 API 删除。
为此,请将以下内容添加到 kube-apiserver 命令行参数中
--runtime-config=admissionregistration.k8s.io/v1beta1=false,apiextensions.k8s.io/v1beta1=false,apiregistration.k8s.io/v1beta1=false,authentication.k8s.io/v1beta1=false,authorization.k8s.io/v1beta1=false,certificates.k8s.io/v1beta1=false,coordination.k8s.io/v1beta1=false,extensions/v1beta1/ingresses=false,networking.k8s.io/v1beta1=false
(作为副作用,这也关闭了 EndpointSlice 的 v1beta1 - 在测试时要注意这一点)。
一旦您将集群中的所有 kube-apiserver 都切换为使用该设置,这些 beta API 就会被删除。您可以测试 API 客户端(kubectl
、部署工具、自定义控制器等)是否仍然按预期工作,如果需要,您可以恢复,而无需计划更具破坏性的降级。
给软件作者的建议
也许您正在阅读本文,因为您是与 Kubernetes 集成的插件或其他组件的开发人员?
如果您开发 Ingress 控制器、Webhook 身份验证器、API 聚合或任何其他依赖于这些已弃用 API 的工具,您应该已经开始切换您的软件。
您可以使用 排练升级 中的技巧来运行您自己的仅使用新 API 的 Kubernetes 集群,并确保您的代码工作正常。对于您的文档,请确保读者了解他们应为 Kubernetes v1.22 升级采取的任何步骤。
在可能的情况下,帮助您的用户尽早采用新的 API(可能在测试环境中),以便他们可以向您提供有关任何问题的反馈。
Kubernetes v1.25 中将出现一些 更多弃用,因此请计划涵盖这些弃用。
Kubernetes API 删除
以下是一些关于 Kubernetes 删除某些 API 的原因的背景信息,以及关于 Kubernetes 中稳定 API 的承诺。
Kubernetes 遵循其功能(包括 Kubernetes API)的明确定义的 弃用策略。该策略允许从 Kubernetes 替换稳定的(“GA”)API。重要的是,此策略意味着只有在可以使用该相同 API 的更新的稳定版本时,才能弃用稳定的 API。
这种稳定性保证至关重要:如果您使用的是稳定的 Kubernetes API,那么永远不会发布新版本迫使您切换到 alpha 或 beta 功能。
早期阶段则不同。 Alpha 功能正在测试中,可能不完整。 几乎总是,alpha 功能默认是禁用的。 Kubernetes 版本可能会并且确实会删除那些效果不佳的 alpha 功能。
Alpha 之后是 beta。 这些功能通常默认启用;如果测试结果良好,该功能可以升级为稳定版。 如果不行,则可能需要重新设计。
去年,Kubernetes 正式采纳了一项针对已达到 beta 阶段的 API 的策略
对于 Kubernetes REST API,当新功能的 API 达到 beta 阶段时,就会开始倒计时。 现在,beta 质量的 API 有三个版本的时间……要么
- 达到 GA(正式发布),并弃用 beta 版本,要么
- 推出新的 beta 版本(并弃用之前的 beta 版本)。
在发表该文章时,三个 Kubernetes 版本大约相当于九个日历月。 当月晚些时候,Kubernetes 采用了每个日历年发布三个版本的新节奏,因此倒计时时间现在约为十二个日历月。
无论是由于 beta 功能升级为稳定版而导致的 API 删除,还是由于该 API 未被证明成功,Kubernetes 都将继续按照其弃用策略删除 API,并确保迁移选项已记录在案。
展望未来
如果您使用 webhook 身份验证检查,则有一个相关设置。 未来的 Kubernetes 版本将默认使用 authentication.k8s.io/v1
API 将 TokenReview 对象发送到 webhook。 目前,默认是将 authentication.k8s.io/v1beta1
TokenReview 发送到 webhook,这仍然是 Kubernetes v1.22 的默认设置。 但是,如果您愿意,可以立即切换到稳定的 API:将 --authentication-token-webhook-version=v1
添加到 kube-apiserver 的命令行选项中,并检查身份验证的 webhook 是否仍然按预期工作。
一旦您满意它可以正常工作,就可以在整个控制平面中保留 --authentication-token-webhook-version=v1
选项设置。
计划于明年发布的 v1.25 版本将停止提供一些目前稳定且已经存在一段时间的 Kubernetes API 的 beta 版本。 相同的 v1.25 版本将删除 PodSecurityPolicy,该策略已被弃用且不会升级为稳定版。 有关更多信息,请参阅PodSecurityPolicy 弃用:过去、现在和未来。
计划在 Kubernetes 1.25 中删除的官方 API 列表是
- beta 版
CronJob
API (batch/v1beta1) - beta 版
EndpointSlice
API (networking.k8s.io/v1beta1) - beta 版
PodDisruptionBudget
API (policy/v1beta1) - beta 版
PodSecurityPolicy
API (policy/v1beta1)
想了解更多?
弃用会在 Kubernetes 发行说明中宣布。 您可以在 1.19、1.20 和 1.21 的发行说明中查看待弃用的公告。
有关弃用和删除过程的信息,请查看 Kubernetes 官方的弃用策略文档。