有关EKS系列文档和实验的汇总,请点击这里跳转
使用EKS服务过程中,经常出现创建EKS集群和管理EKS集群的不是一个人。由此会导致在AWS控制台上显示EKS服务不正常,无法获取有关配置。例如出现如下错误:

通俗点说:A使用eksctl命令行工具创建了集群,B在AWS控制台上看不到,现在需要A给B授权。B可能是一个IAM User用户,也可能是一个IAM Role角色(虚拟的)。根据B是用户还是角色,后续操作二选一。
解决办法如下。
一、查看当前授权
以EKS创建者的身份,在命令行下执行如下命令:
kubectl describe configmap -n kube-system aws-auth
返回结果如下:
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws-cn:iam::420029960748:role/eksctl-eksworkshopbj-nodegroup-no-NodeInstanceRole-BGKUROWI9QA5
username: system:node:{{EC2PrivateDNSName}}
Events: <none>
这里可以看到只在groups下边只有一个默认的。接下来只要将groups这一段增加一个新的IAM角色或者IAM用户即可。
二、编辑配置文件添加新的管理员
1、编辑配置文件
本步骤需要在使用eksctl命令创建EKS集群的这个客户端上执行。当使用eksctl创建好集群时,eksctl会在这台电脑上自动设置kubectl配置文件。因此继续使用kubectl可以在创建者这个客户端上完成配置。
执行如下命令:
kubectl edit -n kube-system configmap/aws-auth
编辑配置文件,此时会Windows会自动弹出记事本编辑器,Linux会自动进入vi编辑器。其默认内容如下。
# 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-cn:iam::420029960748:role/eksctl-eksworkshopbj-nodegroup-no-NodeInstanceRole-BGKUROWI9QA5
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-23T10:36:54Z"
name: aws-auth
namespace: kube-system
resourceVersion: "1256"
uid: b019ca52-a416-4726-96f0-a468d86203ac</code></pre>
2、添加新的IAM角色
从AWS控制台进入IAM模块,找到要授权的IAM角色(前文B提到的身份,A给B授权,因此去找B的ARN)的ARN ID,构造如下一段:
- groups:
- system:masters
rolearn: arn:aws-cn:iam::420029960748:role/newrolename
username: newrolename
将这一段加入到mapRoles下,注意空格缩进要对齐。添加完毕后效果如下:
# 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-cn:iam::420029960748:role/eksctl-eksworkshopbj-nodegroup-no-NodeInstanceRole-BGKUROWI9QA5
username: system:node:{{EC2PrivateDNSName}}
- groups:
- system:masters
rolearn: arn:aws-cn:iam::420029960748:role/newrolename
username: newrolename
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-23T10:36:54Z"
name: aws-auth
namespace: kube-system
resourceVersion: "1256"
uid: b019ca52-a416-4726-96f0-a468d86203ac</code></pre>
修改后保存配置文件,关闭窗口即可生效。
3、增加新的IAM用户
从AWS控制台进入IAM模块,找到要授权的IAM角色(前文B提到的身份,这里是A给B授权,因此去找B的ARN)的ARN ID,构造如下一段:
mapUsers: |
- userarn: arn:aws:iam::11122223333:user/newusername
username: newusername
groups:
- system:masters
将这一段加入到mapRoles下,注意空格缩进要对齐。添加完毕后效果如下:
# 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-cn:iam::420029960748:role/eksctl-eksworkshopbj-nodegroup-no-NodeInstanceRole-BGKUROWI9QA5
username: system:node:{{EC2PrivateDNSName}}
mapUsers: |
- userarn: arn:aws:iam::420029960748:user/newusername
username: newusername
groups:
- system:masters
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-23T10:36:54Z"
name: aws-auth
namespace: kube-system
resourceVersion: "1256"
uid: b019ca52-a416-4726-96f0-a468d86203ac</code></pre>
在Windows上保存记事本,并关闭窗口。在Linux上则使用vim保存退出。之后命令行会提示保存生效。
修改后保存配置文件,关闭窗口即可生效。
4、从命令行验证访问(可选)
再次执行:
kubectl describe configmap -n kube-system aws-auth
即可看到返回的授权信息中已经包含了新创建的IAM角色或者用户了。
5、从控制台验证访问
进入AWS控制台EKS服务,可以看到刚才提示没权限看不到Nodegroup的集群,现在已经可以查看了。
三、为新的用户生成kubectl配置以便于在其他电脑上管理EKS集群
上文授权完毕后,另外的IAM角色或者用户可以在AWS控制台上管理EKS集群。如果新用户希望通过命令行kubectl进行管理,那么这需要为新授权的IAM Role或者IAM User创建kube config配置文件。
以下步骤不需要EKS集群原始创建者身份。以下步骤是以被授权的新管理员身份来执行的。
1、确认自己有权限访问EKS集群
从AWS控制台进入集群,确保自己已经是被授权为EKS管理员,可以看到nodegroup下的节点。授权步骤如本文上一段。
2、设置AWSCLI
为本用户创建AKSK(Access Key/Secret Key),然后安装AWS CLI,并配置好正确的区域,例如宁夏区域是cn-northwest-1。配置CLI时候输出格式可以设置为json或者不设置也可以。
确认AWSCLI工作正常后,执行如下命令:
aws eks update-kubeconfig --region region-code --name cluster-name
即可为kubectl创建config文件。
3、验证kubectl生效
执行如下命令:
kubectl get nodes
确认是否正常列出node节点。
如果遇到报错的话,可在当前用户home目录下删除掉旧的配置文件。这个目录是隐藏目录。Windows默认在 C:\Users\Administrator.kube\config 位置。Linux默认在当前主目录下 .kube/config 位置。