

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

# 服务账户的 IAM 角色


**提示**  
 `eksctl`支持通过 EKS [Pod 身份关联为运行应用程序的 EKS](pod-identity-associations.md) 配置精细权限 

Amazon EKS [在这里](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)支持服务账户角色 (IRSA)]，允许集群操作员将 AWS IAM 角色映射到 Kubernetes 服务账户。

这为在 EKS 上运行并使用其他 AWS 服务的应用程序提供了精细的权限管理。这些应用程序可能是使用 S3、任何其他数据服务（RDS、MQ、STS、DynamoDB）或 Kubernetes 组件（例如 AWS Load Balancer 控制器或 ExternalDNS）的应用程序。

您可以轻松地使用创建 IAM 角色和服务账户配对`eksctl`。

**注意**  
如果您使用了[实例角色](iam-policies.md)，并且正在考虑改用 IRSA，则不应将两者混为一谈。

## 工作原理


它通过 EKS 公开的 IAM OpenID Connect 提供商 (OIDC) 运行，并且必须参照 IAM OIDC 提供商（特定于给定的 EKS 集群）构建 IAM 角色，并引用它将绑定到的 Kubernetes 服务账户。创建 IAM 角色后，服务账号应包含该角色的 ARN 作为注释 () `eks.amazonaws.com/role-arn`。默认情况下，将创建或更新服务帐号以包含角色注释，可以使用标志将其禁用`--role-only`。

在 EKS 内部，有一个[准入控制器](https://github.com/aws/amazon-eks-pod-identity-webhook/)，它根据 Pod 使用的服务账户上的注释将 AWS 会话证书分别注入角色的 pod 中。凭证将由 `AWS_ROLE_ARN` & `AWS_WEB_IDENTITY_TOKEN_FILE` 环境变量公开。如果使用的是最新版本的 AWS SDK（具体版本详见[此处](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)），则应用程序将使用这些证书。

资源的名称是 *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`记，而不是提供策略。为确保该角色只能由指定的服务帐号担任，您应[在此](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)处设置关系策略文档]。

```
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`标记（有关其工作[原理的更多详细信息，请参阅本节](general-nodegroups.md#node-include)）。而且该`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`属性记录[在配置架构中](https://geoffcline.github.io/eksctl-schema-demo/#iam-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>
```

## 进一步信息

+  [为服务账户引入精细的 IAM 角色](https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/) 
+  [EKS 用户指南-服务账户的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions) 
+  [将 IAM 用户和角色映射到 Kubernetes RBAC 角色](iam-identity-mappings.md) 