帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
向 IAM 用户授予使用 ConfigMap 访问 Kubernetes 的权限
重要
aws-auth ConfigMap 已弃用。有关管理 Kubernetes API 访问权限的推荐方法,请参阅使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限。
在 Amazon EKS 控制面板上运行的 AWS 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 鉴权
-
确定
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-authConfigMap。只有节点实例角色才有权访问集群。 -
请确保拥有现有的 Kubernetes
roles和rolebindings,或者可将 IAM 主体映射到其中的clusterroles和clusterrolebindings。有关这些资源的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。 -
查看您现有的 Kubernetes
roles或clusterroles。Roles范围限定为namespace,但clusterroles范围则限定为集群。kubectl get roles -Akubectl get clusterroles -
查看之前的输出中返回的任何
role或clusterrole的详细信息,并确认它具有您希望 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 -
查看您现有的 Kubernetes
rolebindings或clusterrolebindings。Rolebindings范围限定为namespace,但clusterrolebindings范围则限定为集群。kubectl get rolebindings -Akubectl get clusterrolebindings -
查看任何
rolebinding或clusterrolebinding的详细信息,并确认它具有在上一步中列为roleRef的role或clusterrole,以及为subjects列出的组名称。将
role-binding-name替换为在上一个命令的输出中返回的rolebinding名称。将kube-system替换为rolebinding的namespace。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
-
-
编辑
aws-authConfigMap。您可以使用eksctl之类的工具更新ConfigMap,或者可以通过编辑它来进行手动更新。重要
我们建议使用
eksctl或者其他工具来编辑ConfigMap。有关您可以使用的其它工具的信息,请参阅《Amazon EKS 最佳实践指南》中的使用工具对 aws-authConfigMap 进行更改。格式不正确的 aws-authConfigMap可能会导致您失去对集群的访问权限。-
查看使用 eksctl 编辑 configmap 的步骤。
-
查看手动编辑 configmap 的步骤。
-
使用 Eksctl 编辑 Configmap
-
您需要在设备或 AWS CloudShell 上安装
0.212.0版或更高版本的eksctl命令行工具。要安装或更新eksctl,请参阅eksctl文档中的 Installation。 -
查看
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 -
为角色添加映射。将
my-role替换为您的角色名称。将eks-console-dashboard-full-access-group替换为在 KubernetesRoleBinding或ClusterRoleBinding对象中指定的组名称。请将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-rolemy-team/developers/需要删除。示例输出如下。
[...] 2022-05-09 14:51:20 [ℹ] adding identity "{arn-aws}iam::111122223333:role/my-role" to auth ConfigMap -
为用户添加映射。IAM 最佳实践建议您向角色而不是用户授予权限。将
my-user替换为您的用户名。将eks-console-dashboard-restricted-access-group替换为在 KubernetesRoleBinding或ClusterRoleBinding对象中指定的组名称。请将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 -
再次查看
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
手动编辑 Configmap
-
打开
ConfigMap文件进行编辑。kubectl edit -n kube-system configmap/aws-auth注意
如果您收到错误指示“
Error from server (NotFound): configmaps "aws-auth" not found”,请使用将 aws-auth ConfigMap 应用于您的集群中的过程来应用库存ConfigMap。 -
将您的 IAM 主体添加到
ConfigMap。IAM 组不是 IAM 主体,因此无法将其添加到ConfigMap。-
添加 IAM 角色(例如,对于联合身份用户):将角色详细信息添加到
data下ConfigMap的mapRoles部分。如果此部分在文件中尚不存在,请添加它。每个条目支持以下参数:-
rolearn:要添加的 IAM 角色的 ARN。此值不能包含路径。例如,您无法指定 ARN,例如
arn:aws:iam::。ARN 需要为111122223333:role/my-team/developers/role-namearn:aws:iam::。111122223333:role/role-name -
username:Kubernetes 内要映射到 IAM 角色的用户名。
-
组:要将角色映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是
clusterrolebinding或rolebinding中指定的组。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定。
-
-
要添加 IAM 用户:IAM 最佳实践建议您向角色而不是用户授予权限。将用户详细信息添加到
data下ConfigMap的mapUsers部分。如果此部分在文件中尚不存在,请添加它。每个条目支持以下参数:-
userarn:要添加的 IAM 用户的 ARN。
-
username:Kubernetes 内要映射到 IAM 用户的用户名。
-
组:要将用户映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是
clusterrolebinding或rolebinding中指定的组。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定。
-
-
-
例如,下面的 YAML 块包含:
-
一个
mapRoles部分,此部分将 IAM 节点实例映射到 Kubernetes 组,以便节点可以自行注册到集群,和映射到可以查看所有集群的所有 Kubernetes 资源的 Kubernetes 组的my-console-viewer-roleIAM 角色。有关my-console-viewer-roleIAM 角色所需的 IAM 和 Kubernetes 组权限的列表,请参阅 所需的权限。 -
一个
mapUsers部分,此部分将默认 AWS 账户中的adminIAM 用户映射到system:mastersKubernetes 组,以及映射到可以查看特定命名空间的 Kubernetes 资源的 Kubernetes 组的另一个 AWS 账户的my-user用户。有关my-userIAM 用户所需的 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
-
-
保存文件并退出文本编辑器。
将 aws-authConfigMap 应用到集群
使用 eksctl 创建托管节点组时或创建节点组时自动创建 aws-authConfigMap 并应用于集群。最初创建它的目的是允许节点加入您的集群,也可以使用 ConfigMap 为 IAM 主体添加基于角色的访问控制(RBAC)。如果您尚未启动自行管理的节点并且未将 aws-auth ConfigMap 应用到集群,则可以按照下面的过程执行此操作。
-
检查您是否已经应用了
aws-authConfigMap。kubectl describe configmap -n kube-system aws-auth如果您收到错误指示“
Error from server (NotFound): configmaps "aws-auth" not found”,则继续以下步骤应用库存ConfigMap。 -
下载、编辑和应用 AWS 身份验证器配置映射。
-
下载配置映射。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml -
在
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-rolemy-team/developers/需要删除。您可以检查节点组的 AWS CloudFormation 堆栈输出,并查找以下值:
-
InstanceRoleARN – 对于使用
eksctl创建的节点组 -
NodeInstanceRole – 对于在 AWS Management Console 中使用 Amazon EKS 提供的 AWS CloudFormation 模板创建的节点组
-
-
应用配置。此命令可能需要几分钟才能完成。
kubectl apply -f aws-auth-cm.yaml注意
如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)。
-
-
查看节点的状态并等待它们达到
Ready状态。kubectl get nodes --watch输入
Ctrl+C以返回到 Shell 提示符。