Kubernetes 为用户使用 Dashboard 创建 RBAC 权限
文章目录
系统环境:
- kubernetes 版本:1.16.3
参考地址:
- Kubernetes RBAC 官方文档
- 博文示例文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/kubernetes/kubernetes-dashboard-rbac
博文简介:
在我们正常开发过程中,经常要有很多开发组,每个组的应用是属于不同的项目,要分别为他们设置不同的 Namespace,方便让他们资源互不影响。常用的做法是为每个组创建各自的 Namespace,然后给他们 Dashboard 地址和 Token,如何分配 Token 的 RBAC 权限大小,正是我们需要考虑的问题。
常用做法是归属于哪个组的 Namespace 就拥有这个 Namespace 的 Admin 权限,接下来将介绍下,如何分配一个只拥有管理他们自己 Namespace 的权限的 Token。
一、创建 Namespace
这里先创建一个新的 Namespace 空间,用于后面演示。
rbac-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: rbac-namespace
创建 Namespace:
$ kubectl apply -f rbac-namespace.yaml
二、创建 ServiceAccount
创建一个属于上面新建 Namespace 的服务账户,后面对其绑定权限,再获取其 Token 给空间的管理人员,方便其登录 Dashboard 且拥有一定的权限。
rbac-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: rbac-service-account
namespace: rbac-namespace #指定上面创建的 Namespace
创建 ServiceAccount:
$ kubectl apply -f rbac-service-account.yaml
获取 ServiceAccount 的 Token:
注意修改 grep 后面的 ServiceAccount 名称和 -n 后面的 Namespace 名称。
$ kubectl describe secret/$(kubectl get secret -n rbac-namespace | grep rbac-service-account | awk '{print $1}') -n rbac-namespace
然后就可与看到 Token 串,需要将这个保存,方便后面登录 Dashboard,Token 如下:
eyJhbGciOiJSUzI1NiIsImtpZCI6IlZBZWNPbTNaQ2hLUWRhRFFU......(略)
三、创建 Namespace 的 RBAC 权限
这里有两种方法来对上面创建的服务账户绑定角色,进而赋予账户权限。
- 方式一: 使用系统提供角色分配 Namespace 权限,系统提供了 admin(读、写)、view(读)、edit(写) 三种角色,可以直接与服务账户绑定进行赋权。
- 方式二: 使用自定义角色分配 Namespace 权限,这种是创建一个角色绑定一定权限,然后将角色绑定服务账户,进行赋权。
1、方式一:使用系统提供角色分配 Namespace 权限
这里创建一个 RoleBinding 来绑定系统提供的 ClusterRole,其中 Kubernetes 默认提供了三种集群角色:
- edit: 能够提供对某个 Namespace 写权限。
- view: 能够提供对某个 Namespace 读权限。
- admin: 管理员权限,能够提供对某个 Namespace 读、写权限。
rbac-role-binding-system.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbac-role-binding
namespace: rbac-namespace #指定创建的 Namespace
subjects:
- kind: ServiceAccount
name: rbac-service-account #指定创建的 ServiceAccount
namespace: rbac-namespace #指定创建的 Namespac
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin #使用系统提供三种角色 admin、edit、view
注意:这里使用 RoleBinding 和系统提供的 ClusterRoleBinding 绑定,而不是 ClusterRoleBinding,如果想赋予服务账户集群权限(管理多个 Namespace)可以使用 ClusterRoleBinding。
创建 RoleBinding:
$ kubectl apply -f rbac-role-binding.yaml
2、方式二:使用自定义角色分配 Namespace 权限
创建一个角色,给角色分配一定的权限,然后创建还得添加一个角色绑定对象,将角色和绑定到服务账户上,内容如下:
具体权限分配,可以参考博客最上面的官方文档地址。
rbac-role-binding-custom.yaml
#role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbac-role
namespace: rbac-namespace #指定 Namespace
rules: #权限分配
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: ["extensions", "apps"]
resources: ["deployments","statefulsets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
#role binding
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbac-role-binding
namespace: rbac-namespace #指定 Namespace
subjects:
- kind: ServiceAccount
name: rbac-service-account #指定 ServiceAccount
namespace: rbac-namespace #指定 Namespace
roleRef:
kind: Role
name: rbac-role
apiGroup: rbac.authorization.k8s.io
创建角色与角色绑定绑定对象:
$ kubectl apply -f rbac-role-binding.yaml
四、解决登录 Dashboard 不能选择 Namespace 问题
在访问 Dashboard 时,输入 token 后进入界面,但是会发现进入的是默认的 default 空间,然后想点击 Namespace 选择框来切换到自定义空间,但是发现点击后可选择的列表为空。
这个问题经过一番考虑,是由于配置的 ServiceAccount 没有集群 Namespace 列表的权限,所以无法进行选择。解决这个问题很简单,只需要这里需要给 ServiceAccount 分配一个拥有 Namespace 列表的 ClusterRole 进行绑定即可。
rbac-cluster-role-binding.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbac-namespace-role
rules:
- apiGroups: [""] #配置权限,配置其只用于 namespace 的 list 权限
resources: ["namespaces"]
verbs: ["list"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbac-default-role-binding
subjects:
- kind: ServiceAccount
name: rbac-service-account #配置为自定义的 ServiceAccount
namespace: rbac-namespace #指定为服务账户所在的 Namespace
roleRef:
kind: ClusterRole
name: rbac-namespace-role #配置上面的 Role
apiGroup: rbac.authorization.k8s.io
执行命令创建 rbac 权限:
$ kubectl apply -f rbac-cluster-role.yaml
然后再次进入 Dashboard 点击 Namespace 框,这时候应该就能看到 Namespace 列表了。
到这里差不多配置完成,接下来就是拿着 Token 登录 Dashboard,进入后选择新创建的 Namespace,然后执行一些需要权限才能操作的命令(例如,创建与查看 Secret)进行测试。