EKS集群部署Docker Registry v2用服务账号对接S3存储出现403访问拒绝问题
问题根因
Docker Registry v2的S3存储驱动默认凭证检索顺序仅包含静态AK/SK、EC2实例元数据角色,默认未启用EKS IRSA(IAM角色关联服务账号)依赖的WebIdentityToken凭证链。你在Pod内执行aws cli命令正常,是因为aws cli原生支持WebIdentity凭证自动检索,而Registry进程无法主动读取IRSA注入的凭证,因此返回403;直接配置AK/SK时走静态凭证逻辑,因此功能正常。
解决方案
按以下步骤逐一配置验证即可解决:
- 确认Docker Registry版本 ≥ 2.7.1,该版本起底层依赖的AWS Go SDK已支持WebIdentity凭证提供者
- 移除Registry配置文件中
s3.accesskey、s3.secretkey两个配置项,即便留空也会导致驱动优先尝试静态空凭证,触发鉴权失败 - 给Registry的Deployment资源添加以下环境变量,强制AWS SDK加载IRSA注入的凭证:
env: - name: AWS_WEB_IDENTITY_TOKEN_FILE value: "/var/run/secrets/eks.amazonaws.com/serviceaccount/token" - name: AWS_ROLE_ARN value: "arn:aws:iam::[你的AWS账号ID]:role/[你关联的IAM角色名]" - name: AWS_REGION value: "[你的S3桶所在区域,如ap-northeast-1]" - 检查IAM角色的权限策略,确认已包含Docker Registry运行所需的最小S3权限:
{ "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload" ], "Resource": [ "arn:aws:s3:::[你的桶名]", "arn:aws:s3:::[你的桶名]/*" ] } - 检查IAM角色的信任策略,确认已正确信任你的Registry服务账号:
{ "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::[你的AWS账号ID]:oidc-provider/[EKS集群的OIDC提供商ID]" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "[EKS集群的OIDC提供商ID]:sub": "system:serviceaccount:[服务账号所在命名空间]:[Registry服务账号名称]" } } }
内容的提问来源于stack exchange,提问作者Torello Querci
相关产品推荐
相关产品推荐

