本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
服务账户的 IAM 角色
提示
eksctl
支持通过 EKS Pod 身份关联为运行应用程序的 EKS 配置精细权限
Amazon EKS 在这里支持服务账户角色 (IRSA)],允许集群操作员将 AWS IAM 角色映射到 Kubernetes 服务账户。
这为在 EKS 上运行并使用其他 AWS 服务的应用程序提供了精细的权限管理。这些应用程序可能是使用 S3、任何其他数据服务(RDS、MQ、STS、DynamoDB)或 Kubernetes 组件(例如 AWS Load Balancer 控制器或 ExternalDNS)的应用程序。
您可以轻松地使用创建 IAM 角色和服务账户配对eksctl
。
注意
如果您使用了实例角色,并且正在考虑改用 IRSA,则不应将两者混为一谈。
工作方式
它通过 EKS 公开的 IAM OpenID Connect 提供商 (OIDC) 运行,并且必须参照 IAM OIDC 提供商(特定于给定的 EKS 集群)构建 IAM 角色,并引用它将绑定到的 Kubernetes 服务账户。创建 IAM 角色后,服务账号应包含该角色的 ARN 作为注释 () eks.amazonaws.com/role-arn
。默认情况下,将创建或更新服务帐号以包含角色注释,可以使用标志将其禁用--role-only
。
在 EKS 内部,有一个准入控制器AWS_ROLE_ARN
& AWS_WEB_IDENTITY_TOKEN_FILE
环境变量公开。如果使用的是最新版本的 AWS 开发工具包(具体版本详见此处),则应用程序将使用这些证书。
资源的名称是 iamserviceaccount,它代表 IAM 角色和服务账户对。eksctl
来自 CLI 的用法
注意
服务账户的 IAM 角色需要 Kubernetes 版本 1.13 或更高版本。
默认情况下,IAM OIDC 提供商未启用,您可以使用以下命令将其启用,也可以使用配置文件(见下文):
eksctl utils associate-iam-oidc-provider --cluster=<clusterName>
将 IAM OIDC 提供商与集群关联后,要创建绑定到服务账户的 IAM 角色,请运行:
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --namespace=<serviceAccountNamespace> --attach-policy-arn=<policyARN>
注意
您可以--attach-policy-arn
多次指定使用多个策略。
更具体地说,您可以通过运行以下命令创建对 S3 具有只读访问权限的服务帐户:
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
默认情况下,它将在default
命名空间中创建,但你可以指定任何其他命名空间,例如:
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --namespace=s3-app --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
注意
如果命名空间尚不存在,则会创建它。
如果您已在集群中创建了服务账户(没有 IAM 角色),则需要使用--override-existing-serviceaccounts
标志。
也可以通过指定--tags
以下内容将自定义标记应用于 IAM 角色:
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --tags "Owner=John Doe,Team=Some Team"
CloudFormation 将生成一个包含随机字符串的角色名称。如果您更喜欢预先确定的角色名称,则可以指定--role-name
:
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-name "custom-role-name"
当服务帐号由其他工具(例如 helm)创建和管理时,请使用--role-only
来防止冲突。然后,另一个工具负责维护角色 ARN 注释。请注意,--override-existing-serviceaccounts
该角色对roleOnly
/--role-only
服务帐号没有影响,因此将始终创建该角色。
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-only --role-name=<customRoleName>
如果您想将现有角色与服务帐号一起使用,则可以提供标--attach-role-arn
记,而不是提供策略。为确保该角色只能由指定的服务帐号担任,您应在此处设置关系策略文档]。
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --attach-role-arn=<customRoleARN>
要更新服务账号的角色权限,你可以运行eksctl update iamserviceaccount
。
注意
eksctl delete iamserviceaccount
删除 Kubernetes,ServiceAccounts
即使它们不是由创建的。eksctl
与配置文件一起使用
要iamserviceaccounts
使用配置文件进行管理,您需要设置iam.withOIDC: true
并列出您想要的账户iam.serviceAccount
。
所有命令都支持--config-file
,你可以像管理节点组一样管理 iamserviceAc counts。eksctl create iamserviceaccount
命令支持--include
和--exclude
标记(有关其工作原理的更多详细信息,请参阅本节)。而且该eksctl delete iamserviceaccount
命令也支持,因此您可以--only-missing
像执行节点组一样执行删除操作。
注意
IAM 服务账户的作用域位于一个命名空间内,也就是说,两个同名的服务账户可能存在于不同的命名空间中。因此,要将服务帐号唯一定义为--exclude
标志的一部分--include
,您需要按namespace/name
格式传递名称字符串。例如,
eksctl create iamserviceaccount --config-file=<path> --include backend-apps/s3-reader
如果将 IRSA 与众所周知的用例(如cluster-autoscaler
和)一起使用cert-manager
,则包含启用wellKnownPolicies
选项,作为策略列表的简写。
支持的众所周知的策略和其他serviceAccounts
属性记录在配置架构中
您可以将以下配置示例与以下内容一起使用eksctl create cluster
:
# An example of ClusterConfig with IAMServiceAccounts: --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-13 region: us-west-2 iam: withOIDC: true serviceAccounts: - metadata: name: s3-reader # if no namespace is set, "default" will be used; # the namespace will be created if it doesn't exist already namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" tags: Owner: "John Doe" Team: "Some Team" - metadata: name: cache-access namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess" - "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess" - metadata: name: cluster-autoscaler namespace: kube-system labels: {aws-usage: "cluster-ops"} wellKnownPolicies: autoScaler: true roleName: eksctl-cluster-autoscaler-role roleOnly: true - metadata: name: some-app namespace: default attachRoleARN: arn:aws:iam::123:role/already-created-role-for-app nodeGroups: - name: "ng-1" tags: # EC2 tags required for cluster-autoscaler auto-discovery k8s.io/cluster-autoscaler/enabled: "true" k8s.io/cluster-autoscaler/cluster-13: "owned" desiredCapacity: 1
如果您创建的集群没有设置这些字段,则可以使用以下命令启用所需的一切:
eksctl utils associate-iam-oidc-provider --config-file=<path> eksctl create iamserviceaccount --config-file=<path>