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一致,但命名空间不同,该怎么做?
两种做法:
分别针对xiaoming和xiaohong生成命名空间A和命名空间B的Role,然后再生成RoleBinding。如此,需要写2个Role.yaml和2个RoleBinding.yaml
抽象出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使用。