EKS使用Classic LB时Ingress无地址,控制器报权限错误
在Amazon EKS中创建Ingress资源后,其地址为空;执行kubectl describe ingress命令查看,返回如下错误:
Failed build model due to WebIdentityErr: failed to retrieve credentials
caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
status code: 403, request id: 5423ee08-9a72-47fe-8389-3f50ce78b0e5
查看AWS Load Balancer Controller的Pod日志,发现类似错误:
{"level":"error","ts":1674658664.611337,"logger":"controller-runtime.manager.controller.ingress","msg":"Reconciler error","name":"catch","namespace":"sa-backup","error":"WebIdentityErr: failed to retrieve credentials caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity status code: 403, request id: b4a791b1-f56b-4d4b-84b4-a7b6bc5ff8b9"}
已确认Classic Load Balancer创建正常,Ingress路由可正常工作,仅Ingress控制器存在异常。
检查IAM角色信任策略
确认AWS Load Balancer Controller使用的IAM角色信任策略中,已允许EKS集群的OIDC身份提供商执行sts:AssumeRoleWithWebIdentity操作。信任策略需包含类似配置:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:<CONTROLLER_NAMESPACE>:aws-load-balancer-controller" } } } ] }替换占位符
<AWS_ACCOUNT_ID>、<REGION>、<OIDC_ID>、<CONTROLLER_NAMESPACE>为实际环境值。验证ServiceAccount与IAM角色绑定
检查AWS Load Balancer Controller的ServiceAccount是否正确关联目标IAM角色,执行命令:kubectl get serviceaccount aws-load-balancer-controller -n <CONTROLLER_NAMESPACE> -o yaml确认存在
eks.amazonaws.com/role-arn注解,且注解值为正确的IAM角色ARN。核对IAM角色权限
确保该IAM角色已附加AWS Load Balancer Controller所需的权限策略(如官方的AWSLoadBalancerControllerIAMPolicy),策略需包含创建、管理负载均衡器的必要权限,同时无明确拒绝sts:AssumeRoleWithWebIdentity的语句。验证OIDC提供商配置
确认EKS集群已配置OIDC身份提供商,且该提供商已在IAM中注册。可通过aws eks describe-cluster --name <CLUSTER_NAME>命令查看集群OIDC issuer URL,核对IAM中的OIDC提供商地址是否完全匹配。重启控制器Pod
完成配置修正后,重启AWS Load Balancer Controller的Pod使配置生效:kubectl rollout restart deployment aws-load-balancer-controller -n <CONTROLLER_NAMESPACE>
内容的提问来源于stack exchange,提问作者Ammar Taj

