1. 概述
RBAC(Role-Based Access Control,基于角色的访问控制)是 Kubernetes 用于管理权限的机制。它允许管理员基于用户角色定义权限,从而控制不同用户对 Kubernetes 资源的访问。
2. RBAC 关键组件
RBAC 主要由以下四个核心 API 资源组成:
- Role:定义命名空间级别的访问权限。
- ClusterRole:定义整个集群范围的访问权限。
- RoleBinding:将 Role 绑定到用户、组或服务账户,使其在特定命名空间内生效。
- ClusterRoleBinding:将 ClusterRole 绑定到用户、组或服务账户,使其在整个集群范围内生效。
3. 可授权的资源和操作
3.1 可授权的资源(Resources)
| 资源类型 | 说明 |
|---|---|
| pods | Pod 资源(创建、删除、列表等) |
| services | Service 资源(暴露、管理流量等) |
| deployments | Deployment 资源(管理副本、更新等) |
| namespaces | 命名空间管理 |
| nodes | 节点资源(适用于 ClusterRole) |
| configmaps | 配置存储 |
| secrets | 密钥管理 |
| roles | 命名空间级别角色 |
| clusterroles | 集群级别角色 |
| rolebindings | 命名空间级别的角色绑定 |
| clusterrolebindings | 集群级别的角色绑定 |
| persistentvolumeclaims (pvc) | 持久化存储请求 |
| persistentvolumes (pv) | 持久化存储 |
| cronjobs | 定时任务 |
| jobs | 一次性任务 |
| daemonsets | 守护进程集 |
| statefulsets | 有状态应用 |
| replicasets | 副本集 |
3.2 可授权的操作(Verbs)
| 动作(Verb) | 说明 |
|---|---|
| get | 获取单个资源(查看详情) |
| list | 获取资源列表 |
| watch | 监听资源的变化 |
| create | 创建资源 |
| update | 更新资源 |
| patch | 局部更新资源 |
| delete | 删除资源 |
| deletecollection | 删除多个资源 |
4. RBAC 角色权限示例
4.1 示例 1:开发人员权限(developer-role)
目标:
- 允许
dev-user管理dev-namespace下的 Pods、Deployments 和 Services。 - 限制权限:只能查看 ConfigMaps,不能修改或删除。
(1) 创建 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role # 定义一个命名空间级别的角色
metadata:
namespace: dev-namespace # 角色作用的命名空间
name: developer-role # 角色名称
rules:
- apiGroups: [""] # "" 代表核心 API 组
resources: ["pods", "services"] # 允许操作的资源类型
verbs: ["get", "list", "create", "update", "delete"] # 允许的操作
- apiGroups: ["apps"] # apps API 组(管理 Deployments)
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"] # 仅允许查看 ConfigMaps,不允许修改
(2) 绑定 Role 到用户 dev-user
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding # 绑定 Role 到用户
metadata:
name: developer-rolebinding
namespace: dev-namespace
subjects:
- kind: User # 绑定对象类型
name: dev-user # 绑定的用户名
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # 绑定的角色类型
name: developer-role # 绑定的角色名称
apiGroup: rbac.authorization.k8s.io
4.2 示例 2:只读访问权限(readonly-role)
目标:
- 适用于测试人员
qa-user,仅允许 读取 资源,不能创建、修改或删除。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev-namespace
name: readonly-role
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments", "services", "configmaps", "secrets"]
verbs: ["get", "list", "watch"] # 只允许读取权限
4.3 示例 3:集群管理员权限(cluster-admin-role)
目标:
-
赋予
admin-user完全的集群管理权限。 - 允许管理 所有资源,包括
nodes、namespaces、deployments、secrets等。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole # 定义一个集群级别的角色
metadata:
name: cluster-admin-role
rules:
- apiGroups: ["*"] # "*" 代表所有 API 组
resources: ["*"] # "*" 代表所有资源
verbs: ["*"] # "*" 代表所有操作
5. 用户如何登录并管理 Kubernetes 资源
5.1 通过 kubectl 访问
-
测试当前用户权限
kubectl auth can-i list pods --namespace dev-namespace --as dev-user # 检查权限 -
开发人员
dev-user访问dev-namespacekubectl get pods -n dev-namespace # 获取 Pod 列表 -
管理员
admin-user访问整个集群kubectl get nodes # 获取集群节点信息 kubectl get deployments --all-namespaces # 获取所有命名空间的 Deployments
6. 总结
- RBAC 通过 Role、ClusterRole、RoleBinding 和 ClusterRoleBinding 进行权限管理。
- 可授权的资源和操作类型可以精细化配置,以满足不同角色的需求。
- 示例中展示了开发人员、测试人员和管理员的常见权限配置方式。
- 用户可通过
kubectl进行访问,并使用kubectl auth can-i进行权限验证。
RBAC 提供了一种安全、高效的方式来管理 Kubernetes 资源权限,在实际应用中可以根据团队需求进行调整,以确保最小权限原则(Least Privilege)。