為什麼在 Amazon EKS 中使用 AWS 負載平衡器控制器時出現 "webidentityerr" 錯誤?

2 分的閱讀內容
0

當我嘗試在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用 AWS 負載平衡器控制器時收到下列錯誤訊息:"failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403 (由於出現 WebIdentityErr,無法找到現有的負載平衡器控制器:無法擷取憑證\n原因:存取遭拒:未授權執行 sts:AssumeRoleWithWebIdentity\n\狀態代碼:403)"

簡短描述

由於下列原因,當您在 Amazon EKS 中使用 AWS 負載平衡器控制器時出現此錯誤:

  • 服務帳户組態不正確
  • 服務帳戶中使用的 AWS Identity and Access Management (IAM) 角色的信任關係不正確

藉由 AWS 負載平衡器控制器,工作節點可執行這些任務。必須授予這些工作節點使用 IAM 許可存取 AWS Application Load Balancer 或 AWS Network Load Balancer 資源的權限。您可以使用服務帳戶的 IAM 角色設定 IAM 許可。或者,您可以將 IAM 許可直接附加到工作節點的 IAM 角色。如需更多詳細資訊,請參閲 Kubernetes 網站上的負載平衡器控制器安裝

解析度

服務帳户組態不正確

若要檢查服務帳戶組態是否正確設定,請執行以下步驟:

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/<AmazonEKSLoadBalancerControllerRole>

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 pod。確保套用憑證環境變數:

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

使用的 IAM 角色與服務帳戶之間的信任關係不正確

以下範例顯示了在 IAM 角色和服務帳戶之間建立信任關係時可能出現的一些常見錯誤。

範例 1:IAM 角色或信任關係未正確定義為 "sts:AssumeRoleWithWebIdentity" 動作

確認為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/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"
        }
      }
    }
  ]
}

**注意:**請確保使用您自己的值取代所有變數。

若要針對一個帳戶中的多個叢集使用相同的 IAM 角色,請定義類似下列內容的信任關係:

{
 "Version": "2012-10-17",
 "Statement": [{
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-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/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

範例 2:建立 Amazon EKS 叢集時不正確的 OIDC 提供者 ID

確保為您的 Amazon EKS 叢集正確建立並驗證 OIDC 提供者。驗證是否正確列出 OIDC 提供者 ID 和關聯的 AWS 區域。否則,您將收到 WebIdentityErr 錯誤。

範例 3:未正確輸入服務帳戶名稱或其命名空間

在更新 AWS 負載平衡器控制器部署時,請確保輸入正確的服務帳戶名稱及其命名空間。

範例 4:信任關係中缺少 "sts.amazonaws.com" 步驟

如果與 EKS pod 關聯的服務角色無法對 AssumeRoleWithWebIdentity 動作執行 STS 操作,則請更新信任關係。信任關係必須包含 "sts.amazonaws.com" 才能執行 STS 動作。

例如:

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

如需相關具有多個金鑰或值的 IAM 條件的更多資訊,請參閲建立具有多個金鑰或值的條件


AWS 官方
AWS 官方已更新 1 年前