如何對 Amazon EKS 中的 OIDC 供應商和 IRSA 進行疑難排解?
我的 Pod 不能搭配使用 AWS Identity and Access Management (IAM) 角色權限與 Amazon Elastic Kubernetes Service (Amazon EKS) 帳戶權杖。
解決方法
檢查您是否具有叢集的現有 IAM OIDC 供應商
如果供應商已存在,則會收到類似下列的錯誤: "WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for code: 400";
若要檢查您是否具有現有的 IAM OIDC 供應商,請完成下列步驟:
-
檢查叢集的 OIDC 供應商 URL:
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
範例輸出:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
-
列出您帳戶中的 IAM OIDC 供應商。將 EXAMPLED539D4633E53DE1B716D3041E 取代為從上一個命令收到的值:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
範例輸出:
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
如果命令傳回輸出,則表示您已經有叢集的供應商。如果命令沒有傳回輸出,則必須建立 IAM OIDC 供應商。
檢查您的 IAM 角色是否具有所需的權限和附加的 IAM 政策
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
若要檢查您的 IAM 角色是否具有必要的權限,請完成下列步驟:
- 開啟 IAM 主控台。
- 在導覽窗格中,選擇角色。
- 選取您要驗證的角色。
- 在權限標籤下,驗證所需的政策已附加至角色。
- 驗證 IAM 角色信任關係已正確設定。
若要檢查您的 IAM 角色是否有附加的政策,請完成下列步驟:
-
開啟 IAM 主控台。
-
在導覽窗格中,選擇角色。
-
選取您要檢查的角色。
-
選擇信任關係標籤。驗證政策的格式與下列 JSON 政策的格式相符:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
若要驗證信任關係,請在 AWS Command Line Interface (AWS CLI) 中執行 get-role 命令:
$ aws iam get-role --role-name EKS-IRSA
**注意:**使用您的 IAM 角色名稱取代 EKS-IRSA。
在輸出 JSON 中,尋找 AssumeRolePolicyDocument 部分。
範例輸出:{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } }
**注意:**根據您的使用情況,更新 AWS 區域、Kubernetes 服務帳戶名稱和 Kubernetes 命名空間。
檢查您是否建立了服務帳戶
執行下列命令:
$ kubectl get sa -n YOUR_NAMESPACE
**注意:**使用您的 Kubernetes 命名空間取代 YOUR_NAMESPACE。
範例輸出:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
如果您沒有服務帳戶,請參閱 Kubernetes 網站上的為 Pod 設定服務帳戶。
驗證服務帳戶是否具有正確的 IAM 角色註釋
若要驗證您的服務帳戶是否具有正確的 IAM 角色註釋,請執行下列命令:
$ kubectl describe sa irsa -n YOUR_NAMESPACE
**注意:**使用您的 Kubernetes 服務帳戶名稱取代 irsa,並且使用您的 Kubernetes 命名空間取代 YOUR_NAMESPACE。
範例輸出:
Name: irsaNamespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
驗證您是否已正確指定 Pod 中的 serviceAccountName
若要驗證 serviceAccountName,請執行下列命令:
$ kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
**注意:**使用您的 Kubernetes Pod 和命名空間取代 POD_NAME 和 YOUR_NAMESPACE。
範例輸出:
serviceAccountName: irsa
檢查環境變數和權限
在 Pod 的環境變數中找到 AWS_ROLE_ARN 和 AWS_WEB_IDENTITY_TOKEN_FILE:
$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
範例輸出:
AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
驗證應用程式是否使用支援的 AWS SDK
SDK 版本必須大於或等於下列值:
Java (Version 2) — 2.10.11Java — 1.11.704 Go — 1.23.13 Python (Boto3) — 1.9.220 Python (botocore) — 1.12.200 AWS CLI — 1.16.232 Node — 3.15.0 Ruby — 2.11.345 C++ — 1.7.174 .NET — 3.3.659.1 PHP — 3.110.7
若要檢查最新支援的 SDK 版本,請參閱使用支援的 AWS SDK。
重新建立 Pod
如果您在套用 IRSA 之前建立了 Pod,請執行下列命令以重新建立 Pod:
$ kubectl rollout restart deploy nginx
範例輸出:
deployment.apps/nginx restarted
對於 daemonsets 或 statefulsets 部署,請執行下列命令:
$ kubectl rollout restart deploy DEPLOYMENT_NAME
如果您只建立了一個 Pod,則必須刪除該 Pod 並重新建立它:
- 執行下列命令以刪除 Pod:
**注意:**使用您的 Pod 名稱取代 POD_NAME。$ kubectl delete pod POD_NAME
- 執行下列命令以重新建立 Pod:
**注意:**使用您的 Kubernetes 資訊清單檔案路徑和檔案名稱取代 SPEC_FILE。$ kubectl apply -f SPEC_FILE
驗證對象是否正確
如果您使用不正確的對象建立了 OIDC 供應商,則會收到下列錯誤: "Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience"。
檢查叢集的 IAM 身分提供者。您的 ClientIDList 是 sts.amazonaws.com:
$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
範例輸出:
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
驗證您是否設定了正確的指紋
如果在 IAM OIDC 中設定的指紋不正確,則會收到下列錯誤:"failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"。
若要自動設定正確的指紋,請使用 eksctl 或 AWS 管理主控台建立 IAM 身分提供者。如需取得指紋的其他方法,請參閱取得 OpenID Connect 身分提供者的指紋。
對於 AWS 中國區域,請檢查 AWS_DEFAULT_REGION 環境變數
對於部署至 AWS 中國區域中叢集的 IRSA 套用之 Pod 或 daemonset,請在 Pod 規格中設定 AWS\ _DEFAULT\ _REGION 環境變數。如果您沒有設定此變數,則 Pod 或 daemonset 可能會收到下列錯誤: "An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid"。
若要將 AWS\ _DEFAULT\ _REGION 環境變數新增至您的 Pod 或 daemonset 規格,請執行類似下列範例的命令:
apiVersion: apps/v1kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
相關內容
- 已提問 1 年前lg...
- 已提問 5 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前