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

3 分的閱讀內容
0

我嘗試使用 AWS Identity and Access Management (IAM) 角色做為服務帳戶,但我的 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 無法擔任指派的 IAM 角色,並收到授權錯誤。或者,我的 Pod 嘗試使用指派給 Amazon EKS 節點的預設 IAM 角色,而不是指派給我的 Pod 的 IAM 角色。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱 Troubleshoot AWS CLI errors。此外,請確定您使用的是最新的 AWS CLI 版本

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

如果您尚未擁有,請為叢集建立 IAM OIDC 供應商。您必須擁有叢集的 OIDC 身分供應商,才能使用服務帳戶的 IAM 角色。

然後,確認 OIDC 身分供應商是否已正確設定:

  1. 開啟 IAM 主控台。從導覽窗格中,選擇身分供應商
  2. 供應商欄中,找出並記下 OIDC 供應商的網址。
  3. 在另外的分頁或視窗中,開啟 Amazon EKS 主控台。然後,從導覽窗格中選擇叢集
  4. 選擇您的叢集,然後選擇組態索引標籤。
  5. 詳細資訊區段中,記下 OpenID Connect 供應商網址屬性的值。
  6. 確認 Amazon EKS 主控台 (步驟 5) 中的 OIDC 供應商網址是否與 IAM 主控台 (步驟 2) 的 OIDC 供應商網址相符。
    如果 Amazon EKS 叢集的 OIDC 供應商網址與 IAM 主控台中的任何 OIDC 供應商網址都不相符,則必須建立新的 IAM OIDC 供應商

驗證您的 IAM 角色政策和信任政策設定

您的 IAM 角色可能沒有所需的完整權限。如果使用 AWS 管理主控台或 AWS CLI 建立 IAM 角色,IAM 角色的信任關係政策也可能存在語法錯誤。

若要驗證您的 IAM 角色政策,並檢查信任政策中是否有語法錯誤,請執行以下操作:

  1. 開啟 IAM 主控台
  2. 在導覽窗格中,選擇角色,然後選擇您的角色。
  3. 選擇角色頁面上的權限索引標籤,然後確認所有必要的權限都已指派給該角色。
  4. 選擇信任關係索引標籤,然後選擇編輯信任關係
  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 區域代碼 (your-region-code)、帳戶 ID (your-account-id) 和唯一 OIDC 識別符 (EXAMPLE_OIDC_IDENTIFIER) 的格式正確。在 StringEquals 行中,確認區域代碼 (your-region-code)、OIDC 唯一識別符 (EXAMPLE_OIDC_IDENTIFIER)、Kubernetes 命名空間 (your-namespace) 和 Kubernetes 服務帳戶名稱 (your-namespace) 的格式正確。
  6. 如果您要編輯政策文件,以更正格式錯誤,請選擇更新信任政策

確認您的服務帳戶存在,並且 IAM 角色 的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 驗證服務帳戶是否正常運作。然後,檢查 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 具有正確的環境變數

    $ 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 角色名稱。

  5. 驗證 IAM 角色後,刪除 awscli Pod:

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

    如果 awscli Pod 顯示正確的 IAM 角色,則表示服務帳戶的 IAM 角色功能正常運作。

上述步驟確認 IAM 權杖已正確掛載至 Pod。如果應用程式仍無法正確使用權杖檔案,可能是因為應用程式或 SDK 層級發生問題。此問題可能與應用程式擷取 AWS 憑證的方式,或是不支援 SDK 版本有關。如需詳細資訊,請參閱 Using the Default Credential Provider Chain、Boto3 網站上的 CredentialsUsing a supported AWS SDK

AWS 官方
AWS 官方已更新 9 個月前