Skip to content

十四 用户权限系统

在 k8s 中的用户权限系统是使用 RBAC 模式的,RBAC 是 Role-Based AC 的缩写,全称:基于角色的访问控制。

我们可以让一个用户扮演一个角色,而这个角色拥有权限,而这个用户就拥有了这个权限,所以在 RBAC 中,用户授权就是授权某个角色。

用户(user):用户可以拥有某个角色。

角色(role):角色可以拥有某些许可。
	1. 操作
	2. 对象

许可(permission): 在一个对象上能施加的操作组合起来,称之为一个许可权限。

用户(user):用户可以拥有某个角色。

角色(role):角色可以拥有某些许可。
	1. 操作
	2. 对象

许可(permission): 在一个对象上能施加的操作组合起来,称之为一个许可权限。

  • 用户类型
Human User:              # 用户账号
Pod Service Account:     # 服务账号

Human User:              # 用户账号
Pod Service Account:     # 服务账号

  • 角色类型
- role(角色)、rolebinding(角色绑定)
- clusterrole(集群角色)、clusterrolebinding(集群角色绑定)

- role(角色)、rolebinding(角色绑定)
- clusterrole(集群角色)、clusterrolebinding(集群角色绑定)

  • 授权类型
- 用户通过 rolebinding 去 bind rule,rolebinding 只能是当前命名空间中
- 通过 clusterrolebinding 去 bind clausterrole,clusterrolebinding会在所有名称空间生效
- 通过 rolebinding 去 bind clausterrole,由于 rolebinding 只在当前名称空间,所以 clusterrole 权限被限制为当前名称空间

- 用户通过 rolebinding 去 bind rule,rolebinding 只能是当前命名空间中
- 通过 clusterrolebinding 去 bind clausterrole,clusterrolebinding会在所有名称空间生效
- 通过 rolebinding 去 bind clausterrole,由于 rolebinding 只在当前名称空间,所以 clusterrole 权限被限制为当前名称空间

  • 通过 rolebinding 去 bind clusterrole 的好处
如果有很多名称空间、如果用 rolebinding 绑定 role,那么则需要在每个名称空间都定义 role
如果使用 rolebinding 绑定一个 clausterrole ,由于 clusterrole 拥有所有名称空间的权限,而 rolebinding  只能绑定当前名称空间,那么就省去为每个名称空间都新建一个 role 的过程了。

如果有很多名称空间、如果用 rolebinding 绑定 role,那么则需要在每个名称空间都定义 role
如果使用 rolebinding 绑定一个 clausterrole ,由于 clusterrole 拥有所有名称空间的权限,而 rolebinding  只能绑定当前名称空间,那么就省去为每个名称空间都新建一个 role 的过程了。

14.1 权限列表

kubectl get clusterrole admin -o yaml

kubectl get clusterrole admin -o yaml

14.2 创建 Role

  • 命令行定义
kubectl create role pods-reader --verb=get,list,watch --resource=pods

kubectl create role pods-reader --verb=get,list,watch --resource=pods

  • 使用清单方式定义
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pods-reder
  namespace: default
rules:
- apiGroups:                           # 对哪些 api 群组内的资源进行操作
  - ""
  resources:                           # 对哪些资源授权
  - pods
  verbs:                               # 授权做哪些操作
  - get
  - list
  - watch

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pods-reder
  namespace: default
rules:
- apiGroups:                           # 对哪些 api 群组内的资源进行操作
  - ""
  resources:                           # 对哪些资源授权
  - pods
  verbs:                               # 授权做哪些操作
  - get
  - list
  - watch

14.3 创建 rolebinding

  • 使用 rolebinding 对象创建,用户与 role 的绑定
kubectl create rolebinding kaliarch-read-pods --role=pods-reader --user=kaliarch

kubectl create rolebinding kaliarch-read-pods --role=pods-reader --user=kaliarch

  • 使用清单方式定义
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kaliarch-read-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kaliarch-read-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch

  • 切换用户和环境上下文
$ kubectl config use-context kaliarch@kubernetes

$ kubectl config use-context kaliarch@kubernetes

  • 测试用户是否拥有 get 权限
kubectl get pods

kubectl get pods

14.4 创建 clusterrole

  • 命令行定义
kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods

kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods

  • 使用清单方式定义
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

  • 系统内置有非常多的 clusterrole,详见:kubectl get clusterrole
NAME                                                                   AGE
admin                                                                  5d16h
cluster-admin                                                          5d16h
cluster-reader                                                         4m32s
edit                                                                   5d16h
flannel                                                                5d6h
system:aggregate-to-admin                                              5d16h
system:aggregate-to-edit                                               5d16h
system:aggregate-to-view                                               5d16h
system:auth-delegator                                                  5d16h
system:aws-cloud-provider                                              5d16h
system:basic-user                                                      5d16h
system:certificates.k8s.io:certificatesigningrequests:nodeclient       5d16h
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient   5d16h
system:controller:attachdetach-controller                              5d16h
system:controller:certificate-controller                               5d16h
system:controller:clusterrole-aggregation-controller                   5d16h
system:controller:cronjob-controller                                   5d16h
system:controller:daemon-set-controller                                5d16h

