跳至内容

为什么我在 Amazon EKS 中使用 AWS 负载均衡器控制器时收到了“WebIdentityErr”错误?

2 分钟阅读
0

当我尝试在 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 角色。或者,直接向 Worker 节点的 IAM 角色增加 IAM 权限。有关更多信息,请参阅 Kubernetes 网站的 AWS Load Balancer Controller installation

解决方法

服务账户配置不正确

要检查您是否正确配置了服务账户,请按照以下步骤操作:

  1. 验证您的部署中定义的服务账户名称:

    kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
  2. 描述服务账户:

    kubectl describe sa aws-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. 重新启动 AWS 负载均衡器控制器部署以刷新容器组(pod)凭证。

    kubectl rollout restart deployment/aws-load-balancer-controller -n kube-system

所使用的 IAM 角色与服务账户之间的信任关系不正确

当您在 IAM 角色与服务账户之间建立信任关系时,可能会遇到问题。查看在建立信任关系时出现的以下常见错误示例。

没有为“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"
        }
      }
    }
  ]
}

当您创建 Amazon EKS 集群时,OIDC 提供商 ID 不正确

为您的 Amazon EKS 集群创建和验证 OpenID Connect(OIDC)提供商。验证是否正确列出了 OIDC 提供商 ID 和关联的 AWS 区域。否则,您会收到 WebIdentityErr 错误。

未正确输入服务账户名称或其命名空间

查看您的 AWS 负载均衡器控制器部署。当您更新部署时,请确保输入正确的服务账户名称及其命名空间。

信任关系中缺少“sts.amazonaws.com”步骤

如果与您的 EKS 容器组(pod)关联的服务角色无法对 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 官方已更新 2 年前