在EKS Pod的Docker容器中假定服务账号角色时遇到的问题
解决方案:EKS Pod内Docker容器使用ServiceAccount角色而非节点角色
1. 确认容器正确挂载了EKS服务账号凭据卷
EKS会自动为绑定IAM角色的ServiceAccount挂载凭据卷,但如果容器配置缺失或覆盖了该挂载,就会导致无法获取角色凭据:
- 检查Pod的YAML配置,确保包含以下
volumes和volumeMounts(自动注入场景无需手动编写,但自定义容器时要确认挂载未被移除):
spec: containers: - name: your-container volumeMounts: - name: aws-iam-token mountPath: "/var/run/secrets/eks.amazonaws.com/serviceaccount/" readOnly: true volumes: - name: aws-iam-token projected: sources: - serviceAccountToken: path: token expirationSeconds: 86400 audience: "sts.amazonaws.com"
- 进入容器内部,验证凭据路径存在且进程用户有读取权限:
# 进入容器 kubectl exec -it your-pod -- /bin/bash # 检查路径和权限 ls -l /var/run/secrets/eks.amazonaws.com/serviceaccount/
如果权限不足,可在Dockerfile中添加RUN chmod 755 /var/run/secrets/eks.amazonaws.com/serviceaccount/,或调整容器运行用户为有权限的用户。
2. 确保Boto3能正确识别服务账号凭据
Boto3按优先级查找凭据,若容器内存在冲突环境变量或SDK版本过旧,会回退到节点角色:
- 禁止设置静态凭据环境变量:容器内不要配置
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,否则会优先使用这些静态凭据,跳过服务账号角色。 - 升级Boto3和Botocore版本:旧版本SDK可能不支持EKS服务账号角色,在Dockerfile中添加升级命令:
RUN pip install --upgrade boto3 botocore
- 验证自动注入的环境变量:EKS会自动向容器注入
AWS_WEB_IDENTITY_TOKEN_FILE和AWS_ROLE_ARN,进入容器检查:
echo $AWS_WEB_IDENTITY_TOKEN_FILE echo $AWS_ROLE_ARN
如果变量缺失,说明Pod的ServiceAccount未正确绑定IAM角色,或自动注入被禁用。
3. 确认Pod与ServiceAccount的关联正确
- 检查Pod的YAML,确保
spec.serviceAccountName指向已绑定IAM角色的ServiceAccount:
spec: serviceAccountName: your-linked-service-account
- 验证ServiceAccount的IAM角色绑定:
kubectl describe serviceaccount your-linked-service-account
查看Annotations中的eks.amazonaws.com/role-arn是否为目标IAM角色的ARN,且该角色的信任策略已允许EKS OIDC身份提供商访问。
4. 确保容器网络能访问STS服务
Boto3需要调用AWS STS服务获取临时凭据,若容器无法访问STS端点,会回退到节点角色:
- 检查集群VPC是否配置了STS的VPC端点(推荐),或确认Pod的网络策略允许出站到
sts.amazonaws.com。 - 进入容器测试STS连通性:
curl https://sts.amazonaws.com
内容的提问来源于stack exchange,提问作者Muneeshpandi
相关产品推荐
相关产品推荐

