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

上次更新日期:2021 年 10 月 5 日

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

簡短描述

若要使用服務帳戶的 IAM 角色功能解決此問題,請嘗試進行以下操作:

  • 驗證您的 Amazon EKS 叢集是否擁有 IAM OpenID Connect (OIDC) 身分供應商
  • 驗證您的 IAM 角色政策和信任政策組態
  • 確認您的服務帳戶存在並且具有格式正確的 IAM 角色 ARN 註釋
  • 使用測試 Pod 驗證服務帳戶是否正常運作

注意:如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

解決方案

驗證您的 Amazon EKS 叢集是否擁有 IAM OIDC 身分供應商

為您的叢集建立一個 IAM OIDC 供應商 (如果您還沒有)。您必須擁有叢集的 OIDC 身分供應商才能使用服務帳戶的 IAM 角色。

接下來,驗證 OIDC 身分供應商設定是否正確:

1.    開啟 IAM 主控台,然後從導覽窗格中選擇 Identity providers (身分供應商)。

2.    在 Provider (供應商) 欄中,找到並記下 OIDC 供應商 URL。

3.    在單獨的標籤或視窗中,開啟 Amazon EKS 主控台,然後從導覽窗格中選擇 Clusters (叢集)。

4.    選擇您的叢集,然後選擇 Configuration (組態) 標籤。

5.    在 Details (詳細資訊) 區段,注意 OpenID Connect provider URL 屬性的值。

6.    驗證來自 Amazon EKS 主控台 (步驟 5) 的 OIDC 供應商 URL 是否與來自 IAM 主控台 (步驟 2) 的 OIDC 供應商 URL 相符。

如果您的 Amazon EKS 叢集的 OIDC 供應商 URL 與 IAM 主控台中的任何 OIDC 供應商 URL 都不相符,則您必須建立新的 IAM OIDC 供應商

驗證您的 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"
        }
      }
    }
  ]
}

在上述 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.    如果您編輯政策文件以更正格式錯誤,請選擇 Update Trust Policy (更新信任政策)。

確認您的服務帳戶存在並且具有格式正確的 IAM 角色 ARN 註釋

1.    確認您的 Kubernetes 服務帳戶存在:

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

注意:YOUR_ACCOUNT_NAME 替換為您的帳戶名稱。將 YOUR_NAMESPACE 替換為您的命名空間。

如果上述命令未返回服務帳戶名稱,則建立服務帳戶 (從 Kubernetes 網站建立)。

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 角色。

注意:即使服務帳戶的 IAM 角色功能正常運作,您也可能會遇到與應用程式憑證相關的問題。即便您的 Pod 具有正確的環境變數,您也可能會遇到此問題。為防止出現此問題,您可以使用 AWS CLI 容器映像進行驗證。

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"
}

記下在步驟 4 的命令輸出中收到的 Arn 值和 IAM 角色名稱 (your-iam-role)。

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

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

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

上述步驟確認 IAM 字符已正確掛載到 Pod。如果您的應用程式仍然無法正確使用字符檔案,則可能是因此在應用程式或 SDK 層級存在問題。此問題可能與應用程式擷取 AWS 憑證的方式有關。如需詳細資訊,請參閱使用預設憑證供應商鏈憑證 (來自 Boto3 網站)。


此文章是否有幫助?


您是否需要帳單或技術支援?