Day 19 - RBAC 权限控制
📘 Day 19:RBAC 权限控制
🎯 今日目标
- 理解 RBAC 的四个核心概念
- 能创建 Role 并绑定到用户/ServiceAccount
- 会用 kubectl auth can-i 验证权限
- 能排查 Permission Denied 错误
🧠 理论精讲(30 分钟)
RBAC 四要素
1 | Subject(谁)────→ RoleBinding ────→ Role(能做什么) |
| 概念 | 作用域 | 说明 |
|---|---|---|
| Role | 命名空间 | 定义在某 NS 下的权限 |
| ClusterRole | 集群 | 定义集群级别权限 |
| RoleBinding | 命名空间 | 将 Role 绑定到主体 |
| ClusterRoleBinding | 集群 | 将 ClusterRole 绑定到主体 |
常见 verbs
| verb | 含义 | 对应 kubectl |
|---|---|---|
get |
查看单个资源 | kubectl get pod xxx |
list |
列出资源 | kubectl get pods |
watch |
监听资源变化 | kubectl get pods -w |
create |
创建 | kubectl create/apply |
update |
修改 | kubectl edit/patch |
delete |
删除 | kubectl delete |
🔧 动手实操(120 分钟)
练习 19.1:创建 ServiceAccount + Role + RoleBinding
1 | # 1. 创建命名空间 |
练习 19.2:ClusterRole + ClusterRoleBinding
1 | # 1. 创建 ClusterRole(集群级别只读) |
练习 19.3:创建受限 kubeconfig
1 | # 1. 获取 SA 的 Token |
练习 19.4:实战 RBAC 排错
1 | # 1. 排查 "cannot get resource" 错误 |
🐛 排错练习(30 分钟)
常见 RBAC 错误排查
1 | # 错误 1: "User system:serviceaccount:default:default cannot create resource" |
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 35 分钟
题目:RBAC 权限体系设计
1 | 【操作要求】 |
📋 命令速查
| 命令 | 功能 | 注解 |
|---|---|---|
kubectl auth can-i create pods |
检查当前用户权限 | 快速验证 RBAC 配置是否正确 |
kubectl auth can-i create pods --as=system:serviceaccount:<ns>:<sa> |
检查某 SA 权限 | 调试 ServiceAccount 权限问题 |
kubectl auth can-i --list |
列出当前用户所有权限 | 输出完整的资源-动词矩阵 |
kubectl auth can-i '*' '*' |
检查是否集群管理员 | 返回 yes 说明拥有全部权限 |
kubectl get role -A |
列出所有 Role | 命名空间级权限 |
kubectl get rolebinding -A |
列出所有 RoleBinding | 查看 Role 与用户/SA 的绑定关系 |
kubectl get clusterrole |
列出 ClusterRole | 集群级权限(节点、PV、StorageClass 等) |
kubectl get clusterrolebinding |
列出 ClusterRoleBinding | 集群级绑定关系 |
kubectl describe role <name> -n <ns> |
Role 详情 | 查看具体允许的资源和动词 |
kubectl describe clusterrole <name> |
ClusterRole 详情 | 系统自带 cluster-admin/edit/view 的权限范围 |
kubectl create role <name> --verb=get,list,watch --resource=pods -n <ns> |
快速创建 Role | --verb 和 --resource 即可,无需手写 YAML |
kubectl create rolebinding <name> --role=<role> --user=<user> -n <ns> |
绑定 Role 到用户 | 给真实用户授权 |
kubectl create rolebinding <name> --role=<role> --serviceaccount=<ns>:<sa> -n <ns> |
绑定 Role 到 SA | 给 ServiceAccount 授权 |
kubectl create clusterrole <name> --verb=get,list --resource=nodes |
创建 ClusterRole | 集群级资源必须用 ClusterRole |
kubectl create clusterrolebinding <name> --clusterrole=<role> --serviceaccount=<ns>:<sa> |
绑定 ClusterRole 到 SA | 跨命名空间的 SA 绑定集群级权限 |
kubectl get sa -A |
列出所有 ServiceAccount | 每个 NS 有默认 default SA |
kubectl get secrets | grep <sa>-token |
查找 SA 的 Token Secret | 1.24+ 不再自动创建,需手动 kubectl create token <sa> |
kubectl create token <sa> -n <ns> |
创建 SA 临时 Token | 1.24+ 推荐方式,有时效性 |
📚 参考来源
| 来源 | 链接 / 说明 |
|---|---|
| Kubernetes 官方:RBAC | https://kubernetes.io/docs/reference/access-authn-authz/rbac/ |
| Kubernetes 官方:鉴权概述 | https://kubernetes.io/docs/reference/access-authn-authz/authorization/ |
| Kubernetes 官方:使用 RBAC 授权 | https://kubernetes.io/docs/reference/access-authn-authz/rbac/#command-line-utilities |
| Kubernetes 官方:ServiceAccount | https://kubernetes.io/docs/concepts/security/service-accounts/ |
| Kubernetes 官方:kubectl auth can-i | https://kubernetes.io/docs/reference/access-authn-authz/authorization/#checking-api-access |