如何對 Amazon EKS 中的 IRSA 錯誤進行疑難排解?

3 分的閱讀內容
0

當我將適用於服務帳戶的 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 主控台檢查對象,請完成下列步驟:

  1. 開啟 Amazon EKS 主控台
  2. 選取叢集的名稱,然後選擇概觀標籤。
  3. 詳細資訊區段中,記下 OIDC 供應商 URL 的值。
  4. 開啟 IAM 主控台
  5. 在導覽窗格的存取管理下,選擇身分供應商
  6. 選取與叢集 URL 相符的供應商

若要變更對象,請完成下列步驟:

  1. 開啟 IAM 主控台
  2. 在導覽窗格的存取管理下,選擇身分供應商
  3. 選取與叢集 URL 相符的供應商
  4. 選擇動作,然後選擇新增對象
  5. 新增 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 角色。

相關資訊

為什麼無法在 Amazon EKS Pod 中使用適用於服務帳戶的 IAM 角色?

如何對 Amazon EKS 中的 OIDC 供應商和 IRSA 進行疑難排解?

AWS 官方
AWS 官方已更新 2 個月前