當我嘗試在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用 AWS 負載平衡器控制器時,我會收到 "WebIdentityErr" 錯誤訊息。
簡短說明
當您在 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"
發生此錯誤的原因如下:
- 服務帳戶組態不正確
- 您在服務帳戶中使用的 AWS Identity and Access Management (IAM) 角色的信任關係不正確
當您使用 AWS 負載平衡器控制器時,工作節點會執行任務。您必須使用 IAM 許可來授予這些工作節點對 Application Load Balancer 或 Network Load Balancer 資源的存取權。若要設定 IAM 許可,請使用服務帳戶的 IAM 角色。或者,直接將 IAM 許可連接到工作節點的 IAM 角色。如需詳細資訊,請參閱 Kubernetes 網站上的 AWS 負載平衡器控制器。
解決方法
服務帳戶組態不正確
若要檢查您是否已正確設定服務帳戶,請完成下列步驟:
-
驗證部署中定義的服務帳戶名稱:
kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
-
描述服務帳戶:
kubectl describe sa aws-load-balancer-controller -n kube-system
-
驗證 IAM 角色的服務帳戶註釋:
Annotations: eks.amazonaws.com/role-arn:arn:aws:iam::xxxxxxxxxx:role/ AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
-
如果註釋遺失或不正確,請更新註釋。請確定您已正確關聯 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
-
重新啟動 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 條件的詳細資訊,請參閱具有多個內容金鑰或值的條件。