在亚马逊 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 参数

您可以使用 IAM 角色和策略授予您的密钥对集群中的特定 Amazon EKS 容器组的访问权限。

为了描述要在 Amazon EKS 容器组中创建哪些文件以及要在其中放入哪些密钥,您需要创建一个 SecretProviderClass YAML 文件。SecretProviderClass 必须与该文件引用的 Amazon EKS 容器位于同一名称空间。

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

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

有关如何使用 ASCP 的完整教程,请参阅 教程:在 Amazon EKS 容器中创建和挂载 Amazon Secrets Manager 密钥

安装 ASCP

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

安装 ASCP
  • 要使用 Helm 安装 Secrets Store CSI Driver 和 ASCP,请使用以下命令。为确保该存储库指向最新图表,请使用 helm repo update.

    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 helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws 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

步骤 1:设置访问控制

要授予您的 Amazon EKS 容器组访问 Secrets Manager 中的密钥的权限,首先需要创建一个权限策略,授予对容器组需要访问的密钥的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 权限。有关示例策略,请参阅 权限策略示例

然后您创建一个服务账户的 IAM 角色并将策略附加到该角色。有关更多信息,请参阅服务账户的 IAM 角色

ASCP 检索容器标识并将其交换为 IAM 角色。ASCP 担任容器的 IAM 角色,使其能够访问您授权的密钥。除非将其与 IAM 角色关联,否则其他容器无法访问密钥。

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

步骤 2:确定要挂载的密钥

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

以下示例演示了如何使用 SecretProviderClass 来描述要挂载的密钥以及如何命名安装在 Amazon EKS 容器组中的文件。有关更多信息,请参阅SecretProviderClass

示例:按名称或 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"

故障排除

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

查看容器的错误消息
  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>