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

Terraform创建的EKS拉取镜像失败及跨区域拉取问题排查

问题分析与解决

拉取镜像失败的核心原因

你在Terraform中设置的镜像仓库参数路径错误,导致Helm chart没有使用你指定的Public ECR镜像仓库,而是默认调用了us-west-2区域的私有ECR仓库(602401143452.dkr.ecr.us-west-2.amazonaws.com)。私有ECR拉取必须依赖AWS认证凭证,但你的EKS环境未配置对应权限或访问路径,因此触发"no basic auth credentials"错误。


疑问解答

1. 为何会缺少基础认证凭证?

默认的602401143452.dkr.ecr.us-west-2.amazonaws.com是AWS私有ECR仓库,拉取私有ECR镜像必须满足两个前提:

  • EKS节点的IAM角色需具备ecr:GetDownloadUrlForLayer、ecr:BatchGetImage、ecr:BatchCheckLayerAvailability权限;
  • 节点能访问ECR服务(私有子网环境需配置ECR的VPC端点,或通过NAT网关访问公网)。

而你原本想使用的public.ecr.aws/eks/aws-load-balancer-controller是公共ECR仓库,无需认证即可拉取,但因为参数设置错误,触发了私有ECR的拉取逻辑,自然出现凭证缺失报错。

2. 如何配置从非us-west-2区域拉取镜像?

有两种可行方案:

方案一:使用公共ECR仓库(推荐,无需区域配置)

修正Terraform中set参数的路径,将image.repository改为controller.image.repository,确保覆盖chart的默认镜像地址:

set {
  name  = "controller.image.repository"
  value = "public.ecr.aws/eks/aws-load-balancer-controller"
}

公共ECR是全球分发的,无需指定区域,私有子网环境只要能访问公网(或配置Public ECR的VPC端点)即可拉取。

方案二:使用对应区域的私有ECR仓库

如果你想使用ap-southeast-1区域的私有ECR,需要:

  • 修改镜像仓库地址为对应区域的私有ECR路径:
    set {
      name  = "controller.image.repository"
      value = "602401143452.dkr.ecr.ap-southeast-1.amazonaws.com/amazon/aws-load-balancer-controller"
    }
    
  • 确保EKS节点的IAM角色附加AmazonEC2ContainerRegistryReadOnly策略;
  • 私有子网环境需配置ECR的VPC端点(包括ecr.dkr和ecr.api两个端点),或通过NAT网关访问公网。

修正后的Terraform代码片段

# Install AWS LoadBalancer Controller
resource "helm_release" "aws-lb-controller" {
  name       = "aws-load-balancer-controller"
  chart      = "eks/aws-load-balancer-controller"
  repository = "https://aws.github.io/eks-charts"

  values = []

  set {
    name  = "region"
    value = "ap-southeast-1"
  }
  # 修正镜像仓库参数路径
  set {
    name  = "controller.image.repository"
    value = "public.ecr.aws/eks/aws-load-balancer-controller"
  }
  set {
    name  = "controller.image.tag"
    value = "v2.4.5"
  }
  set {
    name  = "namespace"
    value = "kube-system"
  }
  set {
    name  = "serviceAccount.create"
    value = "false"
  }
  set {
    name  = "serviceAccount.name"
    value = "aws-load-balancer-controller"
  }
  set {
    name  = "ingress-class"
    value = "alb"
  }
  set {
    name  = "controller.admissionWebhooks.enabled"
    value = "false"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:05:18