优势

  • 对集群中的资源和非资源用有完整的覆盖
  • 整个 RBAC 完全由几个API对象完成,可用 kubectl 或 api 操作
  • 可在运行时调整, 无需重启 apiserver

    资源对象

    image.png

    Role ClusterRole

    Role 一组规则权限,权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过RBAC对其进行减少的操作
    Role 定义在一个 namespace 中,如果想要跨 namespace 则可以创建 ClusterRole
    ClusterRole 具有与 Role 相同的权限角色控制能力,不同的是 ClusterRole 是集群级别的,ClusterRole 可以用于:
    集群级别的资源控制( 例如 node 访问权限 )
    非资源型 endpoints( 例如/healthz访问 )
    所有命名空间资源控制(例如 pods )
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4. name: pod-reader
  5. namespace: default
  6. rules:
  7. apiGroups: [""]
  8. resources: ["pods"]
  9. 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
image.png
secrets、 configmap

clusterrole kubernetes-dashboard
image.png
集群指标信息

rolebinding kubernetes-dashboard
image.png
image.png

ServiceAccount token
image.png

示例

serviceaccount 只读所有 namespace

创建 sa

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: sa-user1
  5. namespace: default

自动生成对应的 secret
image.png

创建 ClusterRole

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: ns-reader-cr
  5. rules:
  6. - apiGroups: [""]
  7. resources: ["namespaces"]
  8. verbs: ["get","list","watch"]

创建 ClusterRoleBinding

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRoleBinding
  3. metadata:
  4. name: sa-user1-crb-ns-reader-cr
  5. subjects:
  6. - kind: ServiceAccount
  7. name: sa-user1
  8. namespace: default
  9. roleRef:
  10. apiGroup: rbac.authorization.k8s.io
  11. kind: ClusterRole
  12. name: 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
image.png

设置 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
image.png

创建 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 不能删除
image.png