

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 Pod 來使用 Kubernetes 服務帳戶
<a name="pod-configuration"></a>

如果 Pod 需要存取 AWS 服務，則必須將其設定為使用 Kubernetes 服務帳戶。服務帳戶必須與具有存取 AWS 服務許可的 AWS Identity and Access Management (IAM) 角色相關聯。
+ 現有的叢集。如果您沒有，則可以使用其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立一個。
+ 叢集的現有 IAM OpenID Connect (OIDC) 提供商。若要了解是否已經擁有，或是了解如何建立，請參閱[為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 與 IAM 角色關聯的現有 Kubernetes 服務帳戶。服務帳戶必須標註 IAM 角色的 Amazon Resource Name (ARN)。角色必須具有關聯的 IAM 政策，其中包含您希望 Pod 必須使用 AWS 服務的許可。如需有關服務帳戶和角色之建立和設定方式的詳細資訊，請參閱[將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

  1. 使用以下命令，以建立部署清單檔案，讓您可部署 Pod 以確認組態。以您自己的值取代範例值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 將清單檔案部署到叢集。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 確認您的 Pod 有必要的環境變數。

     1. 檢視使用上一步中的部署作業進行部署的 Pod。

        ```
        kubectl get pods | grep my-app
        ```

        範例輸出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 檢視 Pod 所使用 IAM 角色的 ARN。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:
        ```

        範例輸出如下。

        ```
        AWS_ROLE_ARN: arn:aws: iam::111122223333:role/my-role
        ```

        角色 ARN 必須與您用來標註現有服務帳戶的角色 ARN 相符。如需有關標註服務帳戶的詳細資訊，請參閱[將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md)。

     1. 確認 Pod 有 Web 身分字符檔案掛載。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:
        ```

        範例輸出如下。

        ```
        AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
        ```

        `kubelet` 請求並代表 Pod 存放字符。根據預設，如果字符超過總存留時間的 80% 或 24 小時，`kubelet` 會重新整理字符。您可以使用 Pod 規格中的設定來修改任何帳戶 (預設服務帳戶除外) 的過期持續時間。如需詳細資訊，請參閱 Kubernetes 文件中的[服務帳戶字符磁碟區投影](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection)。

        叢集上的 [Amazon EKS Pod 身分識別 Webhook](https://github.com/aws/amazon-eks-pod-identity-webhook#amazon-eks-pod-identity-webhook) 會監視使用具有以下註釋之服務帳戶的 Pod：

        ```
        eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/my-role
        ```

        Webhook 會將先前的環境變數套用至這些 Pod。您的叢集不需要使用 Webhook 來設定環境變數和字符檔案掛載。您可以手動將 Pod 設定為具有這些環境變數。[支援的 AWS SDK 版本](iam-roles-for-service-accounts-minimum-sdk.md)會先在登入資料鏈提供者中尋找這些環境變數。符合此條件的 Pod 會使用角色憑證。

  1. 確認您的 Pod 可以使用您在連接至角色的 IAM 政策中指派的許可與 AWS 服務互動。
**注意**  
當 Pod 使用與服務帳戶相關聯的 IAM 角色 AWS 登入資料時，該 Pod 容器中的 AWS CLI 或其他 SDKs 會使用該角色提供的登入資料。如果您沒有對提供給 [Amazon EKS 節點 IAM 角色](create-node-role.md)的憑證限制存取權，則 Pod 仍然可以存取這些認證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的 Pod 無法如預期與服務互動，請完成以下步驟以確認所有項目都已正確設定。

     1. 確認您的 Pod 使用支援透過 OpenID Connect Web 身分字符檔案擔任 IAM 角色的 AWS SDK 版本。如需詳細資訊，請參閱[搭配 AWS SDK 使用 IRSA](iam-roles-for-service-accounts-minimum-sdk.md)。

     1. 確認部署使用服務帳戶。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        範例輸出如下。

        ```
        Service Account:  my-service-account
        ```

     1. 如果您的 Pod 仍然無法存取服務，請檢閱[為 Kubernetes 服務帳戶指派 IAM 角色](associate-service-account-role.md)中描述的[步驟](associate-service-account-role.md#irsa-confirm-role-configuration)，以確認您的角色和服務帳戶設定正確。