在 Amazon Elastic Kubernetes Service 中使用 Parameter Store 參數 - AWS Systems Manager

在 Amazon Elastic Kubernetes Service 中使用 Parameter Store 參數

若要顯示來自 Secrets Manager 的秘密,以及 Parameter Store 的參數,做為掛載於 Amazon EKS Pod 的檔案,您可以將 AWS Secrets and Configuration Provider (ASCP) 用於 Kubernetes Secrets Store CSI Driver。ASCP 與 Amazon Elastic Kubernetes Service (Amazon EKS) 1.17 版或更高版本一起使用。Parameter Store 是 AWS Systems Manager 的一項功能。

使用 ASCP,您可以擷取在 Parameter Store 中存放和管理的參數。然後,您可以在 Amazon EKS 上執行的工作負載中使用這些參數。如果參數包含 JSON 格式的多個鍵值對,您可以選擇要在 Amazon EKS 中掛載哪些鍵值對。ASCP 可以使用 JMESPath 語法來查詢參數中的鍵值對。

您可以使用 AWS Identity and Access Management (IAM) 角色和政策來限制對叢集中特定 Amazon EKS Pod 的參數存取。ASCP 會擷取 Pod 身分識別並交換 IAM 角色的身分識別。ASCP 會擔任 Pod 的 IAM 角色。然後它可以從已為該角色授權的 Parameter Store 中擷取參數。

若要了解如何將 Secrets Manager 與 Amazon EKS 整合,請參閱在 Amazon Elastic Kubernetes Service 中使用秘密 Secrets Manager 秘密

安裝 ASCP 代理程式

您可在 secrets-store-csi-driver-provider-aws 儲存庫中的 GitHub 取得 ASCP。儲存庫還包含用於建立和掛載秘密的範例 YAML 檔案。您先安裝 Kubernetes Secrets Store CSI Driver,然後再安裝 ASCP。

安裝 Kubernetes Secrets Store CSI Driver 和 ASCP。

  1. 若要安裝 Kubernetes Secrets Store CSI Driver,請執行下列命令。如需完整的安裝說明,請參閱 Kubernetes Secrets Store CSI Driver Book 中的安裝。如需有關安裝 Helm 的相關資訊,請參閱搭配使用 Helm 與 Amazon EKS

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  2. 若要安裝 ASCP,請使用 GitHub 儲存機制部署目錄中的 YAML 檔案。如需安裝 kubectl 的相關資訊,請參閱安裝 kubectl

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

步驟 1:設定存取控制

若要在 Parameter Store 中授予 Amazon EKS Pod 存取參數的權限,您首先要建立一個政策來限制對 Pod 需存取的參數的存取。然後建立服務帳戶的 IAM 角色並將政策連接到該角色。如需有關使用 IAM 政策來限制 Systems Manager 參數存取的詳細資訊,請參閱使用 IAM 政策限制對 Systems Manager 參數的存取

注意

當您使用 Parameter Store 參數時,政策中需要許可 ssm:GetParameters

ASCP 會擷取 Pod 身分並將其交換為 IAM 角色。ASCP 會假設 Pod 的 IAM 角色,讓其存取您授權的參數。除非您也將其與 IAM 角色建立關聯,否則其他容器無法存取參數。

步驟 2:在 Amazon EKS 中掛載參數

若要在 Amazon EKS 中顯示參數 (如同是檔案系統上的檔案),您可以建立一個 SecretProviderClass YAML 檔案,其中包含參數以及如何在 Amazon EKS Pod 中掛載這些秘密的相關資訊。

所以 SecretProviderClass 必須和其參考的 Amazon EKS Pod 位在同一命名空間。

SecretProviderClass

SecretProviderClass YAML 的格式如下。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: <NAME> spec: provider: aws parameters:
parameters

包含掛載請求的詳細資訊。

objects

包含待掛載參數的 YAML 宣告的字串。建議使用 YAML 多行字串或分隔號 (|) 字元。

objectName

易記的參數名稱。這會成為 Amazon EKS Pod 中參數的檔案名稱,除非您指定 objectAlias。使用參數的 Name,而不是完整的 Amazon Resource Name (ARN)。

jmesPath

(選用) 要掛載在 Amazon EKS 中之檔案的 JSON 編碼參數的金鑰映射。下列範例會顯示 JSON 編碼參數的樣子。

{ "username" : "myusername", "password" : "mypassword" }

金鑰為 usernamepassword。與 username 關聯的值是 myusername,與 password 關聯的值是 mypassword

路徑

參數中的金鑰。

objectAlias

要掛載在 Amazon EKS Pod 中的檔案名稱。

objectType

如果未針對 objectName 使用 Secrets Manager ARN,其則為必要欄位。可以是 secretsmanagerssmparameter

objectAlias

(選用) Amazon EKS Pod 中參數的檔案名稱。如果您未指定此欄位,objectName 會顯示為檔案名稱。

objectVersion

(選用) 參數的版本編號。建議您不要使用此欄位,因為每次更新參數時都必須更新此欄位。依預設,會使用最新版本。對於 Parameter Store 參數,您可以使用 objectVersionobjectVersionLabel,但不能同時使用兩者。

