为其他用户授权使用已经创建的EKS

背景

使用用户或角色创建Amazon EKS 集群成功后,创建集群的 IAM 实体(用户或角色)将添加到 Kubernetes RBAC 授权表作为管理员(具有 system:master 权限),这也就意味着仅该 IAM 实体(用户或角色)可以使用 kubectl 调用 Kubernetes API(谁创建,谁就是管理员)。在生产环境上,偶尔我们研发需要定位生产上的问题,但是由于研发并不是EKS 的创建者,没有对应权限,所以他并不能通过kubectl 来操作已有的EKS,因此在本篇将介绍如何为其他用户授权使用已经创建的EKS

思路

有两种方式可以让非EKS创建者执行kubectl 访问EKS

方法一:给用户授权,让他变成k8s 的system:masters

方法二:创建角色,给角色授权,让角色成为system:masters,

通过创建角色,给角色授权,再将角色附加到EC2上,用户通过登录EC2 后可以执行kubectl 访问 EKS,这是一种比较安全的做法,限制用户只能在某一台机器上操作,推荐使用这个方法

示演

步骤一:使用创建者对目标用户或角色进行授权

由于只有创建者是EKS 的管理员,所以最开始只能通过创建者来进行授权。注意,这里的授权与IAM 中的授权不一样,IAM 中,我们是通过策略定义了对资源的操作权限,再将策略附加给用户或角色,使用户或角色有了对资源的操作权限,在EKS 中,我们需要将用户或角色添加到Kubernetes RBAC表中进行授权

在这里我们假设是用户A创建的EKS,在操作机器上已经配置用户A 的aksk到AWS CLI 中,通过下列命令将目标eks-test2 集群与操作机器关联

aws eks --region ap-east-1 update-kubeconfig --name eks-test2

注:必须为用户分配eks-test2的 eks:DescribeCluster IAM 权限

创建aws-auth.yaml文件,如果是给用户授权,则在mapUsers 下配置对应的用户ARN,然后在group下配置system:masters,如果是给角色授权,在mapRoles 下配置对应的角色ARN,然后在group下设置system:masters,代表这个角色可以控制eks

aws-auth.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::<account_id>:role/EKS-node-Role
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
    - rolearn: arn:aws:iam::<account_id>:role/<roleName>
      username: <roleName>
      groups:
        - system:masters
  mapUsers: |
    - userarn: arn:aws:iam::<account_id>:user/username
      username: <username>
      groups:
        - system:masters

执行以下命令将用户或角色添加到Kubernetes RBAC中

[ec2-user@ip-172-31-23-36 ~]$ kubectl apply -f aws-auth.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
configmap/aws-auth configured

验证权限已经添加到Kubernetes RBAC中

$ kubectl edit -n kube-system configmap/aws-auth

执行上面命令,我们可以看到前面配置的用户,角色已被添加到Kubernetes RBAC

步骤二:使用被授权的用户或角色进行操作eks

这里使用 test 用户来进行验证,首先将test aksk 配置在 cli 中, 配置后通过aws sts get-caller-identity查看当前用户是否配置正确

然后将eks 集群与test 用户操作的机器进行关联

aws eks --region ap-east-1 update-kubeconfig --name eks-test2

执行kubectl 命令,看到可以通过

[ec2-user@ip-172-31-23-36 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   58m

对比测试,我们使用另一个没有权限的 用户执行

如果用户没有被添加到Kubernetes RBAC ,执行kubectl 命令操作eks 时会提示 error: You must be logged in to the server (Unauthorized)

总结

  1. EKS 创建成功后,只有创建者(用户或角色)有权限通过kubectl 操作eks

  2. 最开始,只能通过创建者对用户或角色进行授权操作eks

  3. 授权成功后,被授权用户需要在操作机器上执行aws eks --region regioncode update-kubeconfig --name cluster-name

    命令将集群与机器关联

  4. 推荐使用角色的方式授权,将角色附加在指定的EC2 上,控制用户只能通过这台EC2 操作eks

最后更新于