K8s仅拥有4个命名空间权限的受限用户如何获取CRD访问权限
问题根因
customresourcedefinitions.apiextensions.k8s.io 是Kubernetes原生的集群级资源,不属于任何命名空间。你之前两个方案用的都是命名空间作用域的Role和RoleBinding,仅能对当前命名空间下的资源生效,天然无法授权集群级资源的访问权限,所以始终报集群作用域无权限的错误。
场景1:需要操作CRD本身(比如执行kubectl get crd、创建/删除CRD等)
必须使用集群级的ClusterRole和ClusterRoleBinding授权,配置参考如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: crd-cluster-admin rules: - apiGroups: ["apiextensions.k8s.io"] resources: ["customresourcedefinitions"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 可按需裁剪权限范围 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dev-user-crd-binding subjects: - kind: ServiceAccount name: dev-crd-ns-user namespace: dev-crd-ns # 若需要给4个命名空间对应的服务账号都授权,继续在下方添加条目即可: # - kind: ServiceAccount # name: dev-mon-fe-ns-user # namespace: dev-mon-fe-ns # - kind: ServiceAccount # name: dev-strimzi-operator-ns-user # namespace: dev-strimzi-operator-ns # - kind: ServiceAccount # name: dev-titan-ns-1-user # namespace: dev-titan-ns-1 roleRef: kind: ClusterRole name: crd-cluster-admin apiGroup: rbac.authorization.k8s.io
配置应用后即可正常执行kubectl get crd等操作。
场景2:仅需要操作指定CRD对应的自定义资源(CR)实例,不需要操作CRD本身
如果你的需求只是对某个已经创建好的CRD(比如kafka.strimzi.io)的命名空间下的实例进行增删改查,不需要修改/查询CRD本身,那不需要集群级权限,只需要在对应命名空间的Role里添加对应CR的权限即可,参考配置:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: dev-crd-ns name: custom-resource-admin rules: - apiGroups: ["strimzi.io"] # 替换为你的CRD对应的apiGroup resources: ["kafkas", "kafkatopics"] # 替换为你的CRD对应的resources名称 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
后续用RoleBinding绑定对应用户服务账号即可生效。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

