记一次kubernetes升级1.18.8后的helm相关问题及解决。

从1.16升级至kubenetes 1.18.8 高可用集群后,helm安装出现Error: UPGRADE FAILED: failed decoding reader into objects: unable to recognize : no matches for kind Deployment in version apps/v1beta2

post thumb
Kubernetes
作者 Louis 发表于 2021年3月30日

[TOC]

由于集群的kubernetes从1.16版本升级到1.18版本。升级过程没什么大的问题, 只有一个--port=0的问题, 而且还是云监控的一个报错, 其他使用过程中没有什么报错. 因此可以忽略过去了

还没多久, 我们需要更新线上版本, 发现了这个helm问题. 因此记录下来. 发版还是挺频繁的.

资源变更与弃用

Kubernetes 1.18版本中API相关弃用如下:

  • 所有资源的API apps/v1beta1和apps/v1beta2都将弃用,请使用apps/v1代替。
  • Daemonsets/Deployments/Replicasets资源的API extensions/v1beta1将被弃用,请使用apps/v1代替。
  • Networkpolicies资源的API extensions/v1beta1将被弃用,请使用networking.k8s.io/v1代替。
  • Podsecuritypolicies资源的API extensions/v1beta1将被弃用,请使用policy/v1beta1代替。

Helm相关

我们线上的后端资源变更, 都是基于helm来做的. 集群从1.9.3慢慢升级到1.18.8的. 升级过程也比较坎坷. 而且是分步升级的. 因此有些资源用的都是比较老的版本, 比如我们的deployment用的就是apps/v1beta2 这个版本. 因此在执行helm upgrade的时候进行变更, 出现了以下的错误.

Error: UPGRADE FAILED: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "apps/v1beta2"

而且我们用了三四年的集群, helm安装的deployment实在是太多, 有几百个. 每个release都是老的资源版本. 因此这个是一个比较紧急而且需要快速解决的问题. 网上调研了很多工具. 查了很多资料. 发现了一个很好用的工具. 具体helm/helm#6969. 遇到了这个问题的人还是很多的.

生产环境重新安装release显然不是一个很好的选择, 如果没有灰度切换功能, 那么重新安装必然会影响整个发布系统.

给出的文档有:

相关的工具

https://github.com/hickeyma/helm-mapkubeapis.

mapkubeapis is a Helm v2/v3 plugin which updates in-place Helm release metadata that contains deprecated or removed Kubernetes APIs to a new instance with supported Kubernetes APIs.

Charts need to be updated also to supported Kubernetes APIs to avoid failure during deployment in a Kubernetes version. This is a separate task to the plugin.

稍微翻译一下就是:

mapkubeapis 是helm的一个插件, 支持v2/v3. 主要是将kubernetes 已经弃用或者删除的api在helm release的元数据里面更新为kubernetes支持的api.

helm chart也需要同步更新到kubernetes支持的api, 才能避免在升级过程中发生的错误. 两种是分开的

完美解决

很简单的两条命令.

$ helm plugin install https://github.com/hickeyma/helm-mapkubeapis

# my-release-name 是helm-release 名称
# tiller-pod-namespace 是 tiller pod部署的namespace. 默认是 kube-system.

$ helm mapkubeapis  my-release-name --namespace tiller-pod-namespace --v2

升级过程的日志

$ helm mapkubeapis be-payment-service-prod --namespace kube-system --v2
2021/03/30 15:10:22 Release 'be-payment-service-prod' will be checked for deprecated or removed Kubernetes APIs and will be updated if necessary to supported API versions.
2021/03/30 15:10:22 Get release 'be-payment-service-prod' latest version.
2021/03/30 15:10:23 Check release 'be-payment-service-prod' for deprecated or removed APIs...
2021/03/30 15:10:23 Found deprecated or removed Kubernetes API:
"apiVersion: apps/v1beta2
kind: Deployment"
Supported API equivalent:
"apiVersion: apps/v1
kind: Deployment"
2021/03/30 15:10:23 Finished checking release 'be-payment-service-prod' for deprecated or removed APIs.
2021/03/30 15:10:23 Deprecated or removed APIs exist, updating release: be-payment-service-prod.
2021/03/30 15:10:23 Set status of release version 'be-payment-service-prod.v1' to 'superseded'.
2021/03/30 15:10:23 Release version 'be-payment-service-prod.v1' updated successfully.
2021/03/30 15:10:23 Add release version 'be-payment-service-prod.v2' with updated supported APIs.
2021/03/30 15:10:23 Release version 'be-payment-service-prod.v2' added successfully.
2021/03/30 15:10:23 Release 'be-payment-service-prod' with deprecated or removed APIs updated successfully to new version.
2021/03/30 15:10:23 Map of release 'be-payment-service-prod' deprecated or removed APIs to supported versions, completed successfully.
上一篇
k8s中Prometheus监控redis-exporter