无法在亚马逊 EKS 集群中执行 kubectl 顶级节点
Can't execute kubectl top nodes in amazon EKS cluster
场景重现简单:
- 使用 Role TempAdmin 创建 eks 集群(我们遵循 this documentation)
- 使用 TempAdmin 配置我的凭据,我可以这样做:
kubectl top nodes
- documentation 表示创建集群的 user/rol 被自动授予 system:masters 权限。创建一个新角色 (Admin) 并授予该角色 system:masters 权限:
$ kubectl get configmap -n kube-system aws-auth -o yaml
apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::xxxxxxxxxxxx:role/EKS-Workers2-NodeInstanceRole-HWD4HSSO7NP1
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
- rolearn: arn:aws:iam::xxxxxxxxxxxx:role/Admin
groups:
- system:masters
kind: ConfigMap
...
- 现在,配置我的凭证以使用 Admin 角色,我可以几乎 做任何事情:我可以创建名称空间、编辑 aws-auth configmap、获取节点。但是,当我尝试顶级节点时:
$ kubectl top nodes
Error from server (Forbidden): nodes.metrics.k8s.io is forbidden: User "system:anonymous" cannot list nodes.metrics.k8s.io at the cluster scope: no RBAC policy matched
补充信息:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-10T23:35:51Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.10-eks-2e569f", GitCommit:"2e569fd887357952e506846ed47fc30cc385409a", GitTreeState:"clean", BuildDate:"2019-07-25T23:13:33Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}
正如我在评论中提到的,解决方案是添加用户名,无论您是在 AWS 中使用 IAM 角色还是 IAM 用户。映射必须在你的 configmap 中指定,否则用户名将永远不会在 kubernetes 集群中创建,因此它不会被映射到任何权限。
因此您在新添加到 mapRoles 的块中缺少用户名部分。
文档有些地方有点旧,在 configmaps 中明确说明总是好的。这至少是我通常尝试遵循的事情。
我很高兴你成功了。 :)
场景重现简单:
- 使用 Role TempAdmin 创建 eks 集群(我们遵循 this documentation)
- 使用 TempAdmin 配置我的凭据,我可以这样做:
kubectl top nodes
- documentation 表示创建集群的 user/rol 被自动授予 system:masters 权限。创建一个新角色 (Admin) 并授予该角色 system:masters 权限:
$ kubectl get configmap -n kube-system aws-auth -o yaml
apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::xxxxxxxxxxxx:role/EKS-Workers2-NodeInstanceRole-HWD4HSSO7NP1
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
- rolearn: arn:aws:iam::xxxxxxxxxxxx:role/Admin
groups:
- system:masters
kind: ConfigMap
...
- 现在,配置我的凭证以使用 Admin 角色,我可以几乎 做任何事情:我可以创建名称空间、编辑 aws-auth configmap、获取节点。但是,当我尝试顶级节点时:
$ kubectl top nodes
Error from server (Forbidden): nodes.metrics.k8s.io is forbidden: User "system:anonymous" cannot list nodes.metrics.k8s.io at the cluster scope: no RBAC policy matched
补充信息:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-10T23:35:51Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.10-eks-2e569f", GitCommit:"2e569fd887357952e506846ed47fc30cc385409a", GitTreeState:"clean", BuildDate:"2019-07-25T23:13:33Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}
正如我在评论中提到的,解决方案是添加用户名,无论您是在 AWS 中使用 IAM 角色还是 IAM 用户。映射必须在你的 configmap 中指定,否则用户名将永远不会在 kubernetes 集群中创建,因此它不会被映射到任何权限。
因此您在新添加到 mapRoles 的块中缺少用户名部分。
文档有些地方有点旧,在 configmaps 中明确说明总是好的。这至少是我通常尝试遵循的事情。
我很高兴你成功了。 :)