服务账户的 IAM 角色 - Eksctl 用户指南

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

服务账户的 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 内部,有一个准入控制器,它根据 Pod 使用的服务账户上的注释将 AWS 会话证书分别注入角色的 pod 中。凭证将由 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>

进一步信息