Kubernetes RBAC 权限速查
常用命令
kubectl auth can-i get pods -n app
kubectl auth can-i '*' '*' --all-namespaces
kubectl auth can-i --list -n app
kubectl auth can-i create deployments --as=system:serviceaccount:app:deployer -n app
kubectl auth can-i get secrets --as=alice -n app
kubectl get role,rolebinding -n app
kubectl get clusterrole,clusterrolebinding
kubectl describe role app-reader -n app
kubectl describe clusterrole view
kubectl get rolebinding app-reader -n app -o yaml
kubectl get sa -n app
kubectl create token deployer -n app
kubectl create role app-reader --verb=get,list,watch --resource=pods -n app --dry-run=client -o yaml
kubectl create rolebinding app-reader --role=app-reader --serviceaccount=app:deployer -n app --dry-run=client -o yaml
场景速查
| 目的 |
写法/命令 |
注意 |
| 查当前权限 |
kubectl auth can-i --list -n app |
只反映当前身份 |
| 模拟用户 |
--as=alice |
执行者需要 impersonate 权限 |
| 模拟 SA |
--as=system:serviceaccount:app:deployer |
格式为 namespace:name |
| 查绑定对象 |
get rolebinding -n app -o yaml |
看 roleRef 与 subjects |
| 查聚合权限 |
describe clusterrole admin |
aggregationRule 会合并规则 |
| 最小权限 |
resourceNames + 具体 verb |
只对指定资源名生效 |
| 命名空间隔离 |
Role + RoleBinding |
ClusterRoleBinding 是全局的 |
| 使用内置角色 |
view / edit / admin / cluster-admin |
绑定前评估实际权限 |
| 生成清单 |
kubectl create role ... --dry-run=client -o yaml |
避免手写字段拼错 |
| 取 SA 令牌 |
kubectl create token <sa> -n app |
新版本默认短期令牌 |
易错点
- 错误:命名空间权限用 ClusterRoleBinding 绑定;正确:命名空间内优先 RoleBinding,全局权限才用 ClusterRoleBinding。
- 错误:只给
get 就想执行 kubectl get pods;正确:列表操作需要 list,watch 也是独立 verb。
- 错误:只授权
pods 却要读日志;正确:kubectl logs 需要 pods/log 子资源权限。
- 错误:只授权
pods 却要进入容器;正确:kubectl exec 需要 pods/exec 的 create 权限。
- 错误:
apiGroups 到处写 *;正确:core 组写 "",其它按实际 API group 填写。
- 错误:用
resourceNames 限制 list/watch;正确:它只对具名资源的 get、update、delete 等生效。
- 错误:Pod 用了错误的 ServiceAccount 却查 Role;正确:先确认 Pod 的
serviceAccountName 和令牌挂载。
- 错误:遇到 403 就绑
cluster-admin;正确:先用 auth can-i --list 和 describe rolebinding 定位缺口。
- 错误:
--as 模拟失败就认为目标无权限;正确:执行者本身可能缺少 impersonate 权限。
- 错误:改了 Role 只检查
get;正确:按实际 verb(list、watch、子资源)逐项验证。
相关命令
读完自测
- Role 与 ClusterRole 的区别是什么?
kubectl logs 需要什么资源权限?
- 如何验证某个 ServiceAccount 能否创建 Deployment?
答案
- Role 只在命名空间内生效,ClusterRole 是集群级规则,可通过 Binding 授权。
- 需要
pods/log 的 get 权限。
- 执行
kubectl auth can-i create deployments --as=system:serviceaccount:<ns>:<sa> -n <ns>。