让 IAM 主体访问您的集群
Amazon EKS 控制面板上运行的 Amazon IAM Authenticator for Kubernetesaws-auth ConfigMap 获取配置信息。对于所有 aws-auth ConfigMap 设置,请参阅 GitHub 上的完整配置格式
将 IAM 主体添加到 Amazon EKS 集群
创建 Amazon EKS 集群时,将为创建集群的 IAM 主体自动授予 Amazon EKS 控制面板中基于集群角色的访问控制(RBAC)配置中的 system:masters 权限。该主体不会显示在任何可见配置中,因此请确保跟踪最初创建集群的主体。要授予其他 IAM 主体与集群进行交互的能力,请编辑 Kubernetes 中的 aws-auth ConfigMap,创建 Kubernetes rolebinding 或 clusterrolebinding,名为 aws-auth ConfigMap 中指定的 group。
注意
有关 Kubernetes 基于角色的访问控制(RBAC)配置的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权
要将 IAM 主体添加到 Amazon EKS 集群
-
确定
kubectl用来访问集群的凭据。可以在计算机上使用下面的命令查看kubectl使用的凭据。如果不使用原定设置路径,请将替换为~/.kube/configkubeconfig文件的路径。cat~/.kube/config输出示例如下。
... contexts: - context: cluster:my-cluster.region-code.eksctl.iouser:admin@my-cluster.region-code.eksctl.ioname:admin@my-cluster.region-code.eksctl.iocurrent-context:admin@my-cluster.region-code.eksctl.io...在上一个示例输出中,为
集群配置名为my-cluster的用户凭证。如果这是创建了集群的用户,那么该用户有权访问您的集群。如果不是创建集群的用户,则需要完成剩余步骤才能让其他 IAM 主体有权访问集群。IAM 最佳实践建议您向角色而不是用户授予权限。您可以使用以下命令查看哪些其他主体当前有权访问您的集群:adminkubectl 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-roleusername: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>上一个示例是默认的
aws-authConfigMap。只有节点实例角色才有权访问集群。 -
请确保您拥有现有的 Kubernetes
roles和rolebindings或者clusterroles和clusterrolebindings,您可以将 IAM 主体映射到其中。有关这些资源的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。 -
查看您现有的 Kubernetes
roles或clusterroles。Roles范围限定为namespace,但clusterroles范围则限定为集群。kubectl get roles -Akubectl get clusterroles -
查看之前的输出中返回的任何
role或clusterrole的详细信息,并确认它具有您希望 IAM 主体在集群中拥有的权限(rules)。将
替换为在上一个命令的输出中返回的role-namerole名称。将替换为kube-systemrole的命名空间。kubectl describe rolerole-name-nkube-system将
替换为在上一个命令的输出中返回的cluster-role-nameclusterrole名称。kubectl describe clusterrolecluster-role-name -
查看您现有的 Kubernetes
rolebindings或clusterrolebindings。Rolebindings范围限定为namespace,但clusterrolebindings范围则限定为集群。kubectl get rolebindings -Akubectl get clusterrolebindings -
查看任何
rolebinding或clusterrolebinding的详细信息,并确认它具有在上一步中列为roleRef的role或clusterrole,以及为subjects列出的组名称。将
替换为在上一个命令的输出中返回的role-binding-namerolebinding名称。将替换为kube-systemrolebinding的namespace。kubectl describe rolebindingrole-binding-name-nkube-system输出示例如下。
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name:eks-console-dashboard-restricted-access-role-bindingnamespace:defaultsubjects: - kind: Group name:eks-console-dashboard-restricted-access-groupapiGroup: rbac.authorization.k8s.io roleRef: kind: Role name:eks-console-dashboard-restricted-access-roleapiGroup: rbac.authorization.k8s.io将
替换为在上一个命令的输出中返回的cluster-role-binding-nameclusterrolebinding名称。kubectl describe clusterrolebindingcluster-role-binding-name输出示例如下。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name:eks-console-dashboard-full-access-bindingsubjects: - kind: Group name:eks-console-dashboard-full-access-groupapiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name:eks-console-dashboard-full-access-clusterroleapiGroup: rbac.authorization.k8s.io
-
-
编辑
aws-authConfigMap。您可以使用eksctl之类的工具更新ConfigMap,或者可以通过编辑它来进行手动更新。重要
我们建议使用
eksctl或者其他工具来编辑ConfigMap。有关您可以使用的其他工具的信息,请参阅《Amazon EKS 最佳实践指南》中的使用工具对aws-authConfigMap进行更改。格式不正确的 aws-authConfigMap可能会导致您失去对集群的访问权限。
将 aws-authConfigMap 应用到集群
使用 eksctl 创建托管节点组时或创建节点组时自动创建 aws-auth ConfigMap 并应用于集群. 最初创建它的目的是允许节点加入您的集群,也可以使用 ConfigMap 为 IAM 主体添加基于角色的访问控制(RBAC)。如果您尚未启动自行管理节点并将 aws-auth ConfigMap 应用到集群,则可以按照下面的过程执行此操作。
将 aws-authConfigMap 应用到集群
-
检查您是否已经应用
aws-authConfigMap。kubectl describe configmap -n kube-system aws-auth如果您收到错误指示“
Error from server (NotFound): configmaps "aws-auth" not found”,则继续以下步骤应用库存ConfigMap。 -
下载、编辑和应用 Amazon 身份验证器配置映射。
-
下载配置映射。
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml -
使用文本编辑器打开 文件。将
替换为与节点关联的 IAM 角色的 Amazon Resource Name (ARN),然后保存相应文件。请勿修改此文件中的任何其他行。<ARN of instance role (not instance profile)>重要
角色 ARN 不能包含
role/my-team/developers/my-role等路径。ARN 的格式必须为arn:aws:iam::。在此示例中,111122223333:role/my-rolemy-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 模板创建的节点组
-
-
应用配置。此命令可能需要几分钟才能完成。
kubectl apply -f aws-auth-cm.yaml注意
如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)。
-
-
查看节点的状态并等待它们达到
Ready状态。kubectl get nodes --watch