如何在Kubernetes YAML中配置AWS ECR身份认证以拉取私有镜像
前置检查
首先确认pod.yaml中填写的镜像地址和ECR实际仓库地址一致,报错日志中拉取的镜像名比你配置的多了mcflow-前缀,先排查是否是镜像地址填写错误导致的问题,确认地址无误后再按以下方案配置权限。
解决方案
报错的核心原因是你的Kubernetes集群EC2工作节点绑定的IAM角色 nodes.dev.vet-dev.digitalecp.mcd.com 没有访问目标ECR仓库的拉取权限,两种可选方案如下:
方案一:为EC2工作节点IAM角色配置ECR访问权限(推荐)
该方案无需额外配置密钥,集群所有节点都可复用权限,适合长期使用:
- 登录AWS IAM控制台,找到名为
nodes.dev.vet-dev.digitalecp.mcd.com的IAM角色 - 为该角色附加权限策略,你可以直接使用AWS托管的
AmazonEC2ContainerRegistryReadOnly策略,也可以自定义最小权限策略,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": "*" } ] }
- 权限配置完成后等待2~3分钟生效,删除异常Pod重新创建即可正常拉取镜像。
方案二:创建ImagePullSecret密钥绑定到Pod/ServiceAccount
如果不方便修改节点IAM角色,可以使用镜像拉取密钥的方式实现单次认证:
- 确保本地AWS CLI已经配置了有权限访问目标ECR的凭证,执行以下命令生成ECR认证信息:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 442285873998.dkr.ecr.us-east-1.amazonaws.com
- 基于docker认证配置创建Kubernetes Secret:
kubectl create secret docker-registry ecr-pull-secret \ --docker-server=442285873998.dkr.ecr.us-east-1.amazonaws.com \ --docker-username=AWS \ --docker-password=$(aws ecr get-login-password --region us-east-1)
- 修改你的
pod.yaml,添加imagePullSecrets字段引用刚才创建的密钥:
apiVersion: v1 kind: Pod metadata: name: dotnet-console-producer-poc.pod labels: app: helloworld spec: imagePullSecrets: - name: ecr-pull-secret containers: - name: dotnet-console-producer-pod image: 442285873998.dkr.ecr.us-east-1.amazonaws.com/dotnet-console-producer-benchmark-docker:latest ports: - containerPort: 8001
注意:ECR的认证凭证有效期只有12小时,长期使用建议部署ECR Credential Helper或者定时任务自动更新Secret,避免凭证过期导致拉取失败。
内容的提问来源于stack exchange,提问作者furzaBruta
相关产品推荐
相关产品推荐

