随着新功能和功能的增加,旧的API被弃用并最终移除。虽然这是Kubernetes发展的必要部分,但对于依赖该平台运行应用程序的组织来说,这可能会带来挑战。
Kubernetes API作为与K8集群交互的接口。如果集群中仍在使用已弃用的API,可能会导致中断不可用。
在这篇博客文章中,我们将探讨被弃用的Kubernetes API是什么,它们为什么重要,以及如何有效地管理它们。
我们还将介绍一些用于处理 Kubernetes 中废弃 API 的可用工具,并提供管理废弃 API 的最佳实践。
在阅读完本文之后,您将更好地了解如何处理Kubernetes集群升级,并对您的基础设施充满信心。
API生命周期
Kubernetes遵循alpha → beta → stable的成熟度进展,并且还有一些额外的版本控制,这样资源可以在不需要进入下一个成熟度级别的情况下进行迭代。
一个alpha资源可以从v1alpha1开始,并且可以通过v1alpha2进行迭代,或者如果有破坏性的变化,可能会使用v2alpha1。一个beta API可能与alpha API具有相同的规范,但是成熟度和与用户的约定将会有所不同。
- Alpha API是实验性的。它们可能存在错误和不兼容的更改。它们不是默认启用的,您应该谨慎使用。
- Beta API经过充分测试,并默认启用。它们可以被依赖于未来的功能,但其实现可能会根据用户反馈或可扩展性等约束而发生变化。
- 稳定的API不会有“beta”或“alpha”名称。它们用版本号表示(例如,v1),其实现不应该在不更改版本号的情况下进行破坏性更改。
我提到的生命周期如下所示:
- 如果一个API同时存在多个版本,Kubernetes API 可能会自动为您升级其中一些版本。然而,您仍应确保您拥有正确的资源方案,特别是因为随着 alpha API 的成熟,方案可能会在不同版本之间发生变化。
- 如果一个API同时有多个版本可用,Kubernetes API可以为您悄悄地升级其中一些版本。然而,您仍应确保您拥有正确的资源方案,特别是因为随着alpha API的成熟,方案可能会在不同版本之间发生变化。
您可以在这里查看k8s API概述,例如,部署属于应用程序组,并具有v1版本。
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/
可以列出它们:
/apis/apps/v1/namespaces/{namespace}/deployments
淘汰和移除Kubernetes API
如果您正在运行过时的Kubernetes API版本,那么您的应用程序就面临着可能导致大量停机时间的风险。即使升级不会导致停机,Kubernetes API的微小差异也可能导致烦恼和浪费精力去调查潜在问题。
在这个场景中,弃用意味着确定一个 API 组件最终会被移除。虽然它目前仍在运行,但计划在即将发布的版本中被淘汰。Kubernetes 遵循明确定义的弃用政策,通知用户哪些 API 将被移除或修改。
Kubernetes API作为与Kubernetes集群交互的接口,允许用户查询和操作各种Kubernetes对象,如pod、命名空间和部署。这些API可以通过诸如kubectl之类的工具、直接通过REST API,或者使用客户端库来访问。随着Kubernetes的发展,旧的API被标记为弃用,并最终被淘汰。这凸显了用户或维护者需要意识到弃用的Kubernetes API的重要性。
弃用的Kubernetes API 的关注点
在配置Kubernetes中的应用程序时,用户需要在YAML清单或Helm图表中的apiVersion字段中指定所使用的Kubernetes对象的API版本,这是一个关键的方面。这强调了用户和维护人员需要及时了解已弃用的Kubernetes API版本及其在即将发布的版本中计划移除的重要性。
在 Kubernetes 集群升级过程中,遇到废弃的 API 可能会成为一个潜在问题,特别是如果升级后的版本不再支持这些 API。例如,如果您集群中的资源使用了过时的 API 版本,那么依赖该资源的应用程序可能因为新集群版本中废弃的 API 而无法正常运行。这种情况可能导致显著的停机时间,就像 Reddit 的全站宕机一样。
一个具体的案例是在Kubernetes版本v1.22中移除了Ingress资源的APIVersion extensions/v1beta1。在您的配置中尝试使用已移除的API版本将导致错误消息。
Error: UPGRADE FAILED: current release manifest contains removed kubernetes api(s) for this kubernetes version and it is therefore unable to build the kubernetes objects for performing the diff. error from kubernetes: unable to recognize "": no matches for kind "Ingress" in version "extensions/v1beta1"
K8s APIs的使用方式
要在您的配置中指定特定的API版本,请参考下面的示例,该示例摘自Kubernetes文档:
apiVersion: apps/v1