設定 Pod 來使用 Kubernetes 服務帳戶 - Amazon EKS

協助改進此頁面

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

設定 Pod 來使用 Kubernetes 服務帳戶

若 Pod 需要存取 AWS 服務,則您必須進行設定以使用 Kubernetes 服務帳戶。服務帳戶必須與擁有 AWS 服務存取許可的 AWS Identity and Access Management (IAM) 角色建立關聯。

  • 現有的叢集。如果您沒有,則可以使用其中一個 開始使用 Amazon EKS 指南來建立一個。

  • 叢集的現有 IAM OpenID Connect (OIDC) 提供商。若要了解是否已經擁有,或是了解如何建立,請參閱為您的叢集建立 IAM OIDC 身分提供者

  • 與 IAM 角色關聯的現有 Kubernetes 服務帳戶。服務帳戶必須標註 IAM 角色的 Amazon Resource Name (ARN)。該角色必須具有關聯的 IAM 政策,其中包含您希望 Pod 必須具備以便使用 AWS 服務的許可。如需有關服務帳戶和角色之建立和設定方式的詳細資訊,請參閱將 IAM 角色指派給 Kubernetes 服務帳戶

  • 已在裝置或 AWS CloudShell 上安裝和設定 AWS 命令列介面 (AWS CLI) 版本 2.12.3 或更新版本,或是版本 1.27.160 或更新版本。若要檢查您目前的版本,請使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。如 yumapt-get 或適用於 macOS 的 Homebrew 等套件管理工具通常比最新版本的 AWS CLI 落後數個版本之多。若要安裝最新版本,請參閱《AWS 命令列介面使用者指南》中的安裝使用 aws configure 的快速組態。AWS CloudShell 中安裝的 AWS CLI 版本也可能比最新版本落後數個版本。若要更新,請參閱《AWS CloudShell 使用者指南》中的安裝 AWS CLI 至您的主目錄

  • 已在裝置或 AWS CloudShell 上安裝 kubectl 命令列工具。版本可以與您的叢集 Kubernetes 版本相同,或是為最多比該版本更舊一版或更新一版的次要版本。例如,如果您的叢集版本為 1.29,則可以搭配使用 kubectl 1.281.291.30 版。若要安裝或升級 kubectl,請參閱 設定 kubectl 和 eksctl

  • 包含叢集組態的現有 kubectl config 檔案。若要建立 kubectl config 檔案,請參閱透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集

    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
    2. 將清單檔案部署到叢集。

      kubectl apply -f my-deployment.yaml
    3. 確認您的 Pod 有必要的環境變數。

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

        kubectl get pods | grep my-app

        範例輸出如下。

        my-app-6f4dfff6cb-76cv9 1/1 Running 0 3m28s
      2. 檢視 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 服務帳戶

      3. 確認 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 文件中的服務帳戶字符磁碟區投影

        叢集上的 Amazon EKS Pod 身分識別 Webhook 會監視使用具有以下註釋之服務帳戶的 Pod:

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

        Webhook 會將先前的環境變數套用至這些 Pod。您的叢集不需要使用 Webhook 來設定環境變數和字符檔案掛載。您可以手動將 Pod 設定為具有這些環境變數。支援的 AWS 開發套件版本會先在憑證鏈供應商中尋找這些環境變數。符合此條件的 Pod 會使用角色憑證。

    4. 確認您的 Pod 可以使用您在連接到角色的 IAM 政策中指派的許可與 AWS 服務互動。

      注意

      當 Pod 使用與服務帳戶關聯之 IAM 角色的 AWS 憑證時,適用於該 Pod 的容器中的 AWS CLI 或其他 SDK 只會使用該角色提供的憑證。如果您沒有對提供給 Amazon EKS 節點 IAM 角色的憑證限制存取權,則 Pod 仍然可以存取這些認證。如需詳細資訊,請參閱‬限制存取指派給工作節點的執行個體設定檔‭

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

      1. 確認 Pod 使用的 AWS SDK 版本支援透過 OpenID Connect Web 身分記號檔案來擔任 IAM 角色。如需詳細資訊,請參閱 搭配 AWS SDK 使用 IRSA

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

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

        範例輸出如下。

        Service Account: my-service-account
      3. 如果您的 Pod 仍然無法存取服務,請檢閱為 Kubernetes 服務帳戶指派 IAM 角色中描述的步驟,以確認您的角色和服務帳戶設定正確。