Featured image of post AWS EKS 授权其它账户访问

AWS EKS 授权其它账户访问

相对于腾讯云,AWS的权限控制要更加的细化与强大,但是同时也更加的复杂,本文记录了如何将自己创建的EKS集群授权给其他用户访问。

AWS EKS 授权其它账户进行访问

先前我使用AWS的EKS服务创建了一个集群,一段时间以来都只有我一个人访问该集群,但是今天同事也需要访问我创建的这个集群便遇到了问题,折腾了很久才解决。我同时还在使用腾讯云的容器服务(也是类似于EKS的一个服务),腾讯云的逻辑大概是容器服务会为主账户下每个能够访问该集群的账号自动生成一个对应的kubeconfig,且都是集群管理员的权限,每个人可以直接在网页上下载到kubeconfig并连接到集群,但是到了AWS上,这一步要麻烦的多,当你尝试访问他人创建的集群时,会看见下图的提示 您的当前用户或角色无权访问此 EKS cluster 上的 Kubernetes 对象

无权限访问集群

为了解决这个问题,我主要参考了下面两个网页上的文档:

  1. 如何解决 Amazon EKS 中的“您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象”错误?
  2. 让 IAM 用户和角色有权访问您的集群

在AWS上,EKS只会给与集群的创建者system:masters权限,而后续的权限添加需要该集群的创建者来执行,我们需要做的是建立 IAM 的用户或是角色与集群中的角色的映射关系。

首先创建集群角色并创建一个角色绑定,参考 清单 按照需求给与权限

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks-console-dashboard-full-access-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - namespaces
  - pods
  - configmaps
  - endpoints
  - events
  - limitranges
  - persistentvolumeclaims
  - podtemplates
  - replicationcontrollers
  - resourcequotas
  - secrets
  - serviceaccounts
  - services
  verbs:
  - get
  - list
  - create
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - statefulsets
  - replicasets
  verbs:
  - get
  - list
  - create
- apiGroups:
  - batch
  resources:
  - jobs
  - cronjobs
  verbs:
  - get
  - list
  - create
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - get
  - list
- apiGroups:
  - discovery.k8s.io
  resources:
  - endpointslices
  verbs:
  - get
  - list
- apiGroups:
  - events.k8s.io
  resources:
  - events
  verbs:
  - get
  - list
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - ingresses
  - networkpolicies
  - replicasets
  verbs:
  - get
  - list
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - networkpolicies
  verbs:
  - get
  - list
  - create
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - get
  - list
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - rolebindings
  - roles
  verbs:
  - get
  - list
  - create
- apiGroups:
  - storage.k8s.io
  resources:
  - csistoragecapacities
  verbs:
  - get
  - list
  - create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks-console-dashboard-full-access-binding
subjects:
- kind: Group
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: eks-console-dashboard-full-access-clusterrole
  apiGroup: rbac.authorization.k8s.io

需要注意的一点是,我在创建ClusterRoleBinding的时候将实例文件中的 eks-console-dashboard-full-access-group 改为了 cluster-admin,之后再编辑 ConfigMap 中的 aws-auth,追加下列内容(使用命令 kubectl edit configmap aws-auth -n kube-system)。

1
2
3
4
5
6
7
  mapUsers: |
    - groups:
      - system:bootstrappers
      - system:nodes
      - eks-console-dashboard-full-access-binding
      userarn: arn:aws:iam::71371xxxxxxx:user/othername
      username: othername    

如果本地安装了 eksctl 也可以使用下面的命令配置:

1
2
3
4
eksctl create iamidentitymapping --cluster prod --region=ap-northeast-1 --arn arn:aws:iam::713719xxxx:user/othername --group system:bootstrappers,system:nodes,cluster-admin --no-duplicate-arns

# 验证
eksctl get iamidentitymapping --cluster prod --region=ap-northeast-1

保存后用户便可以以IAM的身份访问集群了。

comments powered by Disqus
本站访客数:
Built with Hugo
主题 StackJimmy 设计