設定Pods為使用服Kubernetes務帳戶 - Amazon EKS

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

設定Pods為使用服Kubernetes務帳戶

如果Pod需要存取 AWS 服務,則必須將其設定為使用Kubernetes服務帳戶。服務帳戶必須與具有存取權限的 AWS Identity and Access Management (IAM) 角色相關聯 AWS 服務。

必要條件
  • 現有的叢集。如果您沒有,則可以使用其中一個 Amazon EKS 入門 指南來建立一個。

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

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

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

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

  • 包含叢集組態的現有 kubectl config 檔案。若要建立 kubectl config 檔案,請參閱建立或更新 Amazon EKS 叢集的 kubeconfig 檔案

設定 Pod 以使用服務帳戶
  1. 使用以下命令,以建立部署清單檔案,讓您可部署 Pod 以確認組態。以您自己的值取代 example values

    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. 檢視使用上一步中的部署作業進行部署的 Pods。

      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 相符。如需有關標註服務帳戶的詳細資訊,請參閱設定Kubernetes服務帳戶以擔任 IAM 角色

    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 Identity Webhook 會監視使用具有以下註釋之服務帳戶的 Pods:

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

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

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

    注意

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

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

    1. 確認您Pods使用的 AWS SDK 版本支持通過 OpenID Connect Web 身份令牌文件假設 IAM 角色。如需詳細資訊,請參閱 使用支援的 AWS 開發套件

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

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

      範例輸出如下。

      Service Account:  my-service-account
    3. 如果您的 Pods 仍然無法存取服務,請查看設定Kubernetes服務帳戶以擔任 IAM 角色中描述的步驟,以確認您的角色和服務帳戶設定正確。