在 Kubernetes(K8s)中,RBAC(Role-Based Access Control)是用来控制集群中的用户和服务账户的访问权限的一种机制。通过 RBAC,可以定义角色,并为不同的用户或服务账户授予这些角色,从而控制他们对 Kubernetes 资源的访问权限。

1. RBAC 组件

RBAC 主要由以下几种组件构成:

  • Role:定义一组权限,应用于特定的命名空间内。
  • ClusterRole:与 Role 类似,但适用于整个集群的资源。
  • RoleBinding:将 Role 绑定到某个用户、组或服务账户,通常用于特定命名空间。
  • ClusterRoleBinding:将 ClusterRole 绑定到用户、组或服务账户,作用范围为整个集群。

2. RBAC 组件详解

2.1 Role 和 ClusterRole

  • Role:在特定的命名空间内定义一组权限。比如,它可以控制某个命名空间中 Pod 的 getlistcreate 等操作。
  • ClusterRole:在整个集群范围内定义权限,适用于集群级别的资源,如 nodesnamespaces 等。ClusterRole 也可以应用于命名空间内的资源,和 Role 有一些交集。

2.2 RoleBinding 和 ClusterRoleBinding

  • RoleBinding:将 Role 与用户或服务账户绑定,通常在某个命名空间下生效。例如,将一个 Role 绑定到一个服务账户或用户。
  • ClusterRoleBinding:将 ClusterRole 与用户或服务账户绑定,适用于整个集群。

3. RBAC 权限控制的资源和操作

在 Kubernetes 中,RBAC 授权基于以下几个方面进行控制:

  • 资源(Resources):Kubernetes 中的资源,如 podsservicesdeployments 等。
  • 动词(Verbs):对资源执行的操作,常见的动词包括 getlistcreateupdatedelete 等。
  • 命名空间(Namespace):RBAC 规则可以应用于特定的命名空间(通过 RoleRoleBinding),或者应用于整个集群(通过 ClusterRoleClusterRoleBinding)。
  • API 组(API Groups):Kubernetes 中的资源被划分到不同的 API 组中。例如,apps 组包含 deploymentsbatch 组包含 jobs

4. RBAC 示例

4.1 创建 Role 和 RoleBinding 示例

假设我们有一个命名空间 development,希望在这个命名空间内创建一个可以查看 Pod 的角色,并将这个角色赋给一个用户。

  • 创建 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

在这个 Role 中,我们允许对 pods 资源执行 getlist 操作。

  • 创建 RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: development
subjects:
- kind: User
  name: "jdoe"  # 需要授权的用户
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader  # 绑定的 Role 名称
  apiGroup: rbac.authorization.k8s.io

这里,我们创建了一个 RoleBinding,将 pod-reader 角色绑定到用户 jdoe,从而允许用户在 development 命名空间内查看 Pod。

4.2 创建 ClusterRole 和 ClusterRoleBinding 示例

假设我们希望创建一个可以查看整个集群所有节点的角色,并将该角色赋给一个用户。

  • 创建 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # 不指定 namespace,表示是集群级别的角色
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]

这个 ClusterRole 允许用户查看整个集群的节点。

  • 创建 ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-nodes-binding
subjects:
- kind: User
  name: "jdoe"  # 需要授权的用户
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: node-reader  # 绑定的 ClusterRole 名称
  apiGroup: rbac.authorization.k8s.io

通过这个 ClusterRoleBinding,我们将 node-reader 角色赋给用户 jdoe,从而允许他查看集群中的所有节点。

5. 权限验证

RBAC 的权限控制并不是即时生效的,Kubernetes 会定期进行权限的检查与更新,因此需要耐心等待。

5.1 检查用户权限

可以使用 kubectl auth can-i 来检查用户是否具有执行某个操作的权限。例如:

kubectl auth can-i get pods --as=jdoe --namespace=development

这个命令检查用户 jdoe 是否有权限在 development 命名空间中执行 get 操作。

5.2 查看当前用户的角色

如果想查看某个用户的角色和权限,可以使用以下命令:

kubectl get rolebinding --namespace=development
kubectl get clusterrolebinding

这些命令会列出所有的 RoleBindingClusterRoleBinding,帮助你确认用户是否正确绑定了所需的角色。

6. 总结

  • RoleClusterRole 用于定义权限,分别应用于命名空间内和整个集群。
  • RoleBindingClusterRoleBinding 用于将角色与用户、组或服务账户关联,从而授权相应的访问权限。
  • 通过 RBAC,可以实现细粒度的访问控制,确保 Kubernetes 集群中的资源可以被安全且高效地管理。

希望这篇笔记对你深入理解 RBAC 有帮助!如果有更具体的疑问或想要更详细的示例,随时告诉我!