如何通过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使用:
- 用
kubernetes_secret资源在默认命名空间下创建私有镜像拉取Secret - 用
helm_release安装kubernetes-replicator组件,配置自动复制带有指定标签的Secret到所有命名空间 - 用kubernetes provider遍历所有命名空间,给每个命名空间的default ServiceAccount添加
imagePullSecrets配置即可。
疑问解答
- 是否需要使用复制器?只有选择方案二时需要,方案一完全不需要用到复制器。
- 是否可以直接在节点上配置,无需修改
ServiceAccount即可生效?完全可以,方案一就是节点层配置,集群内所有Pod不管用什么ServiceAccount,拉取镜像时都会默认复用节点的认证信息,不需要修改任何Kubernetes侧的ServiceAccount资源。
内容的提问来源于stack exchange,提问作者Carson Crane
相关产品推荐
相关产品推荐

