在前面的文章 权限、RBAC 和 ObjectPermission中,我详细介绍了 RBAC 的概念,k8s 中的 RBAC 和传统的 RBAC 又有一点点不同,我们一起来看看。

一、什么时候需要配置 RBAC

在你的应用需要访问 k8s 资源的时候,需要创建 ServiceAccount 并配置对应的权限。比如

  • 公有云厂商读取 svc 结合自身 LoadBalancer 服务来完成负载均衡
  • 开源项目的 operator 自定义了资源,需要配置自身账号能访问自定义的资源
  • 自己开发的应用需要读取 k8s 资源

这里面常常包含几个对象:

  • ServiceAccount
  • ServiceAccount 需要访问的资源类型: Pod、Node、Secret、自定义资源 等等
  • 对资源的操作权限,主要是 读、写、执行,完整列表如下
    • create
    • get
    • delete
    • list
    • update
    • edit
    • watch
    • exec

结合之前的 权限、RBAC 和 ObjectPermission,ServiceAccount 对应了之前所说的用户,后面的权限有点像 ObjectPermission,但面向的是一个大类,而不是一个具体的对象的权限。

二、全局资源和非全局资源

在 k8s 中,有些资源是全局的,不属于某个 namespace,比如 Node、StorageClass,有些资源是 namespace 级别的,所以在创建角色 Role的时候,要按资源类型分为 Role 和 ClusterRole

下面来举几个例子

2.1 、namespace 级别的权限配置

# 一个可以访问某个租户下的所有 pod 的权限

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-user1
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: sa-role-all-pod-perm
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["*"]

# 关联用户和角色
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rb-user1-all-pod-perm
  namespace: default
subjects:
- kind: ServiceAccount
  name: sa-user1
  namespace: default
roleRef:
  kind: Role
  name: sa-role-all-pod-perm
  apiGroup: rbac.authorization.k8s.io

2.2、cluster 级别的权限配置

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-user2
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: secret-reader
rules:
- apiGroups: [""]
  # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: User
  name: sa-user2  
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

参考文章: