让 IAM 主体访问您的集群 - Amazon EKS

让 IAM 主体访问您的集群

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

将 IAM 主体添加到 Amazon EKS 集群

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

注意

有关 Kubernetes 基于角色的访问控制(RBAC)配置的更多信息,请参阅 Kubernetes 文档中的使用 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 的用户凭证。如果这是创建了集群的用户,那么该用户有权访问您的集群。如果不是创建集群的用户,则需要完成剩余步骤才能让其他 IAM 主体有权访问集群。IAM 最佳实践建议您向角色而不是用户授予权限。您可以使用以下命令查看哪些其他主体当前有权访问您的集群:

    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 rolesrolebindings 或者 clusterrolesclusterrolebindings,您可以将 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
    先决条件

    您的设备或 AWS CloudShell 上安装了 0.172.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 eksctl 文档中的 Installation

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

      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。您可以将 admin 替换为您选择的任何名称。

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role --username admin --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. 为用户添加映射。IAM 最佳实践建议您向角色而不是用户授予权限。将 my-user 替换为您的用户名。将 eks-console-dashboard-restricted-access-group 替换为您的 Kubernetes RoleBindingClusterRoleBinding 对象中指定的组名称。请将 111122223333 替换为您的账户 ID。您可以将 my-user 替换为您选择的任何名称。

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user --username 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/admin my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-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 主体添加到 ConfigMap。IAM 组不是 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 用户: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 部分,此部分将默认 AWS 账户中的 admin IAM 用户映射到 system:masters Kubernetes 组,以及映射到可以查看特定命名空间的 Kubernetes 资源的 Kubernetes 组的另一个 AWS 账户的 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-authConfigMap 并应用于集群。最初创建它的目的是允许节点加入您的集群,也可以使用 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. 下载、编辑和应用 AWS 身份验证器配置映射。

    1. 下载配置映射。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml 文件中,将 rolearn 设置为与您的节点关联的 IAM 角色的 Amazon 资源名称(ARN)。您可以使用文本编辑器或者通过替换 my-node-instance-role 和运行以下命令来执行此操作:

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml

      请勿修改此文件中的任何其他行。

      重要

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

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

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

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

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

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

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

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

    kubectl get nodes --watch

    输入 Ctrl+C 以返回到 Shell 提示符。