如何更改 Kubernetes 中对象的 apiVersion?

如何更改 Kubernetes 中对象的 apiVersion?

我正在将集群升级到 Kubernetes v1.16。有一些关于弃用的说明在该更新中。其中一个注意事项是删除了apiVersion extensions/v1beta1for ,升级前Deployment应使用。apiVersion apps/v1

这听起来很简单,但我却不知道如何真正实现这种改变。

我们更新了 YAML 文件以包含较新的apiVersion;也就是说,包含Deployment以以下内容开头的 YAML 文件,

apiVersion: apps/v1
kind: Deployment

但是,如果我们kubectl apply将此发送到我们的服务器,然后将kubectl get deployment -o yaml其返回以验证更改,还没有更新apiVerison服务器报告的仍然是:

apiVersion: extensions/v1beta1
kind: Deployment
metadata
  annotations:
    [...]
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion": "apps/v1", ...}

metadata.annotations在这里包含了字段;您可以看到其中的注释kubectl甚至承认它正在应用具有正确名称的清单apiVersion,但资源仍然返回旧版本!

链接的弃用通知还谈到了使用kubectl convert;我们也尝试过。AFAICT,kubectl convert仅适用于资源的离线 YAML 表示,甚至kubectl apply对的结果进行 -ingkubectl convert也不会改变上述行为。

我也尝试kubectl patch修补该特定字段,但再次验证表明没有发生实际变化。 (输出kubectl patch也表明没有任何变化。)

我实际上如何更新此资源的 Kubernetes 版本?

(一些小说明:这个集群是一个 Azure AKS 实例;Azure 实际上将此资源标记为需要注意。)

答案1

感谢向后兼容性!!!

kubectl get deployment XXX显然是模棱两可的,因为服务器在多个 api 组中有部署。当资源存在于多个 api 组中时,kubectl 将使用包含该资源的服务器发布的发现文档中列出的第一个组。为了向后兼容,这是扩展 api 组。

尝试: kubectl get deploy.extensions XXXkubectl get deploy.apps XXX 验证您的部署是否确实存在于两个 api 组中。

https://github.com/kubernetes/kubernetes/issues/58131#issuecomment-356823588

答案2

  1. 安装/配置 kubectl-convert 插件
  2. kubectl-convert -f 已弃用版本.yaml --输出版本 networking.k8s.io/v1

相关内容