升级到 Kubernetes 1.25 后,由于 HorizontalPodAutoscaler API 版本发生变化,helm 升级失败

问题描述 投票:0回答:3

将 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 版本时我不断收到相同的错误。 解决该问题的唯一方法是卸载并重新安装该版本。 有人可以解释错误的原因以及如何在不删除并重新安装的情况下修复它吗?

kubernetes kubernetes-helm
3个回答
4
投票

helm3 对发布状态保密,上次发布的 helm 状态包含旧的 API

autoscaling/v2beta1
,并且由于某种原因,导致升级时出错。 为了解决这个问题,我编辑了 helm Secret,使用 base64 编码解压
.data.release
两次,然后解压,用
autoscaling/v2beta1
替换
autoscaling/v2
,然后将其压缩编码两次。

经过此更改以及新 API 版本(和语法)的更改后,问题解决了,我可以再次升级图表。

我的修复:

  • 将 hpa 模板更新到最新 API 版本
  • 使用以下命令更新(修补)最后一个 Helm Secret (
    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

0
投票

在升级 Helm Chart 之前删除 Kubernetes API 时,Helm 还提供了一些文档。它遵循与 Maoz 的答案相同的程序

https://helm.sh/docs/topics/kubernetes_apis/

获取发布密钥,解码 blob,更新有问题的 API 版本,重新编码密钥,然后应用生成的 yaml 文件。

我花了大约一个小时才找到这篇文章!


0
投票

我正在尝试使用这个工具来修复它:https://github.com/helm/helm-mapkubeapis

© www.soinside.com 2019 - 2024. All rights reserved.