AWS EKS中Pod误用节点组角色而非服务账户角色问题排查
EKS 1.22 集群Pod配置IRSA后仍使用节点组角色的故障原因排查
- 高优先级静态凭证抢占凭证链顺位
AWS Java SDK 1.x版本默认凭证提供者链有固定优先级,硬编码的AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY环境变量、应用运行用户家目录下~/.aws/credentials文件内的静态凭证,优先级均高于WebIdentity类型的IRSA凭证。排查时先在Pod内执行env | grep -E 'AWS_ACCESS_KEY|AWS_SECRET_KEY'确认无硬编码密钥,再检查容器内对应路径的aws配置文件是否存在预存凭证,只要存在这类配置,SDK会直接跳过IRSA凭证加载逻辑。 - 自定义凭证链遗漏IRSA对应凭证实现
1.12.233版本的IRSA原生支持仅对SDK默认凭证提供者链生效。如果业务代码手动构建了自定义凭证链,且没有显式加入WebIdentityTokenFileCredentialsProvider实例,SDK不会主动读取AWS_ROLE_ARN和AWS_WEB_IDENTITY_TOKEN_FILE环境变量,最终会顺着凭证链落到EC2实例元数据服务,读取节点组绑定的角色凭证。 - Web身份令牌文件读取权限不足触发静默降级
EKS自动挂载的IRSA token文件默认路径为/var/run/secrets/eks.amazonaws.com/serviceaccount/token,默认权限为0600、属主为root。如果Pod安全上下文配置了非root用户运行应用,且未设置匹配的fsGroup让运行用户拥有文件读取权限,应用进程会因权限不足无法读取token内容。AWS Java SDK遇到这类读取失败时不会抛出致命错误,会自动跳过IRSA凭证逻辑,降级使用后续顺位的凭证源。排查时可切换到应用运行的用户身份,执行cat $AWS_WEB_IDENTITY_TOKEN_FILE验证文件可读性。 - SDK被显式禁用WebIdentity凭证加载能力
检查应用启动的JVM参数、容器环境变量中是否存在AWS_DISABLE_WEB_IDENTITY_TOKEN_CREDENTIALS=true或com.amazonaws.sdk.disableWebIdentityTokenCredentials=true配置,只要该开关被打开,SDK会完全跳过IRSA凭证的加载流程。 - IRSA角色信任策略校验失败触发降级
环境变量正常不代表IRSA链路通畅,如果服务账户绑定的IAM角色信任策略配置错误——比如集群关联的IAM OIDC提供商未正确注册、信任策略内aud字段不为sts.amazonaws.com、sub字段匹配的服务账户命名空间/名称与实际不符,SDK调用STS执行AssumeRoleWithWebIdentity时会被权限拒绝。此时SDK不会中断应用启动,会自动降级到节点组角色凭证。排查时可在Pod内手动执行STS请求验证链路:aws sts assume-role-with-web-identity --role-arn $AWS_ROLE_ARN --role-session-name irsa-test --web-identity-token file://$AWS_WEB_IDENTITY_TOKEN_FILE
容器内无AWS CLI的话,可以将应用的com.amazonaws.auth日志级别调整为DEBUG,从日志中直接看到凭证加载全流程的具体报错。
内容的提问来源于stack exchange,提问作者Pierre Leonard
相关产品推荐
相关产品推荐

