在 Amazon Elastic Kubernetes Service 中使用 Amazon Secrets Manager 密钥
如果要将 Secrets Manager 中的密钥显示为挂载在 Amazon EKS 容器中的文件,您可以在 Kubernetes Secrets Store CSI Driver
您可以使用 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 容器组(pod)中创建并挂载 Amazon Secrets Manager 密钥。
安装 ASCP
ASCP 在 secrets-store-csi-provider-aws
安装 ASCP
-
要使用 Helm 安装 Secrets Store CSI Driver 和 ASCP,请使用以下命令。
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:GetSecretValue
和 secretsmanager:DescribeSecret
权限。有关示例策略,请参阅 权限策略示例。
然后您创建一个服务账户的 IAM 角色并将策略附加到该角色。有关更多信息,请参阅服务账户的 IAM 角色。
ASCP 检索容器标识并将其交换为 IAM 角色。ASCP 担任容器的 IAM 角色,使其能够访问您授权的密钥。除非将其与 IAM 角色关联,否则其他容器无法访问密钥。
步骤 2:确定要挂载的密钥
要确定 ASCP 将哪些密钥作为文件系统上的文件挂载在 Amazon EKS 中,您需要创建一个 SecretProviderClass
YAML 文件。SecretProviderClass
YAML 列出了要挂载的密钥以及要挂载这些密钥的文件名。SecretProviderClass
必须与该文件引用的 Amazon EKS 容器位于同一名称空间。
以下示例演示了如何使用 SecretProviderClass
来描述要挂载的密钥以及如何命名安装在 Amazon EKS 容器组中的文件。有关更多信息,请参阅SecretProviderClass。
示例:按名称或 ARN 挂载密钥
以下示例显示了 SecretProviderClass
,它将在 Amazon EKS 中挂载三个文件:
由完整 ARN 指定的密钥。
由名称指定的密钥。
密钥的特定版本。
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 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 中挂载三个文件:
由完整 ARN 指定的密钥。
username
键/值对来自同一个密钥。password
键/值对来自同一个密钥。
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 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/v1alpha1 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/v1alpha1 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"
问题排查
您可以通过描述容器部署来查看大多数错误。
查看容器的错误消息
-
用以下命令获取容器名称列表。如果您没有使用默认命名空间,请使用
-n <NAMESPACE>
。kubectl get pods
-
要描述容器,请在以下命令中为
<PODID>
使用在上一步中找到的容器 ID。如果没有使用默认命名空间,请使用-n <NAMESPACE>
。kubectl describe pod/
<PODID>
查看 ASCP 的错误
-
要在提供程序日志中查找更多信息,请在以下命令中为
<PODID>
使用 csi-secrets-store-provider-aws 容器 ID。kubectl -n kube-system get pods kubectl -n kube-system logs pod/
<PODID>