在 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 的
get
、list
、create
等操作。 - ClusterRole:在整个集群范围内定义权限,适用于集群级别的资源,如
nodes
、namespaces
等。ClusterRole
也可以应用于命名空间内的资源,和Role
有一些交集。
2.2 RoleBinding 和 ClusterRoleBinding
- RoleBinding:将
Role
与用户或服务账户绑定,通常在某个命名空间下生效。例如,将一个Role
绑定到一个服务账户或用户。 - ClusterRoleBinding:将
ClusterRole
与用户或服务账户绑定,适用于整个集群。
3. RBAC 权限控制的资源和操作
在 Kubernetes 中,RBAC 授权基于以下几个方面进行控制:
- 资源(Resources):Kubernetes 中的资源,如
pods
、services
、deployments
等。 - 动词(Verbs):对资源执行的操作,常见的动词包括
get
、list
、create
、update
、delete
等。 - 命名空间(Namespace):RBAC 规则可以应用于特定的命名空间(通过
Role
和RoleBinding
),或者应用于整个集群(通过ClusterRole
和ClusterRoleBinding
)。 - API 组(API Groups):Kubernetes 中的资源被划分到不同的 API 组中。例如,
apps
组包含deployments
,batch
组包含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
资源执行 get
和 list
操作。
- 创建 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
这些命令会列出所有的 RoleBinding
和 ClusterRoleBinding
,帮助你确认用户是否正确绑定了所需的角色。
6. 总结
- Role 和 ClusterRole 用于定义权限,分别应用于命名空间内和整个集群。
- RoleBinding 和 ClusterRoleBinding 用于将角色与用户、组或服务账户关联,从而授权相应的访问权限。
- 通过 RBAC,可以实现细粒度的访问控制,确保 Kubernetes 集群中的资源可以被安全且高效地管理。
希望这篇笔记对你深入理解 RBAC 有帮助!如果有更具体的疑问或想要更详细的示例,随时告诉我!
发表回复