You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AKS与Key Vault集成Helm升级失败问题求助

AKS与Key Vault集成时Helm升级失败:SecretProviderClass缺少Helm所有权元数据

问题概述

执行Helm升级命令时触发报错:

Error: UPGRADE FAILED: rendered manifests contain a resource that already exists. Unable to continue with update: SecretProviderClass "azure-keyvault-integration" in namespace "project1" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "project1-dev"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "project1"

核心原因是集群中已存在的azure-keyvault-integration SecretProviderClass缺少Helm要求的所有权标签和注释,导致Helm无法将其纳入当前Release的管理范围。

相关配置

Helm升级脚本:

ENV=$1
NAMESPACE=$2
HELM_RELEASE=$3

output=$(helm upgrade --install \
  -f ./values/${ENV}/values.${ENV}.yaml \
  -f ./values/${ENV}/values.${ENV}.autoscaling.yml \
  -f secrets://values/${ENV}/secrets.${ENV}.enc.yaml \
  ${HELM_RELEASE} charts/project1 \
  --create-namespace --namespace ${NAMESPACE} \
  --dry-run --debug 2>&1)

当前SecretProviderClass模板:

{{- if .Values.keyvault.enabled }}
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-keyvault-integration # needs to be unique per namespace
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    userAssignedIdentityID: <userAssignedIdentityID>
    keyvaultName: <keyvaultName>
    useVMManagedIdentity: <useVMManagedIdentity>
    tenantId: <tenantId>
    subscriptionId: <subscriptionId>
    objects:  |
      array:
        - |
          objectName: OBJNAME1-VSC
          objectType: secret
          objectVersion: "4475eb5e1790e"
        - |
          objectName: OBJNAME2-VSC
          objectType: secret
          objectVersion: "d94449a99e9"

  secretObjects:
    - data:
      - key: API1_KEY
        objectName: OBJNAME1-VSC
      - key: API2_KEY
        objectName: OBJNAME2-VSC
      type: Opaque
      secretName: service1-secrets
{{- end}}

Service1的正确元数据参考:

labels:
  app.kubernetes.io/instance: project1-cloud-dev
  app.kubernetes.io/managed-by: Helm
  app.kubernetes.io/name: service1
  app.kubernetes.io/version: 1.16.0
  helm.sh/chart: service1-0.1.0
annotations:
  deployment.kubernetes.io/revision: '5'
  meta.helm.sh/release-name: project1-cloud-dev
  meta.helm.sh/release-namespace: project1-cloud

解决方案

1. 手动修复现有SecretProviderClass的元数据

直接给集群中已存在的资源补全缺少的标签和注释,执行以下命令:

# 添加Helm管理标签
kubectl label secretproviderclass azure-keyvault-integration app.kubernetes.io/managed-by=Helm -n project1

# 添加Release归属注释
kubectl annotate secretproviderclass azure-keyvault-integration meta.helm.sh/release-name=project1-dev meta.helm.sh/release-namespace=project1 -n project1

执行完成后重新运行Helm升级命令即可。

2. 修改Helm模板,自动生成正确元数据

为避免后续部署重复出现该问题,修改secret-provider-class.yaml的metadata部分,添加Helm自动注入的变量:

{{- if .Values.keyvault.enabled }}
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-keyvault-integration # needs to be unique per namespace
  labels:
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
    app.kubernetes.io/name: service1
    helm.sh/chart: service1-0.1.0 # 与Service1的chart版本保持一致
  annotations:
    meta.helm.sh/release-name: {{ .Release.Name }}
    meta.helm.sh/release-namespace: {{ .Release.Namespace }}
spec:
  # 原spec内容保持不变
{{- end}}

后续通过Helm部署时,会自动为SecretProviderClass添加上符合要求的所有权元数据。

3. 可选:删除现有资源让Helm重新创建

如果业务允许短暂中断,可直接删除现有资源,让Helm重新生成带正确元数据的实例:

kubectl delete secretproviderclass azure-keyvault-integration -n project1

删除后重新运行Helm升级命令即可。

注意事项

  • 手动修复元数据后,后续对该资源的修改需通过Helm执行,避免元数据再次不一致。
  • 使用Helm内置变量(如.Release.Name、.Release.Namespace)可保证不同环境下的元数据自动适配,无需手动调整。

内容的提问来源于stack exchange,提问作者user826323

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:57:02