K8s RBAC权限管理


K8s RBAC权限管理

RBAC中的三个重要概念

  • Role:定义一个权限的集合体。
  • Subject:被授予权限的主体。
  • RoleBinding:定义“Role”和“Subject”的绑定关系。

从上图中可以看出,Binding操作是将Subject和Role绑定在一起,实现将一个角色(Role)赋予一个主体账号(Subject)的功能。Role定义了权限的集合,也可以称为权限规则,即这个角色具备哪些权限。

rules定义了权限的详细信息,apiGroups定义了资源组类别,*apiGroups=””*表示使用缺省的core组资源类别(属于core组资源的有Pod、Namespace、Depolyment、DaemonSet等)。resources定义了资源范围(Pod、Namespace、Depolyment、DaemonSet等),verbs定义了针对资源的动作(get、list、watch、create、delete、update等)。

三种绑定方案

Role & RoleBinding

这种绑定方式是最常见的,为了将权限限制在某个特定的namespace下。

从图中不难看出,通过RoleBinding将Subject和Role绑定,可以将Subject的权限收敛在一个namespace:A,该Subject的任何操作只能针对namespace:A下生效,不能在namespace:B下生效。

假设一个场景,xiaoming是某业务应用的负责人,该业务应用统一部署在A命名空间下。xiaoming需要能够观测到业务容器的状态,现在要为他创建一个角色,该如何做?针对xiaoming这个主体创建一个namespace:A下的权限角色pod-reader,然后将该主体绑定到pod-reader即可。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: A
  name: pod-reader # 这个角色的名称为pod-reader
rules:
- apiGroups: "" # 空字符串"" 表明使用 core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods
  namespace: A
subjects:
- kind: User
  name: xiaoming
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

ClusterRole & RoleBinding

ClusterRole定义的是通用权限。生效范围依旧由RoleBinding决定。

ClusterRole的名称往往会给人一种权限生效范围是整个集群的感觉,但事实上却不是这样的。权限生效的范围永远都是由Binding确定的。ClusterRole设置权限的范围是集群对象。

假设一个场景,xiaoming是某业务应用的负责人,该业务应用统一部署在A命名空间下。xiaoming需要能够观测到业务容器的状态,此时,xiaohon想观测到B命名空间的容器状态,需求和xiaoming一致,但命名空间不同,该怎么做?

两种做法:

  1. 分别针对xiaoming和xiaohong生成命名空间A和命名空间B的Role,然后再生成RoleBinding。如此,需要写2个Role.yaml和2个RoleBinding.yaml

  2. 抽象出xiaoming和xiaohong的公共需求,然后根据该需求生成一个ClusterRole,然后再生成各自的RoleBinding,通过RoleBinding把权限生效范围规定在不同的namespace下。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  # 鉴于 ClusterRole 是集群范围对象,所以这里不需要定义 "namespace"
  name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods-A
  namespace: A
subjects:
- kind: User
  name: xiaoming
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods-B
  namespace: B
subjects:
- kind: User
  name: xiaohong
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

也可以使用ClusterRole授权其他资源权限:

  • 集群范围资源(Node)

  • 非资源类型endpoint

  • 跨所有命名空间范围的资源

ClusterRole & ClusterRoleBinding

ClusterRoleBinding表示生效范围是整个集群,且只能配合ClusterRole使用。


文章作者: 嘉沐
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 嘉沐 !
  目录