在 Amazon Elastic Kubernetes Service 中使用 AWS Secrets Manager 秘密 - AWS Secrets Manager

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

在 Amazon Elastic Kubernetes Service 中使用 AWS Secrets Manager 秘密

若要將 Secrets Manager 的秘密顯示為 Amazon EKS Pod 中掛載的檔案,您可以使用 Kubernetes Secrets Store CSI Driver 的 AWS Secrets and Configuration Provider (ASCP)。不支援 ASCP搭配執行 Amazon EC2節點群組的 Amazon Elastic Kubernetes Service (Amazon EKS) 1.17+ 使用。 AWS Fargate 節點群組。使用 ASCP,您可以在 Secrets Manager 中儲存和管理秘密,然後透過在 Amazon 上執行的工作負載擷取秘密EKS。如果您的秘密包含多個JSON格式的索引鍵/值對,您可以選擇要掛載在 Amazon 中的索引鍵/值對EKS。ASCP 使用JMESPath語法來查詢秘密中的鍵/值對。ASCP 也適用於參數存放區參數

如果您使用私有 Amazon EKS叢集,請確定VPC叢集所在的 具有 Secrets Manager 端點。Secrets Store CSI Driver 使用 端點呼叫 Secrets Manager。如需在 中建立端點的資訊VPC,請參閱 VPC 端點

如果您使用 Secrets Manager 自動輪換秘密,您也可以使用 Secrets Store CSI Driver 輪換對帳器功能,以確保您從 Secrets Manager 擷取最新的秘密。如需詳細資訊,請參閱自動輪換已掛載的內容和已同步的 Kubernetes 秘密

步驟 1:設定存取控制

會ASCP擷取 Amazon EKS Pod 身分,並將其交換為IAM角色。您可以在IAM政策中為該IAM角色設定許可。當 ASCP擔任IAM角色時,它會存取您授權的秘密。其他容器無法存取秘密,除非您也將其與IAM角色建立關聯。

如果 中的呼叫ASCP查詢與 Pod 相關聯的區域和IAM角色是由 Kubernetes 限流,您可以使用 變更限流配額helm install,如步驟 2 所示。

在 Secrets Manager 中授予 Amazon EKS Pod 對秘密的存取權
  1. 建立許可政策,將 Pod 需要存取的秘密授予 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 許可。如需政策範例,請參閱 範例:讀取和描述個別秘密的許可

  2. 如果您還沒有叢集,請為叢集建立 IAM OpenID Connect (OIDC) 供應商。如需詳細資訊,請參閱 Amazon EKS使用者指南 中的為您的叢集建立IAMOIDC供應商

  3. IAM服務帳戶建立角色,並將政策連接至該角色。如需詳細資訊,請參閱 Amazon EKS使用者指南 中的為服務帳戶建立IAM角色

  4. 如果您使用私有 Amazon EKS叢集,請確定VPC叢集所在的 具有 AWS STS 端點。如需建立端點的相關資訊,請參閱 AWS Identity and Access Management 使用者指南 中的介面VPC端點

步驟 2:安裝和設定 ASCP

ASCP 可在 secrets-store-csi-provider-aws 儲存庫 GitHub 中的 上使用。儲存庫也包含用於建立和掛載秘密的範例YAML檔案。

在安裝期間,您可以將 設定為ASCP使用FIPS端點。如需端點清單,請參閱 AWS Secrets Manager 端點

ASCP 使用 Helm 安裝
  1. 若要確保儲存庫指向最新的圖表,請使用 helm repo update.

  2. 新增秘密存放區CSI驅動程式圖表。

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  3. 安裝圖表。若要設定限流,請新增下列旗標: --set-json 'k8sThrottlingParams={"qps": "<number of queries per second>", "burst": "<number of queries per second>"}'

    helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  4. 新增ASCP圖表。

    helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
  5. 安裝圖表。若要使用FIPS端點,請新增下列旗標: --set useFipsEndpoint=true

    helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
使用 儲存庫YAML中的 安裝
  • 使用下列命令。

    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 kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

步驟 3:識別要掛載的秘密