NAME                                                                   AGE
admin                                                                  5d16h
cluster-admin                                                          5d16h
cluster-reader                                                         4m32s
edit                                                                   5d16h
flannel                                                                5d6h
system:aggregate-to-admin                                              5d16h
system:aggregate-to-edit                                               5d16h
system:aggregate-to-view                                               5d16h
system:auth-delegator                                                  5d16h
system:aws-cloud-provider                                              5d16h
system:basic-user                                                      5d16h
system:certificates.k8s.io:certificatesigningrequests:nodeclient       5d16h
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient   5d16h
system:controller:attachdetach-controller                              5d16h
system:controller:certificate-controller                               5d16h
system:controller:clusterrole-aggregation-controller                   5d16h
system:controller:cronjob-controller                                   5d16h
system:controller:daemon-set-controller                                5d16h

14.5 创建 clusterrolebinding

  • 命令行定义
kubectl create clusterrolebinding kaliarch-read-all-pods --clusterrole=cluster-reader --user=kaliarch

kubectl create clusterrolebinding kaliarch-read-all-pods --clusterrole=cluster-reader --user=kaliarch

  • 清单定义
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kaliarch-read-all-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kaliarch-read-all-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch
  • 切换用户和环境上下文
$ kubectl config use-context kaliarch@kubernetes
$ kubectl config use-context kaliarch@kubernetes
  • 测试用户是否拥有 get 权限
$ kubectl get pods -n kube-system
$ kubectl config use-context kubernetes-admin@kubernetes
$ kubectl get pods -n kube-system
$ kubectl config use-context kubernetes-admin@kubernetes

14.6 rolebinding 与 clusterrole

如果使用 rolebinding 绑定一个 clusterrole ,由于 clusterrole 拥有所有名称空间的权限,而 rolebinding 只能绑定当前名称空间,那么就省去为每个名称空间都新建一个 role 的过程了。

  • 命令定义
$ kubectl create rolebinding kaliarch-cluster-reader --clusterrole=cluster-reader --user=kaliarch
$ kubectl create rolebinding kaliarch-cluster-reader --clusterrole=cluster-reader --user=kaliarch
  • 清单定义
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kaliarch-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kaliarch-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kaliarch
  • 切换用户和环境上下文
$ kubectl config use-context kaliarch@kubernetes
$ kubectl config use-context kaliarch@kubernetes
  • 测试用户是否拥有 get 权限,由于使用了 rolebinding ,所以 cluster-reader 被限制到当前命名空间
$ kubectl get pods -n kube-system
$ kubectl config use-context kubernetes-admin@kubernetes
$ kubectl get pods -n kube-system
$ kubectl config use-context kubernetes-admin@kubernetes

14.7 RBAC授权

在 bind 授权的时候,可以绑定的用户主体有:user、group

  • 使用 rolebinding 和 clusterrolebinding 绑定
绑定到 user:表示只有这一个用户拥有 role 或者 clusterrole 的权限
绑定到 group:表示这个组内的所有用户都具有了 role 或者 clusterrole 的权限

绑定到 user:表示只有这一个用户拥有 role 或者 clusterrole 的权限
绑定到 group:表示这个组内的所有用户都具有了 role 或者 clusterrole 的权限

  • 创建用户时候加入组,加入组后账户自动集成该组的权限
# 创建私钥
(umask 077; openssl genrsa -out kaliarch.key 2048)

# 生成证书签署请求,O 是组,CN 就是账号,这个账号被 k8s 用来识别身份,授权也需要授权这个账号
openssl req -new -key kaliarch.key -out kaliarch.csr -subj "O=system:masters/CN=kaliarch/"

# 使用 CA 签署证书,并且在 1800 天内有效
openssl x509 -req -in kaliarch.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out kaliarch.crt -days 1800

# 查看证书
openssl x509 -in kaliarch.crt -text -noout
# 创建私钥
(umask 077; openssl genrsa -out kaliarch.key 2048)

# 生成证书签署请求,O 是组,CN 就是账号,这个账号被 k8s 用来识别身份,授权也需要授权这个账号
openssl req -new -key kaliarch.key -out kaliarch.csr -subj "O=system:masters/CN=kaliarch/"

# 使用 CA 签署证书,并且在 1800 天内有效
openssl x509 -req -in kaliarch.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out kaliarch.crt -days 1800

# 查看证书
openssl x509 -in kaliarch.crt -text -noout