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

在AWS EKS中通过Terraform用Helm升级Cluster Autoscaler遇资源已存在错误

问题原因

错误的核心是cluster-autoscaler命名空间下的default ServiceAccount并非由Helm管理——它缺少Helm资源必须的标签app.kubernetes.io/managed-by=Helm和注解meta.helm.sh/release-name、meta.helm.sh/release-namespace,导致Helm在升级时无法接管或创建这个资源。

这种情况通常由以下原因导致:

  • 命名空间创建时自动生成了默认的default ServiceAccount,而当前使用的Helm Chart默认配置要创建/管理这个SA
  • 之前的Cluster Autoscaler部署未通过Helm管理该SA(比如手动创建、或旧版本Chart不涉及SA管理)
修复方案

方案1:修改Helm配置,跳过创建default ServiceAccount

既然default SA已经存在,直接让Helm使用现有资源即可。在Terraform的helm_release资源中添加对应values配置:

resource "helm_release" "cluster_autoscaler" {
  name       = "cluster-autoscaler"
  repository = "https://kubernetes.github.io/autoscaler"
  chart      = "cluster-autoscaler"
  version    = "9.24.0"
  namespace  = "cluster-autoscaler"

  values = [
    yamlencode({
      serviceAccount = {
        create = false # 禁止Helm创建SA
        name   = "default" # 指定使用已存在的default SA
      }
      # 其他你已配置的参数,比如image.tag = "v1.23.1"等
    })
  ]
}

之后重新执行terraform apply即可。

方案2:给现有SA添加Helm所有权标识

如果需要让Helm接管这个default SA,手动给它补上缺失的标签和注解:

# 添加标签
kubectl label serviceaccount default app.kubernetes.io/managed-by=Helm -n cluster-autoscaler
# 添加注解
kubectl annotate serviceaccount default meta.helm.sh/release-name=cluster-autoscaler meta.helm.sh/release-namespace=cluster-autoscaler -n cluster-autoscaler

完成后重新运行terraform apply,Helm就能识别并管理这个SA了。

方案3:删除现有SA后重新部署

如果这个default SA没有被其他资源依赖,可以直接删除它,让Helm重新创建符合要求的SA:

kubectl delete serviceaccount default -n cluster-autoscaler

删除后执行terraform apply,Helm会自动创建带正确标识的default SA。

你可能的操作失误
  • 未检查新版本Helm Chart的serviceAccount配置:新版本Chart默认可能开启了serviceAccount.create=true,而你沿用旧配置时没注意到这个变化,导致Helm尝试创建已存在的default SA
  • 之前的部署未通过Helm管理该SA,升级时未考虑资源所有权的兼容问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:19