让 IAM 用户和角色有权访问您的集群 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

让 IAM 用户和角色有权访问您的集群

Amazon EKS 控制面板上运行的 Amazon IAM Authenticator for Kubernetes 支持使用 Amazon Identity and Access Management (IAM) 实体访问集群。身份验证程序从 aws-auth ConfigMap 获取配置信息。对于所有 aws-auth ConfigMap 设置,请参阅 GitHub 上的完整配置格式

将 IAM 用户或角色添加到 Amazon EKS 集群

创建 Amazon EKS 集群时,将为 Amazon Identity and Access Management (IAM) 实体用户或角色,如创建集群的联合身份用户,自动授予 Amazon EKS 控制层面中基于集群角色的访问控制 (RBAC) 配置中的 system:masters 权限。此 IAM 实体不会显示在任何可见配置中,因此请确保跟踪最初创建集群的 IAM 实体。要授予其他 Amazon 用户或角色与集群进行交互的能力,必须编辑 Kubernetes 中的 aws-auth ConfigMap,创建 Kubernetes rolebindingclusterrolebinding,名为 aws-auth ConfigMap 中指定的 group

注意

有关不同 IAM 实体的更多信息,请参阅 IAM 用户指南中的身份(用户、组和角色)。有关 Kubernetes 基于角色的访问控制 (RBAC, Role based access control) 配置的更多信息,请参阅使用 RBAC 授权

