将IAM用户或角色授权为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 位置。

四、参考文档

在 Amazon EKS 中创建集群之后,如何提供对其他 IAM 用户和角色的访问权限?

为 Amazon EKS 创建 kubeconfig