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

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

Amazon EKS 控制面板运行的 Amazon IAM Authenticator for Kubernetes 支持使用 Amazon 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) 配置的更多信息,请参阅使用 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 的用户凭据。如果这是创建了集群的用户,那么该用户有权访问您的集群。如果不是创建集群的用户,则需要完成剩余步骤才能让用户有权访问集群(如果还没有)。

  2. 确保现有 Kubernetes roleclusterrole 具有希望 IAM 用户在集群中的访问权限 (rules),现有 Kubernetes rolebindingclusterrolebinding 将 Kubernetes group 绑定到 roleclusterrole。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。您可以使用以下命令查看所有现有 rolesclusterrolesrolebindingsclusterrolebindings

    kubectl get roles --all-namespaces
    kubectl get clusterroles
    kubectl get rolebindings --all-namespaces
    kubectl get clusterrolebindings

    然后,您可以使用以下命令查看任何资源的详细信息。您可以将 role 替换为 clusterrolerolebindingclusterrolebinding,将 role-name 替换为(之前输出的)资源名称,并将 kube-system 替换为(之前输出的)资源命名空间。

    kubectl describe role role-name -n kube-system
  3. (可选)创建 clusterroleclusterrolebinding 或者 rolerolebinding,允许 IAM 用户查看 Amazon Web Services Management Console 中的节点工作负载

    1. 您可以允许用户查看以下 Kubernetes 资源:

      • 集群 - 此清单创建 clusterroleclusterrolebinding。文件的组名称为 eks-console-dashboard-full-access-group,这是要在 aws-auth ConfigMap 中将 IAM 用户或角色映射到的组。如果需要,您可以在应用到集群前更改 group 的名称,然后在 ConfigMap 中将 IAM 用户或角色映射到该组。

        curl -o eks-console-full-access.yaml https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/docs/eks-console-full-access.yaml
      • 特定命名空间 - 此清单创建 rolerolebinding。此文件中的命名空间是 default,因此如果要指定不同命名空间,请编辑该文件,然后应用到集群。文件的组名称为 eks-console-dashboard-restricted-access-group,这是要在 aws-auth ConfigMap 中将 IAM 用户或角色映射到的组。如果需要,您可以在应用到集群前更改组的名称,然后在 ConfigMap 中将 IAM 用户或角色映射到该组。

        curl -o eks-console-restricted-access.yaml https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/docs/eks-console-restricted-access.yaml
    2. 使用以下命令之一应用相应清单。

      kubectl apply -f eks-console-full-access.yaml
      kubectl apply -f eks-console-restricted-access.yaml
  4. 编辑 aws-auth ConfigMap

    1. 打开 ConfigMap 文件进行编辑。

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

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

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

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

        • rolearn:要添加的 IAM 角色的 ARN。此值不能包含路径。您提供的值的格式必须为 arn:aws:iam::111122223333:role/role-name。有关更多信息,请参阅 aws-auth ConfigMap 不授予对集群的访问权限

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

        • groups:Kubernetes 内角色要映射到的组的列表。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定

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

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

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

        • groups:Kubernetes 内用户要映射到的组的列表。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定

      例如,下面的块包含:

      • mapRoles 部分,此部分添加节点实例角色,以便节点可以自行注册到集群。

      • mapUsers 部分,其中包含来自默认 Amazon 账户的 Amazon 用户 admin,以及来自其他 Amazon 账户的两个运营用户。admin 用户已添加到 system:masters Kubernetes 组。

        操作用户已添加到上一步清单创建的 rolerolebindingclusterroleclusterrolebinding 使用的 Kubernetes 组,但可以替换为任何需要的组。要允许用户在Amazon Web Services Management Console中查看节点工作负载,必须具有下面示例中的映射,以及上一步清单中创建的 rolerolebindingclusterroleclusterrolebinding

      请将所有 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: | - rolearn: arn:aws:iam::111122223333:role/eksctl-my-cluster-nodegroup-standard-wo-NodeInstanceRole-1WP3NUE3O6UCF username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes mapUsers: | - userarn: arn:aws:iam::111122223333:user/admin username: admin groups: - system:masters - userarn: arn:aws:iam::444455556666:user/ops-user username: ops-user groups: - eks-console-dashboard-full-access-group - userarn: arn:aws:iam::444455556666:user/ops-user2 username: ops-user2 groups: - eks-console-dashboard-restricted-access-group
    3. 保存文件并退出您的文本编辑器。

aws-auth ConfigMap 应用到集群

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

      重要

      角色 ARN 不能包含路径。角色 ARN 的格式必须为 arn:aws:iam::111122223333:role/role-name。有关更多信息,请参阅 aws-auth ConfigMap 不授予对集群的访问权限

      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