帮助改进此页面
想为本用户指南做出贡献? 选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。您的贡献有助于我们的用户指南为每个人提供更充分的参考。
使用 ConfigMap 向 IAM 用户授予对 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-auth
ConfigMap
。只有节点实例角色才有权访问集群。 -
请确保您拥有现有的 Kubernetes
roles
和rolebindings
或者clusterroles
和clusterrolebindings
,您可以将 IAM 主体映射到其中。有关这些资源的更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。 -
查看您现有的 Kubernetes
roles
或clusterroles
。Roles
范围限定为namespace
,但clusterroles
范围则限定为集群。kubectl get roles -A
kubectl 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 -A
kubectl 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-auth
ConfigMap
。您可以使用eksctl
之类的工具更新ConfigMap
,或者可以通过编辑它来进行手动更新。重要
我们建议使用
eksctl
或者其他工具来编辑ConfigMap
。有关您可以使用的其它工具的信息,请参阅《Amazon EKS 最佳实践指南》中的使用工具对 aws-authConfigMap 进行更改。格式不正确的 aws-auth
ConfigMap
可能会导致您失去对集群的访问权限。-
查看使用 eksctl 编辑 configmap 的步骤。
-
查看手动编辑 configmap 的步骤。
-
使用 Eksctl 编辑 Configmap
-
您需要在设备或 AWS CloudShell 上安装
0.199.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-role
my-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-name
arn:aws:iam::
。111122223333
:role/role-name
-
username:Kubernetes 内要映射到 IAM 角色的用户名。
-
groups:要将角色映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是
clusterrolebinding
或rolebinding
中指定的组。有关更多信息,请参阅 Kubernetes 文档中的默认角色和角色绑定。
-
-
要添加 IAM 用户:IAM 最佳实践建议您向角色而不是用户授予权限。将用户详细信息添加到
data
下ConfigMap
的mapUsers
部分。如果此部分在文件中尚不存在,请添加它。每个条目支持以下参数:-
userarn:要添加的 IAM 用户的 ARN。
-
username:Kubernetes 内要映射到 IAM 用户的用户名。
-
groups:要将用户映射到的组或 Kubernetes 组列表。该组可以是默认组,也可以是
clusterrolebinding
或rolebinding
中指定的组。有关更多信息,请参阅 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
-
-
保存文件并退出文本编辑器。
将 aws-auth
ConfigMap
应用到集群
使用 eksctl
创建托管节点组时或创建节点组时自动创建 aws-auth
ConfigMap
并应用于集群。最初创建它的目的是允许节点加入您的集群,也可以使用 ConfigMap
为 IAM 主体添加基于角色的访问控制(RBAC)。如果您尚未启动自行管理的节点并且未将 aws-auth
ConfigMap
应用到集群,则可以按照下面的过程执行此操作。
-
检查您是否已经应用了
aws-auth
ConfigMap
。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-role
my-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 提示符。