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

如何通过Terraform配置EKS托管节点组实现全命名空间私有Docker Hub访问

解决方案总览

你有两种可落地的配置方案,优先推荐节点级配置方案,完全不需要修改任何ServiceAccount,也不需要Secret复制器,可实现全节点所有Pod默认拥有私有镜像拉取权限:


方案一:节点级Docker配置(无需修改ServiceAccount、无需复制器,推荐)

该方案直接把私有镜像仓库的认证信息写入EKS节点的运行时配置文件,节点上所有Pod拉取镜像时会默认使用节点预置的认证信息,完全不需要改动集群内的Kubernetes资源。
你使用的无自定义启动模板的托管节点组,可直接通过node_groups的pre_userdata参数注入配置,仅需修改现有Terraform EKS模块配置即可:

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "17.20.0"

  # 保留你原有所有配置不变,仅修改node_groups块新增pre_userdata参数
  cluster_name    = "something"
  cluster_version = "1.21"
  vpc_id  = "some-vpc-id"
  subnets = ["eks-specific-subnets"]
  manage_worker_iam_resources = true
  write_kubeconfig = false

  node_groups = {
    main = {
      # 新增预执行用户数据注入认证配置
      pre_userdata = <<EOF
mkdir -p /root/.docker /home/ec2-user/.docker
cat > /root/.docker/config.json << 'CONFIG'
{
  "auths": {
    "你的私有镜像仓库地址,例如docker.io": {
      "auth": "替换为base64编码后的用户名:密码串,生成命令:echo -n '你的用户名:你的密码' | base64"
    }
  }
}
CONFIG
cp /root/.docker/config.json /home/ec2-user/.docker/config.json
chown ec2-user:ec2-user /home/ec2-user/.docker/config.json
# 重启服务让配置立即生效
systemctl restart docker kubelet
EOF

      # 保留原有node_groups所有配置不变
      name_prefix = "something-"
      additional_tags = {
        "k8s.io/cluster-autoscaler/something" = "owned"
        "k8s.io/cluster-autoscaler/enabled"   = true
      }
      ami_type       = "AL2_x86_64"
      disk_size      = 50
      instance_types = ["m5.large"]
      min_capacity  = 1
      max_capacity  = 100
      capacity_type = "SPOT"
      update_config = {
        max_unavailable_percentage = 50
      }
      subnets = ["private-subnets"]
    }
  }
}

该方案优势:

  • 完全不需要修改任何Kubernetes侧资源,不用配置ServiceAccount、Secret
  • 新增节点自动注入配置,无需额外操作
  • 所有命名空间的所有Pod默认生效,无遗漏

补充:如果你使用的是AWS ECR作为私有镜像仓库,不需要上述配置,只需要给EKS节点组的实例角色附加AmazonEC2ContainerRegistryReadOnly托管策略即可,Terraform配置如下:

resource "aws_iam_role_policy_attachment" "eks_node_ecr_read" {
  role       = module.eks.worker_iam_role_name
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
}

方案二:全局Secret复制方案(不想修改节点配置时可选)

如果不想改动节点配置,可以选择Secret复制器实现全局生效,该方案需要配合kubernetes、helm provider使用:

  1. 用kubernetes_secret资源在默认命名空间下创建私有镜像拉取Secret
  2. 用helm_release安装kubernetes-replicator组件,配置自动复制带有指定标签的Secret到所有命名空间
  3. 用kubernetes provider遍历所有命名空间,给每个命名空间的default ServiceAccount添加imagePullSecrets配置即可。

疑问解答
  • 是否需要使用复制器?只有选择方案二时需要,方案一完全不需要用到复制器。
  • 是否可以直接在节点上配置,无需修改ServiceAccount即可生效?完全可以,方案一就是节点层配置,集群内所有Pod不管用什么ServiceAccount,拉取镜像时都会默认复用节点的认证信息,不需要修改任何Kubernetes侧的ServiceAccount资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:54:02