能否创建移除特定命名空间读写权限的Kubernetes cluster-admin角色?
能不能创建一个排除特定命名空间权限的cluster-admin角色?
答案是不行,原生Kubernetes的RBAC机制做不到直接“从cluster-admin里减去某个命名空间的权限”,原因很简单:
- RBAC是只加权限的累加模型,所有规则都是用来给用户授权的,没有“拒绝”或者“收回部分权限”的功能
- cluster-admin是Kubernetes内置的超级集群角色,拿到这个权限就意味着能操作所有集群资源和所有命名空间里的内容,原生RBAC没法覆盖或移除它的部分权限
不过要实现类似的效果,有两种可行的办法:
1. 用OPA(Open Policy Agent)做细粒度拦截
OPA是Kubernetes的一个准入控制插件,可以自己写规则拦掉用户对特定命名空间的访问。步骤大概是:
- 先给用户绑定cluster-admin的权限,让他能正常操作大部分资源
- 写一条OPA规则,只要用户碰指定的那个命名空间(比如叫
restricted-ns),就直接拒绝请求
举个OPA规则的例子:
package kubernetes.admission deny[msg] { input.request.namespace == "restricted-ns" input.request.userInfo.username == "target-user" msg := "不准访问restricted-ns命名空间" }
2. 不用cluster-admin,自己定义角色
别直接用cluster-admin这个超级权限,拆分出符合需求的角色:
- 复制cluster-admin的所有权限,做成一个自定义的ClusterRole,但把特定命名空间的资源权限删掉(注意:集群级资源没法按命名空间过滤,这招只对命名空间级资源有用)
- 在所有允许访问的命名空间里,给用户绑定这个自定义角色
- 受限的那个命名空间,不给用户绑任何权限,或者绑一个空权限的角色(前提是用户没有其他集群级权限绑定)
要注意的是,这种方式需要自己维护自定义角色的权限,Kubernetes版本更新或者内置权限变化时,得同步更新这个自定义角色。
内容的提问来源于stack exchange,提问作者tal
相关产品推荐
相关产品推荐

