在亚马逊 Elastic Kubernetes Service 中使用 Amazon Secrets Manager 密钥 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊 Elastic Kubernetes Service 中使用 Amazon Secrets Manager 密钥

要将 Secrets Manager 中的密钥显示为挂载在 Amazon EK S 容器中的文件,你可以使用 Kubernetes S Amazon ecrets Store CSI 驱动程序的密钥和配置提供程序 (ASCP)。ASCP 可与运行亚马逊 EC2 节点组的亚马逊 Elastic Kubernetes Service(亚马逊 EKS)1.17+ 配合使用。 Amazon Fargate 不支持节点组。使用 ASCP,您可以在 Secrets Manager 中存储并管理密钥,然后通过 Amazon EKS 上运行的工作负载检索。如果密钥包含多个 JSON 格式的键/值对,您可以选择要在 Amazon EKS 中挂载的密钥/值对。ASCP 使用 JMESTath 语法来查询密钥中的键/值对。ASCP 还适用于 Parameter Store 参数

如果您使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有Secrets Manager 端点。Secrets Store CSI Driver 使用端点调用 Secrets Manager。有关在 VPC 中创建端点的信息,请参阅 VPC 端点

如果对密钥使用 Secrets Manager 自动轮换,还可以使用 Secrets Store CSI Driver 轮换协调程序功能,确保从 Secrets Manager 中检索最新的密码。有关更多信息,请参阅已安装的内容和同步的 Kubernetes Secrets 的自动轮换

步骤 1:设置访问控制

ASCP 会检索 Amazon EKS 容器身份并将其交换为 IAM 角色。您可以在 IAM 策略中为该 IAM 角色设置权限。当 ASCP 担任 IAM 角色时,它可以访问您授权的密钥。除非将其与 IAM 角色关联,否则其他容器无法访问密钥。

如果 Kubernetes 限制了来自 ASCP 的查询区域和 IAM 角色的调用,则可以使用更改限制配额,如步骤 2 所示。helm install

向你的 Amazon EKS Pod 授予访问 Secrets Manager 中密钥的权限
  1. 创建权限策略,向 Pod 需要访问的机密授予secretsmanager:GetSecretValuesecretsmanager:DescribeSecret权限。有关策略示例,请参阅示例:读取和描述个人机密的权限

  2. 为集群创建 IAM OpenID Connect (OIDC) 提供商(如果还没有)。有关更多信息,请参阅 A mazon EKS 用户指南中的为您的集群创建 IAM OIDC 提供商

  3. 为服务账号创建 IAM 角色并将策略附加到该账户。有关更多信息,请参阅 A mazon EKS 用户指南中的为服务账户创建 IAM 角色

  4. 如果您使用私有 Amazon EKS 集群,请确保集群所在的 VPC 具有 Amazon STS 终端节点。有关创建终端节点的信息,请参阅Amazon Identity and Access Management 用户指南中的接口 VPC 终端节点

步骤 2:安装和配置 ASCP

ASCP 可在 secrets-store-csi-provider-aws 存储 GitHub 库中找到。回购还包含用于创建和装载密钥的 YAML 文件示例。

在安装过程中,您可以将 ASCP 配置为使用 FIPS 端点。有关 终端节点的列表,请参阅Amazon Secrets Manager 端点

使用 Helm 安装 ASCP
  1. 为确保存储库指向最新的图表,请使用 helm repo update.

  2. 添加 Secrets Store 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:确定要挂载哪些密钥

要确定 ASCP 将哪些密钥作为文件系统上的文件挂载在 Amazon EKS 中,您需要创建一个 SecretProviderClass YAML 文件。列SecretProviderClass出了要装载的密钥和装载它们的文件名。SecretProviderClass 必须与该文件引用的 Amazon EKS 容器位于同一名称空间。

以下示例演示了如何使用 SecretProviderClass 来描述要挂载的密钥以及如何命名安装在 Amazon EKS 容器组中的文件。

示例:按名称或 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-1us-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 窗格中

在 Amazon EKS 中挂载机密
  1. 使用命令SecretProviderClass将应用于 pod kubectl apply -f ExampleSecretProviderClass.yaml

  2. 使用命令部署你的 pod kubectl apply -f ExampleDeployment.yaml

  3. ASCP 会装载这些文件。

故障排除

您可以通过描述容器部署来查看大多数错误。

查看容器的错误消息
  1. 用以下命令获取容器名称列表。如果您没有使用默认命名空间,请使用 -n <NAMESPACE>

    kubectl get pods
  2. 要描述容器,请在以下命令中为 <PODID> 使用在上一步中找到的容器 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>