objectVersionLabel

(選用) 版本的參數標籤。預設值為最新版本。對於 Parameter Store 參數,您可以使用 objectVersionobjectVersionLabel,但不能同時使用兩者。

region

(選用) 參數的 AWS 區域。如果不使用此欄位,ASCP 會從節點上的註釋尋找區域。此查閱會增加掛載請求的額外負荷,因此建議您為使用大量 Pod 的叢集提供區域。

pathTranslation

(選用) 如果檔案名稱 (objectNameobjectAlias) 包含路徑分隔符號字元,例如 Linux 上的斜線 (/),則要使用的單一替代字元。如果參數名稱包含路徑分隔符號,則 ASCP 無法建立具有該名稱的掛載檔案。相反地,您可以在此欄位中輸入不同的字元來取代路徑分隔符號字元。如果不使用此欄位,則預設值為底線 (_),例如 My/Path/Parameter 掛載為 My_Path_Parameter

若要避免發生字元取代的情況,請輸入字串 False

範例

下列範例組態顯示具有 Parameter Store 參數資源的 SecretProviderClass

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "MyParameter" objectType: "ssmparameter"

步驟 3:更新部署 YAML

更新您的部署 YAML 以使用 secrets-store.csi.k8s.io 驅動程式,並參考在上一個步驟中建立的 SecretProviderClass 資源。這可確保您的叢集正在使用 Secrets Store CSI 驅動程式。

以下是使用 SecretProviderClass (名為 aws-secrets) 的部署 YAML 示例。

volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "my-secret-provider-class"

教學課程:在 Amazon EKS Pod 中建立並掛載參數

在本教學課程中,您會在 Parameter Store 中建立範例參數,然後將參數掛載到 Amazon EKS Pod 中並進行部署。

開始之前,請先安裝 ASCP。如需詳細資訊,請參閱 安裝 ASCP 代理程式

若要建立和掛載秘密

  1. 將 AWS 區域 和叢集的名稱設為 shell 變數,以便可在 bash 命令中使用。針對 Region (區域),請輸入執行 Amazon EKS 叢集所在的 AWS 區域。針對 Clustername (叢集名稱),請輸入您叢集的名稱。

    REGION=region CLUSTERNAME=clustername
  2. 建立測試參數

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$Region"
  3. 建立 Pod 的資源政策,其會限制對您在上個步驟建立的參數的存取。對於 <PARAMETERARN>,請使用參數的 ARN。將政策 ARN 儲存在 shell 變數中。若要擷取參數 ARN,請使用 get-parameter

    POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn --output text iam create-policy --policy-name nginx-parameter-deployment-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ssm:GetParameter", "ssm:GetParameters"], "Resource": ["parameter-arn"] } ] }')
  4. 如果尚未建立,請為叢集建立 IAM OpenID Connect (OIDC) 提供者。如需詳細資訊,請參閱為叢集建立 IAM OIDC 提供者

    eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
  5. 建立 Pod 使用的服務帳戶,並將您在步驟 3 中建立的資源政策與該服務帳戶關聯起來。在本教學課程中,針對服務帳戶名稱,您可以使用 nginx-deployment-sa。如需詳細資訊,請參閱為服務帳戶建立 IAM 角色

    eksctl create iamserviceaccount --name nginx-deployment-sa --region="$REGION" --cluster "$CLUSTERNAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
  6. 建立 SecretProviderClass 來指定要在 Pod 中掛載的參數。下列命令會使用名為 ExampleSecretProviderClass.yamlSecretProviderClass 檔案的檔案位置。如需編寫自有 SecretProviderClass 的詳細資訊,請參閱 SecretProviderClass

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. 部署您的 Pod。下列命令使用名為 ExampleDeployment.yaml 的部署檔案。如需編寫自有 SecretProviderClass 的詳細資訊,請參閱 步驟 3:更新部署 YAML

    kubectl apply -f ./ExampleDeployment.yaml
  8. 若要確認參數是否已正確掛載,請使用下列命令並確認您的參數值出現。

    kubectl exec -it $(kubectl get pods | awk '/nginx-deployment/{print $1}' | head -1) cat /mnt/secrets-store/MyParameter; echo

    此時會顯示參數值。

    "EKS parameter"

疑難排解

您可以透過描述 Pod 部署來檢視大多數錯誤。

若要查看容器的錯誤訊息

  1. 使用下列命令取得 Pod 名稱清單。如果不使用預設命名空間,請使用 -n <NAMESPACE>

    kubectl get pods
  2. 若要描述 Pod,請在下列命令中,針對 pod-id 使用您在上一個步驟中從 Pod 找到的 Pod ID。如果不使用預設命名空間,請使用 -n <NAMESPACE>

    kubectl describe pod/pod-id

若要查看 ASCP 的錯誤

  • 若要在提供者記錄中尋找更多資訊,請在下列命令中,針對 <PODID> 使用 csi-secrets-store-provider-aws Pod 的 ID。

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/pod-id