将 Amazon Secrets and Configuration Provider CSI 与服务账户的 IAM 角色(IRSA)结合使用 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Amazon Secrets and Configuration Provider CSI 与服务账户的 IAM 角色(IRSA)结合使用

先决条件

  • Amazon EKS 集群(版本 1.17 或更高版本)

  • 通过 kubectl 访问 Amazon CLI 和 Amazon EKS 集群

设置访问控制

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

授予 Amazon EKS 容器组(pod)对 Secrets Manager 中密钥的访问权限
  1. 创建一个权限策略,授予对容器组(pod)需要访问的密钥的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 权限。有关策略示例,请参阅 示例:读取和描述个人密钥的权限

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

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

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

确定要挂载的密钥

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

将密钥作为文件进行挂载

以下说明展示了如何使用示例 YAML 文件 ExampleSecretProviderClass.yamlExampleDeployment.yaml 将密钥作为文件进行挂载。

在 Amazon EKS 中挂载密钥
  1. SecretProviderClass 应用于容器组(pod):

    kubectl apply -f ExampleSecretProviderClass.yaml
  2. 部署容器组(pod):

    kubectl apply -f ExampleDeployment.yaml
  3. ASCP 会挂载文件。

故障排除

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

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

    kubectl get pods
  2. 要描述容器组(pod),请在以下命令中为 podId 使用在上一步中找到的容器组(pod)的容器组(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
  • 验证是否已安装 SecretProviderClass CRD:
    kubectl get crd secretproviderclasses.secrets-store.csi.x-k8s.io

    该命令应返回有关 SecretProviderClass 自定义资源定义的信息。

  • 验证是否已创建 SecretProviderClass 对象。
    kubectl get secretproviderclass SecretProviderClassName -o yaml