Kubernetes 为用户使用 Dashboard 创建 RBAC 权限

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

1kind: Namespace
2apiVersion: v1
3metadata:
4  name: rbac-namespace

创建 Namespace:

1$ kubectl apply -f rbac-namespace.yaml

二、创建 ServiceAccount

创建一个属于上面新建 Namespace 的服务账户,后面对其绑定权限,再获取其 Token 给空间的管理人员,方便其登录 Dashboard 且拥有一定的权限。

rbac-service-account.yaml

1apiVersion: v1
2kind: ServiceAccount
3metadata:
4  name: rbac-service-account
5  namespace: rbac-namespace     #指定上面创建的 Namespace

创建 ServiceAccount:

1$ kubectl apply -f rbac-service-account.yaml

获取 ServiceAccount 的 Token:

注意修改 grep 后面的 ServiceAccount 名称和 -n 后面的 Namespace 名称。

1$ 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

 1kind: RoleBinding
 2apiVersion: rbac.authorization.k8s.io/v1
 3metadata:
 4  name: rbac-role-binding
 5  namespace: rbac-namespace     #指定创建的 Namespace
 6subjects:
 7  - kind: ServiceAccount
 8    name: rbac-service-account  #指定创建的 ServiceAccount
 9    namespace: rbac-namespace   #指定创建的 Namespac
10roleRef:
11  apiGroup: rbac.authorization.k8s.io
12  kind: ClusterRole
13  name: admin                   #使用系统提供三种角色 admin、edit、view

注意:这里使用 RoleBinding 和系统提供的 ClusterRoleBinding 绑定,而不是 ClusterRoleBinding,如果想赋予服务账户集群权限(管理多个 Namespace)可以使用 ClusterRoleBinding。

创建 RoleBinding:

1$ kubectl apply -f rbac-role-binding.yaml

2、方式二:使用自定义角色分配 Namespace 权限

创建一个角色,给角色分配一定的权限,然后创建还得添加一个角色绑定对象,将角色和绑定到服务账户上,内容如下:

具体权限分配,可以参考博客最上面的官方文档地址。

rbac-role-binding-custom.yaml

 1#role
 2kind: Role
 3apiVersion: rbac.authorization.k8s.io/v1
 4metadata:
 5  name: rbac-role
 6  namespace: rbac-namespace                 #指定 Namespace
 7rules:                                      #权限分配
 8  - apiGroups: [""]
 9    resources: ["pods"]
10    verbs: ["get", "watch", "list"]
11  - apiGroups: ["extensions", "apps"]
12    resources: ["deployments","statefulsets"]
13    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 
14---
15#role binding
16kind: RoleBinding
17apiVersion: rbac.authorization.k8s.io/v1
18metadata:
19  name: rbac-role-binding
20  namespace: rbac-namespace                 #指定 Namespace
21subjects:
22  - kind: ServiceAccount
23    name: rbac-service-account              #指定 ServiceAccount
24    namespace: rbac-namespace               #指定 Namespace
25roleRef:
26  kind: Role
27  name: rbac-role
28  apiGroup: rbac.authorization.k8s.io

创建角色与角色绑定绑定对象:

1$ kubectl apply -f rbac-role-binding.yaml

四、解决登录 Dashboard 不能选择 Namespace 问题

在访问 Dashboard 时,输入 token 后进入界面,但是会发现进入的是默认的 default 空间,然后想点击 Namespace 选择框来切换到自定义空间,但是发现点击后可选择的列表为空。

这个问题经过一番考虑,是由于配置的 ServiceAccount 没有集群 Namespace 列表的权限,所以无法进行选择。解决这个问题很简单,只需要这里需要给 ServiceAccount 分配一个拥有 Namespace 列表的 ClusterRole 进行绑定即可。

rbac-cluster-role-binding.yaml

 1kind: ClusterRole
 2apiVersion: rbac.authorization.k8s.io/v1
 3metadata:
 4  name: rbac-namespace-role 
 5rules:  
 6  - apiGroups: [""]                     #配置权限,配置其只用于 namespace 的 list 权限
 7    resources: ["namespaces"]
 8    verbs: ["list"]
 9---
10kind: ClusterRoleBinding
11apiVersion: rbac.authorization.k8s.io/v1
12metadata:
13  name: rbac-default-role-binding
14subjects:
15  - kind: ServiceAccount
16    name: rbac-service-account          #配置为自定义的 ServiceAccount
17    namespace: rbac-namespace			#指定为服务账户所在的 Namespace
18roleRef:
19  kind: ClusterRole
20  name: rbac-namespace-role             #配置上面的 Role
21  apiGroup: rbac.authorization.k8s.io

执行命令创建 rbac 权限:

1$ kubectl apply -f rbac-cluster-role.yaml

然后再次进入 Dashboard 点击 Namespace 框,这时候应该就能看到 Namespace 列表了。


到这里差不多配置完成,接下来就是拿着 Token 登录 Dashboard,进入后选择新创建的 Namespace,然后执行一些需要权限才能操作的命令(例如,创建与查看 Secret)进行测试。

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。