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

上次更新日期:2021 年 12 月 8 日

當我嘗試在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用 AWS 負載平衡器控制器時,收到以下錯誤訊息:

「由於出現 WebIdentityErr,無法找到現有的負載平衡器控制器:無法擷取憑證\n原因:存取遭拒:未授權執行 sts:AssumeRoleWithWebIdentity\n\狀態代碼:403」

如何解決此錯誤?

簡短描述

在 Amazon EKS 中使用 AWS 負載平衡器控制器時,WebIdentityErr:無法擷取憑證,原因如下:存取遭拒,錯誤可能由於以下原因發生:

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

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

解析度

服務帳户組態不正確

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

1.    驗證部署中定義的服務帳户 (SA) 名稱:

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 角色的 SA 註解:

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>

使用的 AWS Identity Access Management (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>"        
        }
      }
    }
  ]
}

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

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

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

範例 3:設定 AWS 負載平衡器控制器部署時,服務帳戶 (SA) 名稱及其命名空間不正確

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

範例 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 條件的更多資訊,請參閲建立具有多個金鑰或值的條件


此文章是否有幫助?


您是否需要帳單或技術支援?