将 AWS Secrets and Configuration Provider CSI 与适用于 Amazon EKS 的容器组身份结合使用
AWS Secrets and Configuration Provider 与适用于 Amazon Elastic Kubernetes Service 的容器组身份代理集成,为在 Amazon EKS 上运行的应用程序提供了增强的安全性、简化的配置以及更高的性能。容器组身份简化了从 Secrets Manager 检索密钥或从 AWS Systems Manager Parameter Store 中检索参数时的适用于 Amazon EKS 的 IAM 身份验证流程。
Amazon EKS 容器组身份通过直接在 Amazon EKS 接口设置权限,减少了操作步骤,且无需在 Amazon EKS 和 IAM 服务之间切换,从而简化了为 Kubernetes 应用程序配置 IAM 权限的过程。容器组身份允许在多个集群中共用一个 IAM 角色而无需更新信任策略,并支持角色会话标签以实现更精细的访问控制。这种方法不仅允许跨角色重复使用权限策略,简化了策略管理,而且还允许根据匹配的标签访问 AWS 资源,增强了安全性。
工作方式
-
容器组身份会为容器组(pod)分配 IAM 角色。
-
ASCP 会使用此角色通过 AWS 服务 进行身份验证。
-
如果获得授权,ASCP 会检索请求的密钥并将其提供给容器组(pod)。
有关更多信息,请参阅《Amazon EKS 用户指南》中的了解 Amazon EKS 容器组身份的工作原理。
先决条件
重要
仅云中的 Amazon EKS 支持容器组身份。Amazon EKS Anywhere
-
Amazon EKS 集群(版本 1.24 或更高版本)
-
通过
kubectl访问 AWS CLI 和 Amazon EKS 集群 -
访问两个 AWS 账户(以实现跨账户访问)
安装 Amazon EKS 容器组身份代理
要将容器组身份与集群结合使用,必须安装 Amazon EKS 容器组身份代理附加组件。
安装容器组身份代理
-
在集群上安装容器组身份代理附加组件:
eksctl create addon \ --name eks-pod-identity-agent \ --clusterclusterName\ --regionregion
通过容器组身份设置 ASCP
-
创建一个权限策略,授予对容器组(pod)需要访问的密钥的
secretsmanager:GetSecretValue和secretsmanager:DescribeSecret权限。有关策略示例,请参阅 示例:读取和描述个人密钥的权限。 -
创建可由容器组身份的 Amazon EKS 服务主体担任的 IAM 角色:
向角色附加 IAM 策略:
aws iam attach-role-policy \ --role-nameMY_ROLE\ --policy-arnPOLICY_ARN -
创建容器组身份关联。有关示例,请参阅《Amazon EKS 用户指南》中的创建容器组身份关联
-
创建
SecretProviderClass,用于指定要挂载到容器组(pod)中的密钥:kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleSecretProviderClass-PodIdentity.yamlIRSA 和容器组身份在
SecretProviderClass中的关键区别在于可选参数usePodIdentity。这是一个可选字段,用于确定身份验证方法。如果未指定,则默认对服务账户(IRSA)使用 IAM 角色。-
要使用 EKS 容器组身份,请使用以下任意值:
"true", "True", "TRUE", "t", "T"。 -
要明确使用 IRSA,请将其设置为以下任意值:
"false", "False", "FALSE", "f", or "F"。
-
-
部署挂载
/mnt/secrets-store下的密钥的容器组(pod):kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleDeployment-PodIdentity.yaml -
如果使用私有 Amazon EKS 集群,请确保该集群所在的 VPC 具有 AWS STS 端点。有关创建端点的信息,请参阅《AWS 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 中的密钥
-
创建一个权限策略,授予对容器组(pod)需要访问的密钥的
secretsmanager:GetSecretValue和secretsmanager:DescribeSecret权限。有关策略示例,请参阅 示例:读取和描述个人密钥的权限。 -
在 Secrets Manager 中创建密钥(如果您还没有一个密钥)。
故障排除
您可以通过描述容器组(pod)部署来查看大多数错误。
查看容器的错误消息
-
使用以下命令获取容器组(pod)名称列表。如果您没有使用默认命名空间,请使用
-n。NAMESPACEkubectl get pods -
要描述容器组(pod),请在以下命令中为
PODID使用在上一步中找到的容器组(pod)的容器组(pod)ID。如果没有使用默认命名空间,请使用-n。NAMESPACEkubectl 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