共计 2043 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章给大家介绍 Kubernetes 中如何自动检测和处理弃用的 API,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
随着 Kubernetes 1.16 可用一段时间,并开始在许多托管 Kubernetes 平台上缓慢推出,你可能听说过 API 弃用(deprecation)。虽然处理起来相当简单,但是如果无人参与,这种更改可能会严重地中断你的服务。
API 弃用是什么?
随着 Kubernetes 的特性集的发展,API 也必须发展以支持这种变化。有一些规则旨在保证兼容性和稳定性。这种情况不会在每个版本中都发生,但最终,你将不得不使用新的 API 版本和格式,因为旧的 API 将不再受支持。
为什么这对于 1.16 版本如此重要?
在最近几个 K8s 版本中保留了一些弃用的 API,最终在 Kubernetes 1.16 版本中被完全删除。即以下 API 组和版本:
Deployment — extensions/v1beta1, apps/v1beta1 and apps/v1beta2
NetworkPolicy — extensions/v1beta1
PodSecurityPolicy — extensions/v1beta1
DaemonSet — extensions/v1beta1 and apps/v1beta2
StatefulSet — apps/v1beta1 and apps/v1beta2
ReplicaSet — extensions/v1beta1, apps/v1beta1 and apps/v1beta2
如果尝试在 1.16 中使用其中之一创建资源,操作将会失败。
如何检查我是否受到影响?
你可以手动遍历所有清单,但这可能相当耗时。如果有多个团队部署到集群中,或者在一个地方没有当前的所有清单,那么很容易丢失一些清单,并且可能非常不实际。这就是 kubent(Kube-No-Trouble)来帮忙的地方。
问题是什么?
用于创建给定资源的 API 版本的信息通常是不容易找到,因为资源总是在内部转换为首选存储版本并存储在首选存储版本中。然而。如果你使用 kubectl 或 Helm 来部署资源,原始清单也存储在集群中,我们可以利用它。如果是 kubectl,则形式为 kubectl.kubernetes.io/last-applied-configuration 注释;如果是 Helm,则形式为 ConfigMap 或 Secret。
如何解决弃用产生的问题
最简单的方法是安装:
sh -c $(curl -sSL https://git.io/install-kubent)
这将把 kubent 的最新版本安装到 /usr/local/bin 中。
(如果你和我一样,不相信别人在博客文章中发布的随机脚本,请下载针对你的平台的最新版本,然后解压缩到你喜欢的任何地方。)
配置 kubectl 的当前上下文,以指向你想要检查和运行 kubent 工具的集群:
图 1:kubent 运行的示例输出
Kubent 将连接到你的集群,检索所有可能受到影响的资源,扫描并打印那些受到影响的资源的摘要。
你还可以使用 -f json 标记来获得 JSON 格式的输出,这更适合让你将其集成到你的 CI/CD 流水线中或进一步处理结果。关于可用配置选项的更多细节在 doitintl/kube-no-trouble 仓库的 README 文件中描述。
我应该如何处理检测到的资源?
在某些情况下,这就像改变 manifest 中的 apiVersion 一样简单,但在其他情况下,结构可能已经改变,需要调整。另外,要注意,版本之间有很多默认值会发生变化(关于这方面的好文章是 David Schweikert 的 Kubernetes 1.16 API deprecations and changed defaults),因此,仅更改 apiVersion 并应用相同的清单,就会得到不同的结果。例如,StatefulSet 的 updateStrategy.type 从 OnDelete 更改为 RollingUpdate,导致了非常不同的行为。
https://medium.com/google-cloud/kubernetes-1-16-api-deprecations-and-changed-defaults-e53ccc5c73d5
以前使用的 kubectl convert 命令现已弃用,可能不能根据前面提到的默认值正确地转换资源。
最好的方法可能是简单地应用资源(如果你使用 kubent 检测到它们,那么你已经有了这些资源)并从 API 检索新版本。这将确保资源被正确地转换为新版本。你可能已经注意到,kubectl 在某种程度上不确定地返回的版本。要请求一个特定的 API 版本,使用完整的形式:
kubectl get ingress.v1beta1.extensions -o yaml
关于 Kubernetes 中如何自动检测和处理弃用的 API 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。