AWS EKS 授权其它账户进行访问
先前我使用AWS的EKS服务创建了一个集群,一段时间以来都只有我一个人访问该集群,但是今天同事也需要访问我创建的这个集群便遇到了问题,折腾了很久才解决。我同时还在使用腾讯云的容器服务(也是类似于EKS的一个服务),腾讯云的逻辑大概是容器服务会为主账户下每个能够访问该集群的账号自动生成一个对应的kubeconfig,且都是集群管理员的权限,每个人可以直接在网页上下载到kubeconfig并连接到集群,但是到了AWS上,这一步要麻烦的多,当你尝试访问他人创建的集群时,会看见下图的提示 您的当前用户或角色无权访问此 EKS cluster 上的 Kubernetes 对象。
为了解决这个问题,我主要参考了下面两个网页上的文档:
- 如何解决 Amazon EKS 中的“您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象”错误?
- 让 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的身份访问集群了。