AWS EKS容器IRSA角色扮演异常:使用EC2 IAM角色而非配置IRSA角色
排查EKS容器未使用IRSA角色而 fallback到EC2实例角色的问题
以下是逐步排查步骤:
1. 确认Pod关联了目标ServiceAccount
执行命令检查Pod是否指定了正确的ServiceAccount:
kubectl get pod <你的Pod名称> -o yaml | grep serviceAccountName
返回结果必须是serviceAccountName: web,若未指定或为其他值,Pod会使用默认ServiceAccount,而默认SA未绑定IRSA时会自动使用EC2实例角色。
2. 验证IRSA角色的信任策略配置
登录AWS IAM控制台,检查arn:aws:iam::xxxxxxxx:role/web角色的信任策略,必须包含以下核心配置:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::xxxxxxxx:oidc-provider/oidc.eks.<你的区域>.amazonaws.com/id/<集群OIDC ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<你的区域>.amazonaws.com/id/<集群OIDC ID>:sub": "system:serviceaccount:<SA所在命名空间>:web" } } } ] }
需确保:
- Federated字段的OIDC提供商ARN与你的EKS集群OIDC issuer一致(可通过
aws eks describe-cluster --name <集群名称> --query "cluster.identity.oidc.issuer"获取) - Condition中的sub字段包含ServiceAccount所在的正确命名空间
3. 检查EKS集群是否已配置OIDC提供商
执行命令确认集群的OIDC issuer存在:
aws eks describe-cluster --name <集群名称> --query "cluster.identity.oidc.issuer"
若返回null,说明未创建OIDC提供商,需先创建(这是IRSA生效的前提条件)。
4. 验证容器内IRSA相关环境变量与挂载
进入容器执行以下检查:
- 查看是否存在IRSA核心环境变量:
应分别返回echo $AWS_ROLE_ARN && echo $AWS_WEB_IDENTITY_TOKEN_FILEarn:aws:iam::xxxxxxxx:role/web和/var/run/secrets/eks.amazonaws.com/serviceaccount/token - 检查挂载目录是否存在有效文件:
应包含ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token和ca.crt文件,若缺失则IRSA未正确注入凭证。
5. 确认AWS CLI/SDK版本支持Web Identity Credentials
容器内的AWS CLI版本需≥1.16.156,SDK需对应支持Web Identity的版本。执行命令检查版本:
aws --version
若版本过低,需升级AWS CLI或SDK,否则会自动 fallback到EC2实例元数据服务(IMDS)获取凭证。
6. 检查Pod是否禁用IMDS(可选)
若Pod未禁用IMDS,且EC2实例角色有IMDS访问权限,当IRSA失效时会自动使用EC2角色。可在Pod配置中添加以下内容强制使用IRSA:
spec: serviceAccountName: web volumes: - name: aws-iam-token projected: sources: - serviceAccountToken: path: token expirationSeconds: 86400 audience: sts.amazonaws.com containers: - name: <你的容器名称> volumeMounts: - name: aws-iam-token mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount readOnly: true env: - name: AWS_ROLE_ARN value: arn:aws:iam::xxxxxxxx:role/web - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
7. 确认ServiceAccount与Pod同属一个命名空间
IRSA信任策略的sub字段包含命名空间信息,若Pod和ServiceAccount不在同一命名空间,信任策略匹配失败,IRSA无法生效。
内容的提问来源于stack exchange,提问作者sebastian
相关产品推荐
相关产品推荐

