Global outage event
If you’re experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
如何對 Amazon EKS 中的 OIDC 提供者和 IRSA 進行疑難排解?
我的 Pod 無法將 AWS Identity and Access Management (IAM) 角色權限與 Amazon Elastic Kubernetes Service (Amazon EKS) AWS 帳戶權杖一起使用。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
檢查您的叢集是否有現有的 IAM OIDC 提供者
如果 OpenID Connect (OIDC) 提供者不存在,您會收到類似以下內容的錯誤:
"WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400"
若要檢查您是否有現有的 IAM OIDC 提供者,請完成以下步驟:
-
若要檢查叢集的 OIDC 提供者網址,請執行以下 describe-cluster AWS CLI 命令:
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 提供者,請執行以下 list-open-id-connect-providers 命令:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E**注意:**將 EXAMPLED539D4633E53DE1B716D3041E 替換為您從上一個命令收到的 OIDC 提供者網址。
如果命令傳回輸出,則表示您已經有叢集的提供者。如果命令沒有傳回輸出,則必須建立 IAM OIDC 提供者。輸出範例:"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
檢查您的 IAM 角色是否具有所需的權限和附加的 IAM 政策
請完成下列步驟:
- 開啟 IAM console (IAM 主控台)。
- 在導覽窗格中,選擇 Roles (角色)。
- 選擇與您的 Kubernetes 服務帳戶相關聯的角色。
- 選擇 Permissions (權限) 索引標籤。然後,檢查附加到角色的政策,以確認其包含組態所需的權限。
- 選擇 Trust relationships (信任關係) 索引標籤。然後,確認您的 IAM 政策的格式是否與下列 JSON 政策的格式相符:
或者,執行以下 get-role 命令來檢查您的信任關係:{ "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" } } } ] }
**注意:**將 EKS-IRSA 替換為您服務帳戶 (IRSA) 角色的 IAM 角色名稱。aws iam get-role --role-name 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
**注意:**將 YOUR_NAMESPACE 取代為您的 Kubernetes 命名空間。
輸出範例:
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: irsa Namespace: 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
檢查註釋,以確認 IAM 角色是否正確。如果不正確,請執行以下命令來編輯服務帳戶:
kubectl edit sa -n NAMESPACE
注意: 將 NAMESPACE 替換為您的命名空間。
然後,使用正確的 IAM 角色更新註釋的值。
確認您是否已正確指定 Pod 中的 serviceAccountName
若要確認 serviceAccountName,請執行以下命令:
kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
**注意:**將 POD_NAME 替換為您的 Kubernetes Pod,並將 YOUR_NAMESPACE 替換為您的命名空間。
輸出範例:
serviceAccountName: irsa
如果輸出中的值是不正確的服務帳戶名稱,請使用正確的名稱編輯部署資訊清單。然後,重新部署部署資訊清單。
檢查環境變數和權限
若要檢查 Pod 的環境變數,請執行以下命令:
kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
輸出範例:
AWS_REGION=ap-southeast-2 AWS_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
確認輸出列出您的服務帳戶。如果您沒有服務帳戶,請參閱 Kubernetes 網站上的為 Pod 設定服務帳戶。
確認應用程式是否使用支援的 AWS SDK
您的 AWS SDK 版本必須高於或等於 AWS SDK 所需的版本。
重新建立 Pod
如果您在套用 IRSA 之前建立了 Pod,請執行以下命令重新建立 Pod:
kubectl rollout restart deploy nginx
輸出範例:
deployment.apps/nginx restarted
對於 daemonset 或 deployment 部署,執行以下命令:
kubectl rollout restart deploy DEPLOYMENT_NAME
如果您只建立了一個 Pod,則必須刪除該 Pod 並重新建立。請完成下列步驟:
- 若要刪除 Pod,請執行以下命令:
**注意:**將 POD_NAME 替換為您 Pod 的名稱。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 身分提供者,請執行以下 get-open-id-connect-provider 命令:
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
**注意:**將 ACCOUNT_ID 替換為您的帳戶 ID,將 AWS_REGION 替換為您的區域,並將 EXAMPLED539D4633E53DE1B716D3041E 替換為您的 OIDC 網址提供者。
輸出範例:
{ "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": [] }
在輸出中,確認 ClientIDList 為 sts.amazonaws.com。如果不是,請將身分提供者新增至角色,並在 Audience (對象) 中輸入 sts.amazonaws.com。
確認您是否設定了正確的指紋
如果您在 IAM OIDC 中設定的指紋不正確,則會收到以下錯誤:
"failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"
若要自動設定正確的指紋,請使用 eksctl 或 Amazon EKS 主控台建立 IAM 身分提供者。如需取得指紋的其他方法,請參閱取得 OpenID Connect 身分提供者的指紋。
(僅限 AWS 中國區域) 檢查 AWS_DEFAULT_REGION 環境變數
若要將套用 IRSA 的 Pod 或 daemonset 部署到 AWS 中國區域的叢集,您必須在 Pod 規格中設定 AWS_DEFAULT_REGION。如果您未設定 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" ...
或者,執行以下命令來設定環境變數:
kubectl set env deployment deployment_name AWS_DEFAULT_REGION=example_region -n NAMESPACE"
**注意:**將 deployment_name 替換為您的部署名稱,將 example_region 替換為您的 AWS 中國區域,並將 NAMESPACE 替換為您的命名空間。
相關內容
- 已提問 1 年前
- 已提問 3 年前
- 已提問 2 年前
- 已提問 2 年前

