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

4 分的閱讀內容
0

我的 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 供應商,請完成下列步驟:

  1. 檢查叢集的 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
  2. 列出您帳戶中的 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 角色是否具有必要的權限,請完成下列步驟:

  1. 開啟 IAM 主控台
  2. 在導覽窗格中,選擇角色
  3. 選取您要驗證的角色
  4. 權限標籤下,驗證所需的政策已附加至角色。
  5. 驗證 IAM 角色信任關係已正確設定。

若要檢查您的 IAM 角色是否有附加的政策,請完成下列步驟:

  1. 開啟 IAM 主控台

  2. 在導覽窗格中,選擇角色

  3. 選取您要檢查的角色

  4. 選擇信任關係標籤。驗證政策的格式與下列 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_NAMEYOUR_NAMESPACE

範例輸出:

serviceAccountName: irsa

檢查環境變數和權限

在 Pod 的環境變數中找到 AWS_ROLE_ARNAWS_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 並重新建立它:

  1. 執行下列命令以刪除 Pod:
    $ kubectl delete pod POD_NAME
    **注意:**使用您的 Pod 名稱取代 POD_NAME
  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 身分提供者。您的 ClientIDListsts.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"
...
AWS 官方
AWS 官方已更新 1 年前