若要判斷 Amazon 中的哪些掛ASCP載EKS作為檔案系統的檔案秘密,請建立 SecretProviderClass YAML 檔案。SecretProviderClass 會列出要掛載的秘密,以及要掛載的檔案名稱。SecretProviderClass 必須與參考的 Amazon EKS Pod 位於相同的命名空間。

下列範例示範如何使用 SecretProviderClass 來描述您要掛載的秘密,以及如何命名掛載在 Amazon EKS Pod 中的檔案。

範例:依名稱掛載秘密或 ARN

下列範例顯示 SecretProviderClass,該 會在 Amazon 中掛載三個檔案EKS:

  1. 完整 指定的秘密ARN。

  2. 依名稱指定的秘密。

  3. 秘密的特定版本。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret2-d4e5f6" - objectName: "MySecret3" objectType: "secretsmanager" - objectName: "MySecret4" objectType: "secretsmanager" objectVersionLabel: "AWSCURRENT"

範例:透過機密掛載金鑰/值對

下列範例顯示 SecretProviderClass,該 會在 Amazon 中掛載三個檔案EKS:

  1. 完整 指定的秘密ARN。

  2. username 金鑰/值對來自相同的秘密。

  3. password 金鑰/值對來自相同的秘密。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MySecret-a1b2c3" jmesPath: - path: username objectAlias: dbusername - path: password objectAlias: dbpassword

範例:定義多區域機密的容錯移轉區域

為了在連線中斷或災難復原組態期間提供可用性, ASCP支援自動容錯移轉功能,以從次要區域擷取秘密。

下列範例顯示可擷取複寫至多個區域之機密的 SecretProviderClass。在此範例中, ASCP 會嘗試從 us-east-1和 擷取秘密us-east-2。如果任一區域傳回 4xx 錯誤,例如身分驗證問題,則 ASCP不會掛載任一秘密。如果成功從 擷取秘密us-east-1,則 會ASCP掛載該秘密值。如果未成功從 擷取秘密us-east-1,但成功從 擷取秘密us-east-2,則 會ASCP掛載該秘密值。

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "MySecret"

範例:選擇要掛載的容錯移轉機密

下列範例顯示用於指定在容錯移轉時要裝載之機密的 SecretProviderClass。容錯移轉機密不是複本。在此範例中, ASCP 會嘗試擷取 指定的兩個秘密objectName。如果任一 傳回 4xx 錯誤,例如身分驗證問題,則 ASCP不會掛載任一秘密。如果成功從 擷取秘密us-east-1,則 會ASCP掛載該秘密值。如果未成功從 擷取秘密us-east-1,但成功從 擷取秘密us-east-2,則 會ASCP掛載該秘密值。Amazon 中掛載的檔案EKS名為 MyMountedSecret

apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: region: us-east-1 failoverRegion: us-east-2 objects: | - objectName: "arn:aws:secretsmanager:us-east-1:111122223333:secret:MySecret-a1b2c3" objectAlias: "MyMountedSecret" failoverObject: - objectName: "arn:aws:secretsmanager:us-east-2:111122223333:secret:MyFailoverSecret-d4e5f6"

步驟 4:將秘密掛載為 Amazon EKS Pod 中的檔案

下列指示說明如何使用範例檔案 ExampleSecretProviderClass.yamlExampleDeployment.yaml 將秘密掛載為YAML檔案。

在 Amazon 中掛載秘密 EKS
  1. 使用命令 將 SecretProviderClass套用至 Podkubectl apply -f ExampleSecretProviderClass.yaml

  2. 使用命令 部署您的 Podkubectl apply -f ExampleDeployment.yaml

  3. 掛ASCP載檔案。

疑難排解

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

若要查看容器的錯誤訊息
  1. 使用下列命令取得 Pod 名稱清單。如果不使用預設命名空間,請使用 -n <NAMESPACE>

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

    kubectl describe pod/<PODID>
檢視 的錯誤 ASCP
  • 若要在提供者日誌中尋找詳細資訊,請在下列命令中,針對 <PODID> 使用 csi-secrets-store-provider-aws Pod 的 ID。

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/<PODID>