本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 Amazon EKS 集群并创建允许 Amazon EKS 服务账户连接到 Amazon Keyspaces 表所需的 IAM 资源
-
为 Amazon EKS 集群创建 Open ID Connect(OIDC)身份提供者。需要执行此操作才能将 IAM 角色用于服务账户。有关 OIDC 身份提供者以及如何创建它们的更多信息,请参阅《Amazon EKS 用户指南》中的为集群创建 IAM OIDC 提供商。
使用以下命令为您的集群创建 IAM OIDC 身份提供商。此示例假定集群名称为
my-eks-cluster
。如果集群名称不同,请务必在所有未来的命令中更新名称。eksctl utils associate-iam-oidc-provider --cluster
my-eks-cluster
--approve使用以下命令,确认 OIDC 身份提供者已在 IAM 中注册。
aws iam list-open-id-connect-providers --region
aws-region
输出应如下所示:记下 OIDC 的 Amazon 资源名称(ARN),下一步为服务账户创建信任策略时需要该名称。
{ "OpenIDConnectProviderList": [ .. { "Arn": "arn:aws:iam::
111122223333
:oidc-provider/oidc.eks.aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
" } ] }
-
为 Amazon EKS 集群创建服务账户。服务账户为在容器组(pod)中运行的进程提供身份。容器组是最小、最简单的 Kubernetes 对象,可以用来部署容器化应用程序。接下来,创建一个 IAM 角色,服务账户可代入该角色来获取资源权限。您可以从配置为使用服务账户的容器组访问任何 AWS 服务,该服务账户可以代入具有该服务访问权限的 IAM 角色。
为服务账户创建新的命名空间。命名空间有助于隔离为本教程创建的集群资源。您可以使用以下命令创建新的命名空间。
kubectl create namespace
my-eks-namespace
要使用自定义命名空间,必须将其与 Fargate 配置文件关联。下面是一个代码示例。
eksctl create fargateprofile \ --cluster
my-eks-cluster
\ --namemy-fargate-profile
\ --namespacemy-eks-namespace
\ --labels*
=*
使用以下命令在 Amazon EKS 集群的命名空间
my-eks-namespace
中创建一个名为my-eks-serviceaccount
的服务账户。cat >my-serviceaccount.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-eks-serviceaccount namespace: my-eks-namespace EOF kubectl apply -f my-serviceaccount.yaml
运行以下命令来创建信任策略文件,指示 IAM 角色信任您的服务账户。主体必须先建立这种信任关系,然后才能代入角色。需要对文件进行以下编辑:
对于
Principal
,输入 IAM 返回给list-open-id-connect-providers
命令的 ARN。ARN 包含您的账号和区域。在
condition
语句中,替换 AWS 区域和 OIDC ID。确认服务账户名称和命名空间正确无误。
在下一步中创建 IAM 角色时,需要附加该信任策略文件。
cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::
111122223333
:oidc-provider/oidc.eks.aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:sub": "system:serviceaccount:my-eks-namespace
:my-eks-serviceaccount
", "oidc.eks.aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:aud": "sts.amazonaws.com" } } } ] } EOF可选:您还可以在
StringEquals
和StringLike
条件中添加多个条目,以允许多个服务账户或命名空间代入角色。要允许您的服务账户在其他 AWS 账户中代入 IAM 角色,请参阅《Amazon EKS 用户指南》中的跨账户 IAM 权限。
-
创建一个名为
my-iam-role
的 IAM 角色,供 Amazon EKS 服务账户代入。将上一步中创建的信任策略文件附加到该角色。信任策略指定了 IAM 角色可以信任的服务账户和 OIDC 身份提供者。aws iam create-role --role-name
my-iam-role
--assume-role-policy-document file://trust-relationship.json --description "EKS service account role" -
通过附加访问策略向 IAM 角色分配 Amazon Keyspaces 权限。
附加访问策略以定义 IAM 角色可以对特定 Amazon Keyspaces 资源执行的操作。在本教程中,我们使用 AWS 托管式策略
AmazonKeyspacesFullAccess
,因为我们的应用程序将向您的 Amazon Keyspaces 表写入数据。但是,作为最佳实践,建议创建实现最低权限原则的自定义访问策略。有关更多信息,请参阅 Amazon Keyspaces 是如何使用的 IAM。aws iam attach-role-policy --role-name
my-iam-role
--policy-arn=arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess使用以下语句确认策略已成功附加到 IAM 角色。
aws iam list-attached-role-policies --role-name
my-iam-role
输出应如下所示:
{ "AttachedPolicies": [ { "PolicyName": "AmazonKeyspacesFullAccess", "PolicyArn": "arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess" } ] }
使用服务账户可以代入的 IAM 角色的 Amazon 资源名称(ARN)为服务账户添加注释。确保使用您的账户 ID 更新角色 ARN。
kubectl annotate serviceaccount -n
my-eks-namespace
my-eks-serviceaccount
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333
:role/my-iam-role
确认 IAM 角色和服务账户均已正确配置。
使用以下语句确认 IAM 角色的信任策略已正确配置。
aws iam get-role --role-name
my-iam-role
--query Role.AssumeRolePolicyDocument输出应如下所示:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.
aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.aws-region
/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.aws-region
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount" } } } ] }确认已使用 IAM 角色为 Amazon EKS 服务账户添加注释。
kubectl describe serviceaccount
my-eks-serviceaccount
-nmy-eks-namespace
输出应如下所示:
Name: my-eks-serviceaccount Namespace:my-eks-namespace Labels: <none> Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-iam-role Image pull secrets: <none> Mountable secrets: <none> Tokens: <none> [...]
创建 Amazon EKS 服务账户、IAM 角色并配置所需的关系和权限后,请继续第 2 步:配置应用程序。