RBAC 权限控制
RBAC (Role-Based Access Control) 是 Kubernetes 的权限控制机制,用于管理集群资源的访问权限。
概述
RBAC (Role-Based Access Control) 是 Kubernetes 的核心授权机制,通过定义角色(Role)和角色绑定(RoleBinding)来控制用户或 ServiceAccount 对集群资源的访问权限。CKA 考试中 RBAC 是必考内容。
核心概念
1. ServiceAccount
ServiceAccount 为 Pod 中运行的进程提供身份标识,用于 API Server 认证。
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
namespace: default
# 创建 ServiceAccount
kubectl create serviceaccount my-sa
# 查看 ServiceAccount
kubectl get serviceaccounts
kubectl describe sa my-sa
# 查看 ServiceAccount 的 Secret(自动创建)
kubectl get secrets | grep my-sa
2. Role vs ClusterRole
| 特性 | Role | ClusterRole |
|---|---|---|
| 作用范围 | 特定 Namespace | 整个集群 |
| 可授权资源 | 命名空间资源 | 集群资源 + 命名空间资源 |
| 适用场景 | 细粒度命名空间权限 | 集群级别管理权限 |
Role 示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# 创建 Role
kubectl create role pod-reader --verb=get,list,watch --resource=pods
kubectl create role pod-reader --verb=get,list,watch --resource=pods --namespace=default
# 查看 Role
kubectl get roles --all-namespaces
kubectl describe role pod-reader -n default
ClusterRole 示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: [""]
resources: ["nodes", "persistentvolumes", "namespaces"]
verbs: ["get", "list", "watch", "create", "delete"]
# 创建 ClusterRole
kubectl create clusterrole node-admin --verb=get,list,watch --resource=nodes
# 查看 ClusterRole
kubectl get clusterroles
kubectl describe clusterrole cluster-admin
3. RoleBinding vs ClusterRoleBinding
| 特性 | RoleBinding | ClusterRoleBinding |
|---|---|---|
| 作用范围 | 特定 Namespace | 整个集群 |
| 绑定对象 | Role 或 ClusterRole | 仅 ClusterRole |
| 可绑定主体 | User, Group, ServiceAccount | User, Group, ServiceAccount |
RoleBinding 示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: my-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
# 创建 RoleBinding
kubectl create rolebinding read-pods --role=pod-reader --serviceaccount=default:my-sa
kubectl create rolebinding read-pods --clusterrole=view --serviceaccount=default:my-sa -n default
# 查看 RoleBinding
kubectl get rolebindings --all-namespaces
kubectl describe rolebinding read-pods -n default
ClusterRoleBinding 示例:
# 创建 ClusterRoleBinding
kubectl create clusterrolebinding my-admin --clusterrole=cluster-admin --user=admin-user
# 查看 ClusterRoleBinding
kubectl get clusterrolebindings
kubectl describe clusterrolebinding my-admin
4. RBAC Verbs
| Verb | 含义 | 适用场景 |
|---|---|---|
get | 读取单个资源 | 查询 Pod 详情 |
list | 列出资源集合 | 列出所有 Pod |
watch | 监听资源变化 | 实时监控资源 |
create | 创建资源 | 创建 Deployment |
update | 更新资源 | 更新副本数 |
patch | 部分更新 | 打标签/注解 |
delete | 删除资源 | 删除 Pod |
deletecollection | 批量删除 | 删除所有 Pod |
5. 常用 RBAC 命令速查
# --- Role 操作 ---
kubectl create role <name> --verb=<verbs> --resource=<resources> [-n <namespace>]
kubectl get roles [-n <namespace>]
kubectl describe role <name> [-n <namespace>]
kubectl delete role <name> [-n <namespace>]
# --- ClusterRole 操作 ---
kubectl create clusterrole <name> --verb=<verbs> --resource=<resources>
kubectl get clusterroles
kubectl describe clusterrole <name>
kubectl delete clusterrole <name>
# --- RoleBinding 操作 ---
kubectl create rolebinding <name> --role=<role-name> --user=<user> [--serviceaccount=<sa>] [-n <namespace>]
kubectl create rolebinding <name> --clusterrole=<clusterrole-name> --user=<user> [-n <namespace>]
kubectl get rolebindings [-n <namespace>]
# --- ClusterRoleBinding 操作 ---
kubectl create clusterrolebinding <name> --clusterrole=<clusterrole-name> --user=<user>
kubectl get clusterrolebindings
# --- 批量操作组合示例 ---
# 创建只读用户
kubectl create serviceaccount readonly-sa
kubectl create rolebinding readonly-binding --clusterrole=view --serviceaccount=default:readonly-sa
# 创建可操作 Pod 的用户(局限在 default 命名空间)
kubectl create role pod-manager --verb=get,list,watch,create,update,delete --resource=pods
kubectl create rolebinding pod-manager-binding --role=pod-manager --serviceaccount=default:ops-sa
6. 验证权限
# 检查当前用户是否有权限
kubectl auth can-i get pods
kubectl auth can-i create deployments
# 检查其他用户的权限
kubectl auth can-i get pods --as system:serviceaccount:default:my-sa
# 检查所有操作权限
kubectl auth can-i --list
kubectl auth can-i --list --as system:serviceaccount:default:my-sa
# 检查特定命名空间下的权限
kubectl auth can-i get pods -n kube-system --as system:serviceaccount:default:my-sa
7. 预置 ClusterRole
Kubernetes 自带四个预置 ClusterRole:
| ClusterRole | 说明 |
|---|---|
cluster-admin | 超级管理员,拥有所有权限 |
admin | 命名空间管理员,允许读写大部分资源 |
edit | 允许读写资源(不含 RBAC 和配额) |
view | 只读权限(不含 Secrets) |
# 为用户授予只读权限
kubectl create clusterrolebinding view-binding --clusterrole=view --user=dev-user
# 为 ServiceAccount 授予管理员权限
kubectl create rolebinding sa-admin --clusterrole=admin --serviceaccount=default:app-sa
8. Subjects 字段详解
RoleBinding 和 ClusterRoleBinding 的 subjects 字段支持三种类型:
| kind | 用途 | 示例 |
|---|---|---|
User | Kubernetes 用户 | name: "john" |
Group | 用户组 | name: "developers" |
ServiceAccount | Pod 身份 | name: "my-sa", namespace: "default" |
CKA 考试要点
- 快速创建命令:熟练掌握
kubectl create role/clusterrole/rolebinding/clusterrolebinding的语法 - 资源配置规则:Role + ClusterRoleBinding = 跨命名空间权限的重要模式
- ServiceAccount 自动挂载:每个 Namespace 自动创建
defaultServiceAccount - 权限最小化:考试中注意只授予必要的最小权限
- 验证权限:用
kubectl auth can-i快速验证权限是否正确
🧪 完整操作实例:为应用团队创建受限 RBAC 权限
场景描述
在 namespace team-a 中创建 ServiceAccount ci-bot,授予其仅能创建和查看 Pod 与 Deployment 的权限,禁止删除操作。
前置条件
- 一个运行中的 Kubernetes 集群
- 具有 cluster-admin 权限的 kubectl 用户
操作步骤
Step 1: 创建命名空间
kubectl create namespace team-a
# namespace/team-a created
Step 2: 创建 ServiceAccount
kubectl create serviceaccount ci-bot -n team-a
# serviceaccount/ci-bot created
# 验证
kubectl get sa ci-bot -n team-a
# NAME SECRETS AGE
# ci-bot 1 5s
Step 3: 创建 Role(授予 Pod 和 Deployment 的 create/get/list/watch 权限)
kubectl create role ci-bot-role -n team-a \
--verb=get,list,watch,create \
--resource=pods,deployments
# role.rbac.authorization.k8s.io/ci-bot-role created
# 验证 Role 详情
kubectl describe role ci-bot-role -n team-a
Step 4: 创建 RoleBinding 将 SA 绑定到 Role
kubectl create rolebinding ci-bot-binding -n team-a \
--role=ci-bot-role \
--serviceaccount=team-a:ci-bot
# rolebinding.rbac.authorization.k8s.io/ci-bot-binding created
Step 5: 验证权限(auth can-i)
# 验证允许的操作
kubectl auth can-i get pods -n team-a --as system:serviceaccount:team-a:ci-bot
# yes
kubectl auth can-i create deployments -n team-a --as system:serviceaccount:team-a:ci-bot
# yes
# 验证禁止的操作(delete 未被授权)
kubectl auth can-i delete pods -n team-a --as system:serviceaccount:team-a:ci-bot
# no
kubectl auth can-i delete deployments -n team-a --as system:serviceaccount:team-a:ci-bot
# no
Step 6: 实际操作用 SA 的 token 验证(可选)
# 获取 SA 的 token
TOKEN=$(kubectl create token ci-bot -n team-a)
# 测试创建 Pod
kubectl run test-pod --image=nginx -n team-a --token=$TOKEN
# pod/test-pod created
# 测试删除 Pod(应失败)
kubectl delete pod test-pod -n team-a --token=$TOKEN
# Error from server (Forbidden): pods "test-pod" is forbidden: ... ci-bot" is forbidden
验证结果
# 最终权限清单
kubectl auth can-i --list -n team-a --as system:serviceaccount:team-a:ci-bot
考试提示
- CKA 考试中优先使用
kubectl create role和kubectl create rolebinding命令式方式,比写 YAML 更快 --as system:serviceaccount:<ns>:<sa-name>是考试中验证 SA 权限的标准方法- 注意 Role 是 namespace-scoped,ClusterRole 是 cluster-scoped,不要混淆
- 最小权限原则:只授予题目明确要求的 verb 和 resource