前些天撸了Kubernetes 1.6 和 1.7 两个版本, 发现官方对它最大的改进在于权限. 自版本 1.6 起,Kubernetes 默认由 RBAC 授权.
在kube-apiserver
这个服务的配置项中,有一参数项为--authorization-mode
,这便是设置授权的模式,值项有:
- AlwaysAllow 总是允许
-
AlwaysDeny 总是拒绝
-
ABAC 基于属性的权限验证
-
Webhook 基于网络事件的回调钩子
-
RBAC 基于角色的权限验证
-
Node 基于节点验证. Kubernetes 1.7 新增
其他的不是重点,这里只需要理解 RBAC 这个权限授权模式.
之前发布的 1.8 的 alpha2 版本中,RBAC 的API 已经从 rbac.authorization.k8s.io/v1beta1
移到了 rbac.authorization.k8s.io/v1
了,表明 RBAC 已经作为正式稳定的功能了,并且官方的 CHANGELOG 中大量的更改项都与 RBAC 有关,现今网上许多关于Kubenretes 构建的同样是基于 RBAC, 看样子这应该是现在与未来在 KuberNetes 中主流鉴权模式了.
什么是RBAC
RBAC 即 Role-Based Access Control.
RBAC 在用户和权限之间引入了角色(Role)的概念.用户在进行相关的命令或资源操作的时候,就会需要一个或多个权限的验证.每个用户可以关联一个或多个角色,可以根据实际的业务需求而关联相应的角色,从而实现粒度细且操作灵活的权限管理.
Kubernetes的RBAC
Kubernetes 中存在两种角色:
- Role 普通角色. 定义在单一的 namespace 内部,且只能对该 namespace 内部的资源或操作有效.
-
ClusterRole 集群角色. 作用范围是整个集群的资源和操作.
在 Kubernetes 中,RBAC 管理的资源对象有:ConfigMap
,Deployment
,Job
,Namespace
,Node
,Pods
,Persistents
,Replicasets
,Secrets
,Service
,Statefulsets
等等,囊括了绝大部分Kind
.
而命令操作的对象有:create
,delete
,edit
,exec
,get
,list
,patch
,update
,watch
.
Role
创建一个Role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
# 不指定 namespace 就默认为 default
namespace: default
name: rbac-test
rules:
#- apiGroups: [""] # 如果为空表示就只有 core API group
- apiGroups:
- core
- apps
- batch
resources: ["pods","job","daemonset"]
verbs: ["get", "watch", "list"]
以上的配置表明在 default 的 namespace 下创建一个名为 rbac-test 的角色,这个角色可操作的api集合包括core
,batch
,apps
,分别对应下属的pods
,job
,daemonset
这些资源,并只允许使用get
,watch
,list
这些操作.
角色已经建立,接下来就是使用该角色了.
需要指定 subject 绑定 role .至于 subject 它是一个 list , 其中可以是组或用户或多个用户加组等组合.
用户的创建,可以参考之前文章中创建 kubectl 操作的 admin 用户流程.
假设现在已经创建了一个名为 test 的账号.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-role-bind
namespace: default
subjects:
- kind: User
name: test # 用户名区分大小写
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # 这里只许填 Role 或 ClusterRole 之一
name: rbac-test # 必须匹配之前创建的Role或ClusterRole的名称
apiGroup: rbac.authorization.k8s.io
如此一来,就完成了角色与用户的绑定,用户就有了操作相应资源的权限.
ClusterRole
ClusterRole 的创建类似 Role,只不过就是名称不同,并且资源相应多了,比如多了Cluster APIS 资源集的权限.
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
# ClusterRole 没有 namespace 的概念,作用范围是全集群
name: clusterRole-test
rules:
- apiGroups: ["core","apps"]
resources: ["ConfigMap","Secrets"]
verbs: ["get","watch","list"]
对象绑定角色,假设存在一个名为 testg 的用户组,绑定 testg 组让该组下的所有用户都有权限.
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: clusterRole-test-bind
# namespace: default # 如果不指定 namespace 则作用整个范围,若指定 namespace 则绑定的用户只有在当前的 namespace 内有效.
subjects:
- kind: Group
name: testg
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: clusterRole-test
apiGroup: rbac.authorization.k8s.io