跳至內容

為什麼我無法在 Amazon EKS Pod 中使用服務帳戶的 IAM 角色?

3 分的閱讀內容
0

我想要為服務 AWS 帳戶 (IRSA) 使用 AWS Identity and Access Management (IAM) 角色。但是,我的 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 無法擔任已指派的 IAM 角色。或者,我的 Pod 使用的是指派給 Amazon EKS 節點的預設 IAM 角色。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

確認您的 Amazon EKS 叢集擁有 IAM OIDC 身分供應商

如果您還沒有 IAM OpenID Connect (OIDC) 供應商,請為您的叢集建立一個。您的叢集必須擁有 OIDC 供應商才能使用 IRSA。

然後,完成以下步驟以確認您是否已正確設定 OIDC 供應商:

  1. 開啟 IAM console (IAM 主控台)。
  2. 從導覽窗格中,選擇 Identity providers (身分供應商)。
  3. Provider (供應商) 下,找出並記下 OIDC 供應商的網址。
  4. 在另外的索引標籤或視窗中,開啟 Amazon EKS console (Amazon EKS 主控台)。
  5. 在導覽窗格中,選擇 Clusters (叢集)。
  6. 選取您的叢集,然後選擇 Configuration (組態) 索引標籤。
  7. Details (詳細資料) 下,檢查 OpenID Connect 供應商網址 的值。確認它與 IAM 主控台中的 OIDC 供應商網址相符。
  8. 如果網址不相符,則必須建立新的 IAM OIDC 供應商

確認您的 IAM 角色政策和信任政策組態

當您的 IAM 角色沒有所有必要的權限時,就會發生 IAM 問題。或者,如果您使用 AWS 管理主控台或 AWS CLI 建立 IAM 角色,則 IAM 角色的信任關係政策可能會出現語法錯誤。

若要確認您的 IAM 角色政策,並檢查信任政策中是否有語法錯誤,請完成以下步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 在導覽窗格中,選擇 Roles (角色),然後選取您的角色。
  3. 選擇 Permissions (權限) 索引標籤,然後驗證是否已將組態所需的所有權限指派給該角色。
  4. 選擇 Trust relationships (信任關係) 索引標籤,然後選擇 Edit trust relationship (編輯信任關係)。
  5. 在信任關係的政策文件中,確認政策的格式與下列 JSON 政策的格式相符:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    在您的 JSON 政策中,檢查 Federated 屬性行和 StringEquals 屬性行的格式。在 Federated (聯合) 中,請確認 AWS 區域代碼、AWS 帳戶 ID 和唯一 OIDC 識別碼的格式正確。在 StringEquals 中,請確認區域代碼、OIDC 唯一識別碼、Kubernetes 命名空間和 Kubernetes 服務帳戶名稱的格式正確。
  6. 如果您要編輯政策文件以更正格式錯誤,請選擇 Update trust policy (更新信任政策)。

確認您的服務帳戶存在,並且具有 IAM 角色的 Amazon Resource Name (ARN) 正確格式的註釋

請完成下列步驟:

  1. 若要確認您的 Kubernetes 服務帳戶是否存在,請執行下列命令:
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    **注意:**將 YOUR_ACCOUNT_NAME 替換為您的帳戶名稱,並將 YOUR_NAMESPACE 替換為您的命名空間。
    如果上述命令沒有傳回服務帳戶名稱,請建立服務帳戶。如需詳細資訊,請參閱 Kubernetes 網站上的 Use more than one ServiceAccount
  2. 確認服務帳戶是否使用您想要的名稱。另外,請確認其 role-arn 註解的格式正確。範例:
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
      name: my-example-serviceaccount
      namespace: my-test-namespace

使用測試 Pod 來確認服務帳戶是否正常運作

執行測試 Pod 以驗證服務帳戶是否正常運作、是否可以掛載環境變數,以及是否可以擔任指定的 IAM 角色。請完成下列步驟:

  1. 建立名為 awscli-pod.yaml 的本機 YAML 檔案。範例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: awscli
      labels:
        app: awscli
    spec:
      serviceAccountName: YOUR_SERVICE_ACCOUNT
      containers:
      - image: amazon/aws-cli
        command:
          - "sleep"
          - "604800"
        imagePullPolicy: IfNotPresent
        name: awscli
      restartPolicy: Always

    **注意:**將 YOUR_SERVICE_ACCOUNT 替換為您的 Kubernetes 服務帳戶名稱。

  2. 若要從命名空間中的 YAML 檔案建立測試 Pod,請執行下列命令:

    kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    **注意:**將 YOUR_NAMESPACE 替換為您的命名空間。

  3. 若要確認 awscli pod 具有 AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE 環境變數,請執行下列命令:

    kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    輸出範例:

    AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
    AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
  4. 若要確認測試 Pod 是否使用正確的 IAM 角色,請執行下列命令:

    kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

    輸出範例:

    {    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
        "Account": "012345678912",
        "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
    }

    記下 Arn 的值。請確定 IAM 角色是您要在 Pod 中使用的角色。

  5. 若要刪除 awscli pod,請執行下列命令:

    kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    **注意:**將 YOUR_NAMESPACE 替換為您的命名空間。

如果 awscli Pod 顯示正確的 IAM 角色,則表示服務帳戶的 IAM 角色功能正常運作。上述步驟確認您已將 IAM 權杖正確掛載至 Pod。如果應用程式仍然無法使用 IAM 權杖檔案,則可能是因為應用程式或 SDK 層級發生問題。例如,可能是應用程式使用 AWS 憑證的方式有問題,或使用了不支援的 SDK 版本。如需詳細資訊,請參閱使用預設憑證供應商鏈將 IRSA 與 AWS SDK 搭配使用

AWS 官方已更新 1 年前