kubectl auth can-i 是什么
can-i 向 API Server 发一次权限查询,回答“当前身份能不能在某个命名空间对某类资源做某个动作”。它是排查权限拒绝最省事的入口:先用它确认鉴权层结论,再去核对角色与绑定。它只回答鉴权问题,不覆盖准入控制、资源配额与自定义准入逻辑,所以即使显示可以,创建仍可能失败。配合模拟身份参数,还能在不切换环境的前提下核对某个服务账号的实际权限。
基本信息
| 基本用法 | kubectl auth can-i <动作> <资源> [-n 命名空间],返回是或否 |
|---|---|
| 列出全部 | kubectl auth can-i --list -n 命名空间,列出当前身份在该命名空间的能力 |
| 模拟身份 | --as 与 --as-group 可模拟用户或服务账号,需要自身具备模拟权限 |
| 子资源 | 可指定子资源,如查看日志、进入容器这类动作 |
| 适用版本 | 所有受支持的 kubectl 版本;身份查看类子命令在较新版本提供 |
| 输出细节 | 加 --quiet 只返回退出码,适合脚本判断 |
典型使用场景
- 排查权限拒绝:先确认是否鉴权层拦下,再查角色与绑定
- 发布前核对流水线身份是否有权更新目标资源
- 最小权限验收:逐项确认服务账号只能做该做的事
- 模拟服务账号身份,避免真去切环境或改凭据
- 确认某类子资源权限,例如能否查看日志或进入容器
使用示例
使用示例
kubectl auth can-i create pods -n dev # 当前身份能否创建 Pod
kubectl auth can-i --list -n dev # 列出当前身份在该命名空间的全部能力
kubectl auth can-i delete deployments --as=system:serviceaccount:dev:ci-bot -n dev # 模拟服务账号
kubectl auth can-i get pods --subresource=log -n dev # 确认日志子资源权限
kubectl auth can-i --quiet create pods -n dev # 只返回退出码,便于脚本判断
kubectl describe rolebinding -n dev # 核对绑定对象与主体排查权限拒绝的三要素
| 要素 | 查什么 | 常用命令 |
|---|---|---|
| 身份 | 当前用户或服务账号及其组 | can-i 加模拟参数、查看上下文配置 |
| 权限 | 角色里声明的动作与资源 | describe 角色对象 |
| 绑定 | 角色与主体的关联及作用范围 | get 绑定对象 |
查询显示可以但仍然失败时,问题通常在准入控制、配额或资源本身不可用,需要按另一条线索继续排查。
模拟身份时不要漏掉组参数:只改主体不改组,得到的权限集合与真实身份并不等价,结论会偏乐观。