将 IAM 用户或角色添加到 Amazon EKS 集群

  1. 确定 kubectl 用来访问集群的凭据。可以在计算机上使用下面的命令查看 kubectl 使用的凭据。如果不使用原定设置路径,请将 ~/.kube/config 替换为 kubeconfig 文件的路径。

    cat ~/.kube/config

    输出示例如下。

    ... contexts: - context: cluster: my-cluster.region-code.eksctl.io user: admin@my-cluster.region-code.eksctl.io name: admin@my-cluster.region-code.eksctl.io current-context: admin@my-cluster.region-code.eksctl.io ...

    在上一个示例输出中,为 my-cluster 集群配置名为 admin 的用户凭证。如果这是创建了集群的用户,那么该用户有权访问您的集群。如果不是创建集群的用户,则需要完成剩余步骤才能让其他用户有权访问集群。您可以使用以下命令查看哪些其他角色或用户当前有权访问您的集群:

    kubectl describe -n kube-system configmap/aws-auth

    输出示例如下。

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-node-role username: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>

    上一个示例是默认的 aws-auth ConfigMap。只有节点实例角色才有权访问集群。

  2. 请确保您拥有现有的 Kubernetes rolesrolebindingsclusterrolesclusterrolebindings,您可以将 IAM 用户或角色映射到其中。有关这些资源的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权

    1. 查看您现有的 Kubernetes rolesclusterrolesRoles 范围限定为 namespace,但 clusterroles 范围则限定为集群。

      kubectl get roles -A
      kubectl get clusterroles
    2. 查看之前的输出中返回的任何 roleclusterrole 的详细信息,并确认它具有您希望 IAM 用户在集群中拥有的权限(rules)。

      role-name 替换为在上一个命令的输出中返回的 role 名称。将 kube-system 替换为 role 的命名空间。

      kubectl describe role role-name -n kube-system

      cluster-role-name 替换为在上一个命令的输出中返回的 clusterrole 名称。

      kubectl describe clusterrole cluster-role-name
    3. 查看您现有的 Kubernetes rolebindingsclusterrolebindingsRolebindings 范围限定为 namespace,但 clusterrolebindings 范围则限定为集群。

      kubectl get rolebindings -A
      kubectl get clusterrolebindings
    4. 查看任何 rolebindingclusterrolebinding 的详细信息,并确认它具有在上一步中列为 roleRefroleclusterrole,以及为 subjects 列出的组名称。

      role-binding-name 替换为在上一个命令的输出中返回的 rolebinding 名称。将 kube-system 替换为 rolebindingnamespace

      kubectl describe rolebinding role-binding-name -n kube-system

      输出示例如下。

      apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: eks-console-dashboard-restricted-access-role-binding namespace: default subjects: - kind: Group name: eks-console-dashboard-restricted-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eks-console-dashboard-restricted-access-role apiGroup: rbac.authorization.k8s.io

      cluster-role-binding-name 替换为在上一个命令的输出中返回的 clusterrolebinding 名称。

      kubectl describe clusterrolebinding cluster-role-binding-name

      输出示例如下。

      apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-console-dashboard-full-access-binding subjects: - kind: Group name: eks-console-dashboard-full-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-console-dashboard-full-access-clusterrole apiGroup: rbac.authorization.k8s.io
  3. 编辑 aws-auth ConfigMap。您可以使用 eksctl 之类的工具更新 ConfigMap,或者可以通过编辑它来进行手动更新。

    重要

    我们建议使用 eksctl 或者其他工具来编辑 ConfigMap。有关您可以使用的其他工具的信息,请参阅《Amazon EKS 最佳实践指南》中的使用工具对 aws-authConfigMap 进行更改。格式不正确的 aws-auth ConfigMap 可能会导致您失去对集群的访问权限。

    eksctl

    先决条件

    您的设备或 Amazon CloudShell 上安装了 0.114.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 安装或更新 eksctl

    1. 查看 ConfigMap 中的当前映射。将 my-cluster 替换为您的集群名称。region-code 替换为集群所在的 Amazon Web Services 区域。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      输出示例如下。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
    2. 为角色添加映射。将 my-role 替换为您的角色名称。将 eks-console-dashboard-full-access-group 替换为您的 Kubernetes rolebindingclusterrolebinding 中指定的组名称。请将 111122223333 替换为您的账户 ID。

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role \ --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
      重要

      角色 ARN 不能包含 role/my-team/developers/my-role 等路径。ARN 的格式必须为 arn:aws:iam::111122223333:role/my-role。在此示例中,my-team/developers/ 需要删除。

      输出示例如下。

      ... 2022-05-09 14:51:20 [ℹ] adding identity "arn:aws:iam::111122223333:role/my-role" to auth ConfigMap
    3. 为用户添加映射。将 my-user 替换为您的用户名。将 eks-console-dashboard-restricted-access-group 替换为您的 Kubernetes rolebindingclusterrolebinding 中指定的组名称。请将 111122223333 替换为您的账户 ID。

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user \ --group eks-console-dashboard-restricted-access-group \ --no-duplicate-arns

      输出示例如下。

      ... 2022-05-09 14:53:48 [ℹ] adding identity "arn:aws:iam::111122223333:user/my-user" to auth ConfigMap
    4. 再次查看 ConfigMap 中的映射。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      输出示例如下。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes arn:aws:iam::111122223333:role/my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-user eks-console-dashboard-restricted-access-group
    Edit ConfigMap manually
    1. 打开 ConfigMap 文件进行编辑。

      kubectl edit -n kube-system configmap/aws-auth
      注意

      如果您收到错误指示“Error from server (NotFound): configmaps "aws-auth" not found”,则使用 将 aws-authConfigMap 应用到集群 中的过程应用库存 ConfigMap

    2. 将 IAM 用户、角色或 Amazon 账户添加到 ConfigMap。无法将 IAM 组添加到 ConfigMap

      • 添加 IAM 角色(例如,对于联合身份用户):将角色详细信息添加到 dataConfigMapmapRoles 部分。如果此部分在文件中尚不存在,请添加它。每个条目支持以下参数:

        • rolearn:要添加的 IAM 角色的 ARN。此值不能包含路径。例如,您无法指定 ARN,例如 arn:aws:iam::111122223333:role/my-team/developers/role-name。ARN 需要为 arn:aws:iam::111122223333:role/role-name

        • username:Kubernetes 内要映射到 IAM 角色的用户名。

        • groups:要将角色映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是 clusterrolebindingrolebinding 中指定的组。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定

      • 添加 IAM 用户:将用户详细信息添加到 dataConfigMapmapUsers 部分。如果此部分在文件中尚不存在,请添加它。每个条目支持以下参数:

        • userarn:要添加的 IAM 用户的 ARN。

        • username:Kubernetes 内要映射到 IAM 用户的用户名。

        • groups:要将用户映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是 clusterrolebindingrolebinding 中指定的组。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定

      例如,下面的 YAML 块包含:

      • 一个 mapRoles 部分,此部分将 IAM 节点实例映射到 Kubernetes 组,以便节点可以自行注册到集群,和映射到可以查看所有集群的所有 Kubernetes 资源的 Kubernetes 组的 my-console-viewer-role IAM 角色。有关 my-console-viewer-role IAM 角色所需的 IAM 和 Kubernetes 组权限的列表,请参阅 所需权限

      • 一个 mapUsers 部分,此部分将默认 Amazon 账户中的 admin IAM 用户映射到 system:masters Kubernetes 组,以及映射到可以查看特定命名空间的 Kubernetes 资源的 Kubernetes 组的另一个 Amazon 账户的 my-user 用户。有关 my-user IAM 用户所需的 IAM 和 Kubernetes 组权限的列表,请参阅 所需权限

      根据需要添加或删除行并将所有 example values 替换为您自己的值。

      # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-role username: system:node:{{EC2PrivateDNSName}} - groups: - eks-console-dashboard-full-access-group rolearn: arn:aws:iam::111122223333:role/my-console-viewer-role username: my-console-viewer-role mapUsers: | - groups: - system:masters userarn: arn:aws:iam::111122223333:user/admin username: admin - groups: - eks-console-dashboard-restricted-access-group userarn: arn:aws:iam::444455556666:user/my-user username: my-user
    3. 保存 文件并退出文本编辑器。

