Skip to content

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

4 分的閱讀內容
0

我的 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 提供者,請完成以下步驟:

  1. 若要檢查叢集的 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
  2. 若要列出您帳戶中的 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 政策

請完成下列步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 在導覽窗格中,選擇 Roles (角色)。
  3. 選擇與您的 Kubernetes 服務帳戶相關聯的角色。
  4. 選擇 Permissions (權限) 索引標籤。然後,檢查附加到角色的政策,以確認其包含組態所需的權限。
  5. 選擇 Trust relationships (信任關係) 索引標籤。然後,確認您的 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"
            }
          }
        }
      ]
    }
    或者,執行以下 get-role 命令來檢查您的信任關係:
    aws iam get-role --role-name EKS-IRSA
    **注意:**將 EKS-IRSA 替換為您服務帳戶 (IRSA) 角色的 IAM 角色名稱。
    輸出範例:
    {  "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"
        }
      }
    }
    在輸出 JSON 中,檢查 AssumeRolePolicyDocument 區段以確認信任關係政策。
  6. (選用) 更新角色的信任關係,使其與正確的 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 並重新建立。請完成下列步驟:

  1. 若要刪除 Pod,請執行以下命令:
    kubectl delete pod POD_NAME
    **注意:**將 POD_NAME 替換為您 Pod 的名稱。
  2. 若要重新建立 Pod,請執行以下命令:
    kubectl apply -f SPEC_FILE
    **注意:**使用您的 Kubernetes 資訊清單檔案路徑和檔案名稱取代 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": []
}

在輸出中,確認 ClientIDListsts.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 替換為您的命名空間。

AWS 官方已更新 25 天前