优势
- 对集群中的资源和非资源用有完整的覆盖
- 整个 RBAC 完全由几个API对象完成,可用 kubectl 或 api 操作
- 可在运行时调整, 无需重启 apiserver
资源对象
Role ClusterRole
Role 一组规则权限,权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过RBAC对其进行减少的操作
Role 定义在一个 namespace 中,如果想要跨 namespace 则可以创建 ClusterRole
ClusterRole 具有与 Role 相同的权限角色控制能力,不同的是 ClusterRole 是集群级别的,ClusterRole 可以用于:
集群级别的资源控制( 例如 node 访问权限 )
非资源型 endpoints( 例如/healthz访问 )
所有命名空间资源控制(例如 pods )
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: pod-readernamespace: defaultrules:apiGroups: [""]resources: ["pods"]verbs: ["get","watch","list"]
apiGroups
resources 资源
verbs 对资源的操作, 参照 kubectl api-resources -owide 的 VERBS字段
resourceNames 只能操作的某个名字的资源,为空表示允许所有
nonResourceURLs 能访问的 url
RoleBinding ClusterRoleBinding
RoloBinding 可以将角色中定义的权限授予用户或用户组,RoleBinding 包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(users, groups, or service accounts)
RoloBinding 同样包含对被Bind 的 Role 引用
RoleBinding 适用于某个命名空间内授权,而 ClusterRoleBinding 适用于集群范围内的授权
RoleBinding 同样可以引用 ClusterRole 来对当前 namespace 内用户、用户组或 ServiceAccount 进行授权,这种操作允许集群管理员在整个集群内定义一些通用的 ClusterRole,然后在不同的 namespace 中使用 RoleBinding 来引用
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rolebinding1
namespace: test
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: user1
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role1
dashboard rbac 分析
role kubernetes-dashboard
secrets、 configmap
clusterrole kubernetes-dashboard 
集群指标信息
rolebinding kubernetes-dashboard

示例
serviceaccount 只读所有 namespace
创建 sa
apiVersion: v1kind: ServiceAccountmetadata:name: sa-user1namespace: default
自动生成对应的 secret
创建 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: ns-reader-crrules:- apiGroups: [""]resources: ["namespaces"]verbs: ["get","list","watch"]
创建 ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: sa-user1-crb-ns-reader-crsubjects:- kind: ServiceAccountname: sa-user1namespace: defaultroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: ns-reader-cr
只读 pod 用户
证书创建 dev1
dev1-csr.json
{
“CN”: “dev1”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “BeiJing”
}
]
}
ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“kubernetes”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
使用 k8s 集群的 ca 文件
cp /etc/kubernetes/pki/ca.* .
cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes dev1-csr.json | cfssljson -bare dev1
设置 dev 上下文
kubectl config set-cluster kubernetes \
—certificate-authority=ca.crt \
—embed-certs=true \
—server=https://192.168.80.191:6443 \
—kubeconfig=dev1-kubeconfig
kubectl config set-credentials dev1\
—client-key=dev1-key.pem \
—client-certificate=dev1.pem \
—embed-certs=true \
—kubeconfig=dev1-kubeconfig
kubectl config set-context dev1@kubernetes \
—cluster=kubernetes \
—user=dev1 \
—namespace=dev \
—kubeconfig=dev1-kubeconfig
cp dev1-kubeconfig /home/admin/.kube/config
chown admin.admin /home/admin/.kube/config
su - admin
kubectl config use-context dev1@kubernetes
创建 role 及 rolebinding
dev1-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: dev-read-pod
namespace: dev
rules:
- apiGroups: [“”]
resources: [“pods”]
verbs: [“get”,”watch”,”list”]
—-
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev1-dev-read-pod
namespace: dev
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: dev1
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: dev-read-pod
切换到 dev1 上下文
只能查看 pod 不能删除
