如何對 Amazon EKS 中的 IRSA 錯誤進行疑難排解?
當我將適用於服務帳戶的 AWS Identity and Access Management (IAM) 角色 (IRSA) 與 Amazon Elastic Kubernetes Service (Amazon EKS) 搭配使用時發生錯誤。
解決方法
檢查 IAM ARN 的格式
如果您以錯誤的方式格式化服務帳戶註解中的 IAM ARN,會收到下列錯誤:
"An error occurred (ValidationError) when calling the AssumeRoleWithWebIdentity
operation: Request ARN is invalid"
以下是格式不正確的 ARN 範例:
eks.amazonaws.com/role-arn: arn:aws:iam::::1234567890:role/example
由於 ARN 具有額外的冒號 (:),因此 ARN 格式不正確會導致錯誤訊息。若要驗證正確的 ARN 格式,請參閱 IAM ARN。
檢查您的 AWS 帳戶是否具有 IAM OIDC 供應商
如果您未建立 OpenID Connect (OIDC) 供應商,會收到下列錯誤:
"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.region.amazonaws.com/id/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
若要對此錯誤進行疑難排解,請取得 IAM OIDC 供應商 URL:
aws eks describe-cluster --name cluster name --query "cluster.identity.oidc.issuer" --output text
**注意:**將 cluster name 取代為您的叢集名稱。
輸出看起來類似下列範例:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
若要列出 IAM OIDC 供應商,請執行下列命令:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
**注意:**將 EXAMPLED539D4633E53DE1B716D3041E 取代為 IAM OIDC 供應商 URL。
如果 OIDC 供應商不存在,請執行下列 eksctl 命令來建立 OIDC 供應商:
eksctl utils associate-iam-oidc-provider --cluster cluster name --approve
**注意:**將 cluster name 取代為您的叢集名稱。
您也可以使用 AWS 管理主控台為叢集建立 IAM OIDC 供應商。
驗證 IAM OIDC 供應商的對象
當您建立 IAM OIDC 供應商時,必須使用 sts.amazonaws.com 作為您的對象。如果對象不正確,您會收到下列錯誤:
"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience"
若要檢查 IAM OIDC 供應商的對象,請執行下列命令:
aws iam get-open-id-connect-provider --open-id-connect-provider-arn ARN-of-OIDC-provider
**注意:**將 ARN-of-OIDC-provider 取代為 OIDC 供應商的 ARN。
在 ClientIDList 參數下,輸出必須顯示 sts.amazonaws.com。若要使用 Amazon EKS 主控台檢查對象,請完成下列步驟:
- 開啟 Amazon EKS 主控台。
- 選取叢集的名稱,然後選擇概觀標籤。
- 在詳細資訊區段中,記下 OIDC 供應商 URL 的值。
- 開啟 IAM 主控台。
- 在導覽窗格的存取管理下,選擇身分供應商。
- 選取與叢集 URL 相符的供應商。
若要變更對象,請完成下列步驟:
- 開啟 IAM 主控台。
- 在導覽窗格的存取管理下,選擇身分供應商。
- 選取與叢集 URL 相符的供應商。
- 選擇動作,然後選擇新增對象。
- 新增 sts.amazonaws.com。
確認您已使用根憑證指紋建立 IAM OIDC 資源
如果您未使用根憑證指紋來建立 OIDC 供應商,則會收到下列錯誤:
"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"
**注意:**非根憑證指紋每年都會更新。根憑證指紋每十年更新一次。最佳實務是在建立 IAM OIDC 時使用根憑證指紋。
例如,您使用下列其中一項服務來建立 IAM OIDC:
- AWS Command Line Interface (AWS CLI)
- AWS Tools for PowerShell
- IAM API
在此情況下,您必須手動取得指紋。如果您已在 IAM 主控台中建立 IAM OIDC,最佳實務是手動取得指紋。使用此指紋來確認主控台已取得正確的 IAM OIDC。
若要尋找根憑證指紋和到期日,請執行下列命令:
echo | openssl s_client -servername oidc.eks.your-region-code.amazonaws.com -showcerts -connect oidc.eks.your-region-code.amazonaws.com:443 2>/dev/null | awk '/-----BEGIN CERTIFICATE-----/{cert=""} {cert=cert $0 "\n"} /-----END CERTIFICATE-----/{last_cert=cert} END{printf "%s", last_cert}' | openssl x509 -fingerprint -noout -dates | sed 's/://g' | awk -F= '{print tolower($2)}'
**注意:**將 your-region-code 取代為叢集所在的 AWS 區域。
輸出範例:
9e99a48a9960b14926bb7f3b02e22da2b0ab7280 sep 2 000000 2009 gmt jun 28 173916 2034 gmt
在前面的輸出中,9e99a48a9960b14926bb7f3b02e22da2b0ab7280 是指紋。sep 2 000000 2009 gmt 是憑證的開始日期,而 jun 28 173916 2034 是憑證的到期日。
檢查 IAM 角色信任政策的組態
如果您錯誤設定 IAM 角色的信任政策,會收到下列錯誤:
"An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity"
若要解決此問題,請確定您使用正確的 IAM OIDC 供應商。如果 IAM OIDC 供應商正確無誤,請檢閱 IAM 角色來查看信任政策的條件是否正確設定。
確認 Pod 身分識別 Webhook 組態存在且有效
Pod 身分識別 Webhook 會注入必要的環境變數和投射磁碟區。如果您不小心刪除或變更了 Webhook 組態,IRSA 就會停止工作。
若要確認 Webhook 組態已存在且有效,請執行下列命令:
kubectl get mutatingwebhookconfiguration pod-identity-webhook -o yaml
如果 pod-identity-webhook 組態不存在,請執行下列命令建立此組態:
CLUSTER_CA=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query 'cluster.certificateAuthority.data' --output text); cat << EOF | kubectl apply -f - apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: pod-identity-webhook webhooks: - name: iam-for-pods.amazonaws.com clientConfig: url: "https://127.0.0.1:23443/mutate" caBundle: $CLUSTER_CA failurePolicy: Ignore rules: - operations: [ "CREATE" ] apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] scope: "*" reinvocationPolicy: IfNeeded sideEffects: None admissionReviewVersions: ["v1beta1"] EOF
**注意:**將 CLUSTER_NAME 取代為您的叢集名稱,並將 REGION_CODE 取代為您的叢集區域。
確認 Pod 身分識別 Webhook 將環境變數注入使用 IRSA 的 Pod 中
若要確認 Pod 身分識別 Webhook 將環境變數注入使用 IRSA 的 Pod 中,請執行下列其中一個命令:
kubectl get pod <pod-name> -n <ns> -o yaml | grep aws-iam-token
-或-
kubectl get pod <pod-name> -n <ns> -o yaml | grep AWS_WEB_IDENTITY_TOKEN_FILE
確認您使用的是受支援的 AWS SDK
檢閱 AWS SDK。確定您使用 AWS SDK 版本,該版本可讓您透過 OIDC Web 身分權杖檔案擔任 IAM 角色。
相關資訊
相關內容
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- 已提問 3 個月前lg...
- 已提問 10 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前