为什么我在 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 角色。或者,将 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 官方
AWS 官方已更新 1 年前
没有评论