aws-authConfigMap 应用到集群

使用 eksctl 创建托管节点组时或创建节点组时自动创建 aws-auth ConfigMap 并应用于集群. 最初创建此 ConfigMap 的目的是允许节点加入您的集群,也可以使用 ConfigMap 为 IAM 用户和角色添加基于角色的访问控制 (RBAC)。如果您尚未启动自行管理节点并将 aws-auth ConfigMap 应用到集群,则可以按照下面的过程执行此操作。

aws-authConfigMap 应用到集群

  1. 检查您是否已经应用 aws-auth ConfigMap

    kubectl describe configmap -n kube-system aws-auth

    如果您收到错误指示“Error from server (NotFound): configmaps "aws-auth" not found”,则继续以下步骤应用库存 ConfigMap

  2. 下载、编辑和应用 Amazon 身份验证器配置映射。

    1. 下载配置映射。

      curl -o aws-auth-cm.yaml https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. 使用文本编辑器打开 文件。将 <ARN of instance role (not instance profile)> 替换为与节点关联的 IAM 角色的 Amazon Resource Name (ARN),然后保存相应文件。请勿修改此文件中的任何其他行。

      重要

      角色 ARN 不能包含 role/my-team/developers/my-role 等路径。ARN 的格式必须为 arn:aws:iam::111122223333:role/my-role。在此示例中,my-team/developers/ 需要删除。

      apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes

      您可以检查节点组的 Amazon CloudFormation 堆栈输出,并查找以下值:

      • InstanceRoleARN – 对于使用 eksctl 创建的节点组

      • NodeInstanceRole – 对于在 Amazon Web Services Management Console 中使用 Amazon EKS 提供的 Amazon CloudFormation 模板创建的节点组

    3. 应用配置。此命令可能需要几分钟才能完成。

      kubectl apply -f aws-auth-cm.yaml
      注意

      如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)

  3. 查看节点的状态并等待它们达到 Ready 状态。

    kubectl get nodes --watch