将 Kubernetes 升级到 1.25 后
helm upgrade --install ...
失败并出现以下错误:
Error: UPGRADE FAILED: unable to recognize "": no matches for kind "HorizontalPodAutoscaler" in version "autoscaling/v2beta1"
为了解决这个问题,我将 HPA 从
autoscaling/v2beta1
更改为 autoscaling/v2
并更新新的 API 语法。但在尝试升级 helm 版本时我不断收到相同的错误。
解决该问题的唯一方法是卸载并重新安装该版本。
有人可以解释错误的原因以及如何在不删除并重新安装的情况下修复它吗?
helm3 对发布状态保密,上次发布的 helm 状态包含旧的 API
autoscaling/v2beta1
,并且由于某种原因,导致升级时出错。
为了解决这个问题,我编辑了 helm Secret,使用 base64 编码解压 .data.release
两次,然后解压,用 autoscaling/v2beta1
替换 autoscaling/v2
,然后将其压缩编码两次。
经过此更改以及新 API 版本(和语法)的更改后,问题解决了,我可以再次升级图表。
我的修复:
secret/sh.helm.release.v1....
):UPDATE=$(kubectl get secret "${SECRET}" -n "${NAMESPACE}" -otemplate='{{.data.release |base64decode |base64decode }}'|gzip -d|sed 's#autoscaling/v2beta1#autoscaling/v2#'| gzip |base64 -w0 |base64 -w0)
kubectl patch secret "${SECRET}" -n "${NAMESPACE}" --patch="{\"data\": { \"release\": \"$UPDATE\" }}"
我使用此脚本来更新我所有命名空间中的所有 helm 机密。
#!/bin/bash
SECRET=$1
NAMESPACE=$2
if [[ -z "${SECRET}" ]]
then
echo "Usage: $0 <secret-name> <namespace>"
exit
fi
if [[ -z "${NAMESPACE}" ]]
then
echo "Usage: $0 <secret-name> <namespace>"
exit
fi
UPDATE=$(kubectl get secret "${SECRET}" -n "${NAMESPACE}" -otemplate='{{.data.release |base64decode |base64decode }}'|gzip -d|sed 's#autoscaling/v2beta1#autoscaling/v2#'| gzip |base64 -w0 |base64 -w0)
kubectl patch secret "${SECRET}" -n "${NAMESPACE}" --patch="{\"data\": { \"release\": \"$UPDATE\" }}"
# Running example:
## Fix single secret
# ./fix-helm-hpa.sh <secret> <namespace>
## Fix all secrets
#kubectl get secret --field-selector=type=helm.sh/release.v1 -otemplate='{{range .items}}{{printf "%s %s\n" .metadata.name .metadata.namespace }}{{end}}' |while read line ; do ./fix-helm-hpa.sh $line; done
在升级 Helm Chart 之前删除 Kubernetes API 时,Helm 还提供了一些文档。它遵循与 Maoz 的答案相同的程序
https://helm.sh/docs/topics/kubernetes_apis/
获取发布密钥,解码 blob,更新有问题的 API 版本,重新编码密钥,然后应用生成的 yaml 文件。
我花了大约一个小时才找到这篇文章!
我正在尝试使用这个工具来修复它:https://github.com/helm/helm-mapkubeapis