在 Kubernetes Dashboard 创建基于 RBAC 的授权用户¶
Kuberenetes Dashboard 默认情况下,创建了一个 Admin 角色的用户,属于超级管理员。
我们希望在创建一些普通用户,基于 namespace 进行划分,每个创建的用户只能在指定的 namespace 下进行一些执行的操作,下面是步骤
基于 namespace 内的用户创建¶
以下的操作是将创建的用户限定在指定的 namespace 下,集群资源以及其他 namespace 资源不可见
在 namespace 上创建 ServiceAccount 资源¶
kubectl create sa staff-user -n staff-center
创建用户角色¶
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: staff-center
name: role-staff
rules:
- apiGroups: [""]
resources: ["pods","services","deployments", "pods/log","ingresses", "endpoints", "statefulsets", "jobs","cronjobs","daemonsets"]
verbs: ["get", "watch", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "watch", "list","create"]
保存为 role-staff-user.yaml
创建角色绑定¶
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: role-bind-staff
namespace: staff-center
subjects:
- kind: ServiceAccount
name: staff-user
namespace: staff-center
roleRef:
kind: Role
name: role-staff
apiGroup: rbac.authorization.k8s.io
保存为 role-binding-staff-user.yaml
执行上面个配置文件¶
kubectl apply -f role-staff-user.yaml
kubectl apply -f role-binding-staff-user.yaml
获得该用户的 token¶
## 1. get secret
secpod=$(kubectl get sa -n staff-center staff-user -o jsonpath='{.secrets[0].name}')
## 2. get token
token=$(kubectl get secret -n staff-center ${secpod} -o jsonpath='{.data.token}' |base64 -d)
echo "your login token: ${token}"
将脚本保存为 get-token.sh
, 然后执行,可以获得当前用户的 token
,用这个 token 就可以登录到 Dashboard。
获取可以配置的资源列表¶
在创建角色的配置文件中,如何知道当前有哪些资源可以用于 resources
的配置呢?我们可以直接查询 api-resources
即可获得,如下:
[root@master dashboard]# kubectl api-resources --sort-by=name
NAME SHORTNAMES APIVERSION NAMESPACED KIND
apiservices apiregistration.k8s.io/v1 false APIService
apiservices management.cattle.io/v3 false APIService
apps catalog.cattle.io/v1 true App
authconfigs management.cattle.io/v3 false AuthConfig
bgpconfigurations crd.projectcalico.org/v1 false BGPConfiguration
bgppeers crd.projectcalico.org/v1 false BGPPeer
bindings v1 true Binding
blockaffinities crd.projectcalico.org/v1 false BlockAffinity
caliconodestatuses crd.projectcalico.org/v1 false CalicoNodeStatus
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
clusterflows logging.banzaicloud.io/v1beta1 true ClusterFlow
clusterinformations crd.projectcalico.org/v1 false ClusterInformation
clusteroutputs logging.banzaicloud.io/v1beta1 true ClusterOutput
clusterregistrationtokens management.cattle.io/v3 true ClusterRegistrationToken
clusterrepos catalog.cattle.io/v1 false ClusterRepo
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
clusters management.cattle.io/v3 false Cluster
componentstatuses cs v1 false ComponentStatus
.....
NAME
这一列就可以了
设定集群资源访问权限¶
假定你还希望用户可以访问一些指定的集群资源,比如上面创建的用户,登录后,并不能直接跳转他对应的 namespace 上,而且在 namespace 处进行搜索,也不会给结果 namespace 本身属于集群资源,我们可以通过设置集群角色以及绑定集群角色来让用户可以列出当前已有的 namespace ,方便用户选择
创建集群角色¶
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
name: cluster-role-staff-user
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "watch", "list"]
保存为 cluster-role-staff-user.yaml
创建集群角色绑定¶
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 secrets
kind: ClusterRoleBinding
metadata:
name: staff-user-read-namespaces
subjects:
- kind: ServiceAccount
name: staff-user
namespace: staff-center
roleRef:
kind: ClusterRole
name: cluster-role-staff-user
apiGroup: rbac.authorization.k8s.io
保存为 cluster-role-binding-staff-user.yaml
执行这两个配置文件¶
kubectl apply -f cluster-role-staff-user.yaml
kubectl apply -f cluster-role-binding-staff-user.yaml
重新登录或刷新页面,就可以在 namespace 处看到当前已有的 namespace 了。
修改 token 的有效时常¶
默认情况下, dashboard 的 token 有效期是 5 分钟,这个时间有点短,我们可以增加,比如我们想增加到 8 小时
执行下面的命令
kubectl edit deployment -n kubernetes-dashboard kubernetes-dashboard
spec:
containers:
- args:
- --auto-generate-certificates
- --enable-insecure-login
token-ttl
参数,编辑后,如下:
yaml
spec:
containers:
- args:
- --auto-generate-certificates
- --enable-insecure-login
- --token-ttl=28800
保存退出,等待一会,然后重新登录