Knowledge Center Monthly Newsletter - July 2025
Stay up to date with the latest from the Knowledge Center. See all new Knowledge Center articles published in the last month, and re:Post’s top contributors.
如何對 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 年前
- 已提問 2 年前
- 已提問 2 年前
- 已提問 2 年前