在 Amazon Elastic Kubernetes Service 中使用 Parameter Store 参数 - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

在 Amazon Elastic Kubernetes Service 中使用 Parameter Store 参数

要将 Secrets Manager 中的密钥和 Parameter Store 中的参数显示为挂载在 Amazon EKS 容器中的文件,您可以使用 Kubernetes Secrets Store CSI Driver 的 Amazon Secrets and Configuration Provider (ASCP) 插件。ASCP 与 Amazon Elastic Kubernetes Service (Amazon EKS) 1.17+ 结合使用。Parameter Store 是 Amazon Systems Manager 的一项功能。

使用 ASCP,您可以检索在 Parameter Store 中存储和管理的参数。然后,您可以在 Amazon EKS 上运行的工作负载中使用这些参数。如果您的参数包含多个 JSON 格式的键值对,可以选择将它们挂载到 Amazon EKS 中。ASCP 可使用 JMESPath 句法来查询参数中的键值对。

您可以使用 Amazon Identity and Access Management (IAM) 角色和策略,将对您的参数的访问权限限制在集群中特定的 Amazon EKS 容器。ASCP 检索容器标识并交换 IAM 角色的身份。ASCP 代入容器的 IAM 角色。然后,它可以从 Parameter Store 检索为该角色授权的参数。

要了解如何将 Secrets Manager 与 Amazon EKS 集成,请参阅在 Amazon Elastic Kubernetes Service 中使用 Secrets Manager 密钥

安装 ASCP

ASCP 在 GitHub 上的 secrets-store-csi-driver-provider-aws 存储库中提供。此存储库还包含用于创建和挂载密钥的 YAML 文件示例。首先安装 Kubernetes Secrets Store CSI Driver,然后安装 ASCP。

要安装 Kubernetes Secrets Store CSI Driver 和 ASCP,请执行以下步骤:

  1. 要安装 Kubernetes Secrets Store CSI Driver,请运行以下命令。有关完整安装说明,请参阅 Kubernetes Secrets Store CSI Driver 手册中的安装。有关安装 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:设置访问控制

要授予您的 Amazon EKS 容器访问 Parameter Store 中参数的权限,首先需要创建一个策略,限制对容器需要访问的参数访问权限。然后您创建一个服务账户的 IAM 角色并将策略附加到该角色。有关使用 IAM policy 限制对 Systems Manager 参数的访问权限的更多信息,请参阅 使用 IAM policy 限制对 Systems Manager 参数的访问

注意

使用 Parameter Store 参数时,策略中需要 ssm:GetParameters 权限。

ASCP 检索容器标识并将其交换为 IAM 角色。ASCP 代入容器的 IAM 角色,使其能够访问您授权的参数。除非将这些参数与 IAM 角色关联,否则其他容器无法访问它们。

步骤 2:将参数挂载到 Amazon EKS 中

要在 Amazon EKS 中显示参数,就像它们是文件系统上的文件一样,您可以创建 SecretProviderClass YAML 文件,其中包含有关您的参数以及如何将这些参数挂载到 Amazon EKS 容器中的信息。

SecretProviderClass 必须与该文件引用的 Amazon EKS 容器位于同一名称空间。

SecretProviderClass

SecretProviderClass YAML 采用以下格式。

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

包含挂载请求的详细信息。

objects

包含要挂载参数的 YAML 声明的字符串。我们建议使用 YAML 多行字符串或竖线 (|) 字符。

objectName

参数的易记名称。除非您指定 objectAlias,这将成为 Amazon EKS 容器中参数的文件名。使用参数的 Name (名称),而不是完整的 Amazon Resource Name (ARN)。

JMESPath

(可选)JSON 中的键映射到要在 Amazon EKS 中挂载的文件。以下示例展示了 JSON 编码的参数。

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

键是 usernamepassword。与 username 关联的值是 myusername,与 password 关联的值是 mypassword

path

参数中的键。

objectAlias

要挂载在 Amazon EKS 容器中的文件名。

objectType

如果不将 Secrets Manager ARN 用于 objectName,需要这个操作 可以是 secretsmanagerssmparameter

objectAlias

(可选)Amazon EKS 容器中参数的文件名。如果不指定此字段,则 objectName 作为文件名显示。

ObjectVersion

(可选)参数的版本号。建议您不要使用该字段,因为每次更新参数时都必须更新该字段。默认情况下,使用最新版本。对于 Parameter Store 参数,您可以使用 objectVersionobjectVersionLabel,但不能同时使用两者。

objectVersionLabel

(可选)版本的参数标签。默认为最新版本。对于 Parameter Store 参数,您可以使用 objectVersionobjectVersionLabel,但不能同时使用两者。

region

(可选)参数的 Amazon Web Services 区域。如果不使用此字段,ASCP 将从节点上的注释中查找 “区域”。查找会增加挂载请求的开销,因此我们建议为使用大量容器的群集提供区域。

pathTranslation

(可选)如果文件名(objectName 或者 objectAlias)包含路径分隔符,要使用的单个替换字符,例如 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 Driver。

以下是使用名为 aws-secretsSecretProviderClass 的部署 YAML 示例。

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

教程:创建参数并将其挂载到 Amazon EKS 容器中

在本教程中,您将在 Parameter Store 中创建一个示例参数,然后将其挂载到 Amazon EKS 容器中并进行部署。

在开始之前,请安装 ASCP。有关更多信息,请参阅 安装 ASCP

创建和挂载密钥

  1. 将 Amazon Web Services 区域和集群的名称设置为 Shell 变量,以便您可以在 bash 命令中使用。对于 region,输入 Amazon EKS 集群在其中运行的 Amazon Web Services 区域。对于 clustername,输入您的集群名称。

    REGION=region CLUSTERNAME=clustername
  2. 创建测试参数。

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$Region"
  3. 为容器创建资源策略,限制容器对上一步中创建的参数的访问权限。对于 <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. 创建容器使用的服务账户,并将在步骤 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,指定要在容器中挂载哪个参数。以下命令使用名为 ExampleSecretProviderClass.yamlSecretProviderClass 文件的文件位置。有关创建您自己的 SecretProviderClass 信息,请参阅 SecretProviderClass

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. 部署您的容器 以下命令使用名为 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"

问题排查

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

查看容器的错误消息

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

    kubectl get pods
  2. 要描述 Pod,请在以下命令中为 pod-id 使用在上一步中找到的 Pod 的 Pod ID。如果没有使用默认命名空间,请使用 -n <NAMESPACE>

    kubectl describe pod/pod-id

查看 ASCP 的错误

  • 要在提供程序日志中查找更多信息,请在以下命令中为 pod-id 使用 csi-secrets-store-provider-aws 容器组 ID。

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