在 Amazon EKS 中使用带有 Pod 身份的 Amazon 密钥和配置提供商 CSI - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Amazon EKS 中使用带有 Pod 身份的 Amazon 密钥和配置提供商 CSI

Amazon 机密和配置提供程序与适用于 Amazon Elastic Kubernetes Service 的 Pod 身份代理集成,为在 Amazon EKS 上运行的应用程序提供了增强的安全性、简化的配置和更高的性能。Pod Identity 在从 Secrets Manager 检索密钥或从 Parameter Stor Amazon Systems Manager e 检索参数时简化了 Amazon EKS 的

Amazon EKS 容器组身份通过直接在 Amazon EKS 接口设置权限,减少了操作步骤,且无需在 Amazon EKS 和 IAM 服务之间切换,从而简化了为 Kubernetes 应用程序配置 IAM 权限的过程。容器组身份允许在多个集群中共用一个 IAM 角色而无需更新信任策略,并支持角色会话标签以实现更精细的访问控制。这种方法不仅允许跨角色重复使用权限策略,简化了策略管理,而且还允许根据匹配的标签访问 Amazon 资源,增强了安全性。

工作方式

  1. 容器组身份会为容器组(pod)分配 IAM 角色。

  2. ASCP 使用此角色进行身份验证。 Amazon Web Services 服务

  3. 如果获得授权,ASCP 会检索所请求的密钥并将其提供给 Pod。

有关更多信息,请参阅《Amazon EKS 用户指南》中的了解 Amazon EKS 容器组身份的工作原理

先决条件

重要

仅云中的 Amazon EKS 支持容器组身份。Amazon EK S Anywhere 或亚马逊实例上的自行管理的 Kubernetes 集群不支持该功能。Amazon 云端 Red Hat OpenShift 服务 EC2

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

  • 通过以下方式访问 Amazon CLI 和 Amazon EKS 集群 kubectl

  • 访问两个 Amazon Web Services 账户 (用于跨账户存取)

安装 Amazon EKS 容器组身份代理

要将容器组身份与集群结合使用,必须安装 Amazon EKS 容器组身份代理附加组件。

安装容器组身份代理
  • 在集群上安装 Pod Identy Agent 附加组件:

    eksctl create addon \ --name eks-pod-identity-agent \ --cluster clusterName \ --region region

通过容器组身份设置 ASCP

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

  2. 创建可由容器组身份的 Amazon EKS 服务主体担任的 IAM 角色:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }

    向角色附加 IAM policy:

    aws iam attach-role-policy \ --role-name MY_ROLE \ --policy-arn POLICY_ARN
  3. 创建容器组身份关联。有关示例,请参阅《Amazon EKS 用户指南》中的创建容器组身份关联

  4. 创建指定SecretProviderClass要在 Pod 中挂载哪些密钥的:

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleSecretProviderClass-PodIdentity.yaml

    IRSA 和 Pod Identity SecretProviderClass 之间的主要区别在于可选参数usePodIdentity。这是一个可选字段,用于确定身份验证方法。如果未指定,则默认对服务账户(IRSA)使用 IAM 角色。

    • 要使用 EKS 容器组身份,请使用以下任意值:"true", "True", "TRUE", "t", "T"

    • 要明确使用 IRSA,请将其设置为以下任意值:"false", "False", "FALSE", "f", or "F"

  5. 将装载机密的 Pod 部署到以下/mnt/secrets-store位置:

    kubectl apply -f kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleDeployment-PodIdentity.yaml
  6. 如果您使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有 Amazon STS 端点。有关创建端点的信息,请参阅《Amazon Identity and Access Management 用户指南》中的接口 VPC 端点

验证密钥的挂载情况

要验证密钥是否已正确安装,请运行以下命令:

kubectl exec -it $(kubectl get pods | awk '/pod-identity-deployment/{print $1}' | head -1) -- cat /mnt/secrets-store/MySecret
设置 Amazon EKS 容器组身份以访问 Secrets Manager 中的密钥
  1. 创建一个权限策略,授予对容器组(pod)需要访问的密钥的 Pod(pod)需要访问的密钥secretsmanager:GetSecretValuesecretsmanager:DescribeSecret权限。有关策略示例,请参阅 示例:读取和描述个人密钥的权限

  2. 如果您还没有密钥,请在 Secrets Manager 中创建一个密钥。

故障排除

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

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

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