权限管理 RBAC --Role和ClusterRole、RoleBinding和ClusterRoleBinding、对集群资源的权限控制、聚合ClusterRole、Role常用示例、RoleBinding常用示例、命令行的使用、K8S多租户管理

在Kubernetes(k8s)中,RBAC(Role-Based Access Control,基于角色的访问控制)是用于管理集群资源访问权限的核心机制。以下将详细说明各个组成部分及其用法:

  1. Role 和 ClusterRole

•Role:定义了一组针对特定命名空间内资源的操作权限集合。例如,在 development 命名空间创建一个 Role 可以允许用户或服务账户仅在这个命名空间内执行某些操作。

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

     namespace: development

     name: dev-readonly

rules:

- apiGroups: [""] # "" 表示核心API组

   resources: ["pods", "deployments"]

   verbs: ["get", "list", "watch"]

•ClusterRole:与 Role 类似,但作用范围是整个集群,包括所有命名空间以及那些不隶属于任何命名空间的集群级别资源。例如,可以创建一个 ClusterRole 来赋予用户查看集群节点信息的能力。

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

     name: cluster-viewer

rules:

- apiGroups: [""]

   resources: ["nodes"]

   verbs: ["get", "list", "watch"]


  1. RoleBinding 和 ClusterRoleBinding

•RoleBinding:将 Role 与一组用户、组或者服务账户关联起来,并且限制在某个特定命名空间内生效。例如,将上面创建的 dev-readonly 角色绑定到一个用户。

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

     name: dev-user-binding

     namespace: development

subjects:

- kind: User

  name: alice

roleRef:

   kind: Role

  name: dev-readonly

  apiGroup: rbac.authorization.k8s.io

•ClusterRoleBinding:类似于 RoleBinding,但它将 ClusterRole 绑定到用户、组或服务账户上,并在整个集群范围内生效。例如,让 alice 用户拥有对集群级别的 cluster-viewer 角色的访问权。

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

     name: cluster-viewer-binding

subjects:

- kind: User

   name: alice

roleRef:

   kind: ClusterRole

   name: cluster-viewer

apiGroup: rbac.authorization.k8s.io

3. 聚合 ClusterRole•聚合 ClusterRole 允许将多个 ClusterRole 的权限合并到一个新的 ClusterRole 中。这有助于简化管理和重用已有的权限规则。

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

     name: admin-aggregate

aggregateTo: ["admin"] # 这个字段声明这个角色被“聚合”到了“admin”角色

# 此处无需写入具体的rules,因为它会自动继承所有名为“admin”的ClusterRole的规则

4. 命令行使用

创建、查看和修改 RBAC 对象可以通过 kubectl 命令行工具完成:

#创建 Role

kubectl create -f path/to/role.yaml


# 查看 Role

kubectl get roles


# 创建 RoleBinding

kubectl create -f path/to/rolebinding.yaml


# 查看 RoleBinding

kubectl get rolebindings

# 同理,对 ClusterRole 和 ClusterRoleBinding 也可以进行类似的操作

5. K8S多租户权限管理

在一个多租户环境中,Kubernetes RBAC 可以通过不同命名空间下的 Role 和 RoleBinding 实现租户隔离。每个租户可以拥有自己的命名空间,并在其内部创建专属的角色和角色绑定,从而确保不同的团队或项目只能够访问并管理他们所拥有的资源。例如,为每一个租户创建独立的命名空间,然后在每个命名空间中分别配置合适的 Role 和 RoleBinding,确保各租户只能对其自身命名空间内的资源进行操作。同时,可以利用 ServiceAccount 结合 Namespace 和 RoleBinding 来实现自动化部署中的权限控制。每个 Pod 都可以关联到一个 ServiceAccount,这样Pod内的进程就可以获取到该 ServiceAccount 所关联的 Role 授予的权限

在Kubernetes(K8S)中,多租户权限管理可以通过RBAC(Role-Based Access Control,基于角色的访问控制)机制实现。以下是如何利用RBAC来实现在Kubernetes集群中的多租户权限隔离和管理的详细说明及示例:                  1. 基本概念                                                                                              •命名空间(Namespace):Kubernetes提供了一种资源组织方式,通过命名空间可以将系统划分为多个独立的工作环境,每个租户或团队可以拥有自己的命名空间。

•ServiceAccount:在Kubernetes中,默认为每个Pod创建一个ServiceAccount对象,用于标识Pod内的进程在Kubernetes API服务器上的身份,并关联相应的权限。

•Role/ClusterRole:

•Role:定义了一组针对特定命名空间内资源的操作权限集合。

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

     namespace: tenant-a

     name: tenant-a-developer

rules:

- apiGroups: ["", "apps"]

   resources: ["pods", "deployments"]

   verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

•ClusterRole:类似于Role,但其作用范围是整个集群,包括所有命名空间以及非命名空间级别的资源。

•RoleBinding/ClusterRoleBinding:

•RoleBinding:将Role与ServiceAccount或者用户、组关联起来,在指定的命名空间内生效。

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

     name: tenant-a-developer-binding

     namespace: tenant-a

subjects:

- kind: ServiceAccount

   name: developer-sa

   namespace: tenant-a

roleRef:

   kind: Role

   name: tenant-a-developer

   apiGroup: rbac.authorization.k8s.io

•ClusterRoleBinding:与RoleBinding类似,但绑定的是ClusterRole,并且在整个集群范围内生效。

示例场景

假设我们有一个Kubernetes集群,需要为两个不同的租户A和B分别提供权限隔离。

租户A的配置

首先,为租户A创建一个命名空间tenant-a和一个ServiceAccount developer-sa-a。

apiVersion: v1

kind: Namespace

metadata:

    name: tenant-a

---

apiVersion: v1

kind: ServiceAccount

metadata:

     name: developer-sa-a

     namespace: tenant-a

然后,为租户A的开发者创建一个具有操作Pods和Deployments权限的Role。

# Role for developers in tenant A

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

name: tenant-a-developer

namespace: tenant-a

rules:

...

接着,使用RoleBinding将这个Role绑定到租户A的ServiceAccount上。

# RoleBinding for developers in tenant A

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

     name: tenant-a-developer-binding

     namespace: tenant-a

subjects:

- kind: ServiceAccount

  name: developer-sa-a

  namespace: tenant-a

roleRef:

   kind: Role

   name: tenant-a-developer

   apiGroup: rbac.authorization.k8s.io

租户B的配置

重复上述步骤,为租户B创建另一个命名空间、ServiceAccount、Role和RoleBinding,确保权限限制在租户B的命名空间内。通过这种方式,每个租户及其成员仅能对其所在命名空间内的资源进行操作,实现了多租户间的权限隔离。同时,根据实际需求,还可以创建不同级别的权限角色,如管理员角色、只读角色等,以便更细致地管理租户内部的角色分工。