Kubernetes Dashboard创建RBAC权限

系统环境:

  • kubernetes 版本:1.16.3

参考地址:

简介:

在我们正常开发过程中,经常要有很多开发组,每个组的应用是属于不同的项目,要分别为他们设置不同的 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 列表了。

 

发表评论