为什么我在 Amazon EKS 中使用 AWS 负载均衡器控制器时收到了“webidentityerr”错误?
当我尝试在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用 AWS 负载均衡器控制器时,我收到了“WebIdentityErr”错误消息。
简短描述
当您在 Amazon EKS 中使用 AWS 负载均衡器控制器时,可能会看到下列错误:
“由于 WebIdentityErr,无法找到现有负载均衡器:无法检索凭证\n原因是: AccessDenied: 无权执行 sts:AssumeRoleWithWebIdentity\n\t状态代码: 403”
出现该错误的原因如下:
- 服务账户配置不正确
- 您在服务账户中使用的 AWS Identity and Access Management(IAM)角色的信任关系不正确
使用 AWS 负载均衡器控制器,Worker 节点会执行任务。您必须使用 IAM 权限向这些 Worker 节点授予对应用程序负载均衡器或网络负载均衡器资源的访问权限。如需设置 IAM 权限,请使用服务账户的 IAM 角色。或者,将 IAM 权限直接附加到 Worker 节点的 IAM 角色。有关详细信息,请参阅 Kubernetes 网站上的负载均衡器控制器安装。
解决方法
服务账户配置不正确
如需检查您是否正确配置了服务账户,请完成下面的步骤:
1. 验证您的部署中定义的服务账户名称:
kubectl describe deploy LOAD_BALANCER_CONTROLLER -n kube-system | grep -i "Service Account"
2. 描述服务账户:
kubectl describe sa LOAD_BALANCER_CONTROLLER -n kube-system
3. 验证 IAM 角色的服务账户注释:
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
4. 如果此注释缺失或不正确,请更新注释。务必将 IAM 角色正确关联到服务账户:
kubectl annotate serviceaccount -n SERVICE_ACCOUNT_NAMESPACE SERVICE_ACCOUNT_NAME \ eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
5. 删除并重新创建与服务账户关联的任何现有 Amazon EKS 容器组。务必应用凭证环境变量:
kubectl delete pods AWS_LOAD_BALANCER_CONTROLLER_POD -n KUBBE_SYSTEM
所使用的 IAM 角色与服务账户之间的信任关系不正确
以下示例显示了在您的 IAM 角色与服务账户之间建立信任关系时出现的一些常见错误:
示例 1: 没有为“sts:AssumeRoleWithWebIdentity”操作正确定义 IAM 角色或信任关系
验证是否为 sts:AssumeRoleWithWebIdentity 操作(而不是 sts:AssumeRole 操作)正确定义了信任关系。
下列示例是未正确定义的信任关系:
{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "xxxxx.amazonaws.com" }, "Action": "sts:AssumeRole" }
若要更正此问题,请定义 sts:AssumeRoleWithWebIdentity 操作的信任关系:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC-PROVIDER_ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT", "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com" } } } ] }
**注意:**务必将所有变量替换为您自己的值。
如需对一个账户中的多个集群使用相同 IAM 角色,请按照以下示例定义信任关系:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::AWS-ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC-PROVIDER_ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT", "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com" } } }, { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT", "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com" } } } ] }
示例 2: 创建 Amazon EKS 集群时,OIDC 提供商 ID 不正确
为您的 Amazon EKS 集群正确创建和验证 OpenID Connect(OIDC)提供商。验证是否正确列出了 OIDC 提供商 ID 和关联的 AWS 区域。否则,您会收到 WebIdentityErr 错误。
示例 3: 未正确输入服务账户名称或其命名空间
当您更新 AWS 负载均衡器控制器部署时,请输入正确的服务账户名称及其命名空间。
示例 4: 信任关系中缺少“sts.amazonaws.com”步骤
如果与您的 EKS 容器组关联的服务角色无法对 AssumeRoleWithWebIdentity 操作执行 STS 操作,请更新信任关系。如需执行 STS 操作,信任关系必须包括 sts.amazonaws.com:
"Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_ACCOUNT", "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com" } }
有关具有多个键或值的 IAM 条件的详细信息,请参阅创建具有多个键或值的条件。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 1 年前