本地kubectl执行get namespace报namespaces is forbidden错误的解决
解决Kubectl集群级Namespaces列表权限问题
首先得搞清楚报错的根源:你复制到本地的kubelet.conf对应的是节点kubelet的身份(system:node:mildevkub020),这个身份默认只拥有和节点运维相关的权限,完全没有集群级别的Namespaces查看权限,所以K8s API服务器直接返回了Forbidden错误。
下面给你两种解决方案,按需选择:
方案一:自定义最小只读权限(仅允许查看Namespaces)
这个方案遵循最小权限原则,只授予你需要的权限,操作需要在有权限的集群主节点上执行:
- 创建一个ClusterRole,定义“查看Namespaces”的权限,新建
namespace-reader-role.yaml文件:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: namespace-reader rules: - apiGroups: [""] # 空字符串代表核心API组 resources: ["namespaces"] verbs: ["list", "get"] # 允许列表和查看单个Namespace详情
- 应用这个ClusterRole:
kubectl apply -f namespace-reader-role.yaml
- 创建ClusterRoleBinding,把这个角色绑定到你的节点用户:
新建bind-namespace-reader.yaml文件:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-user-namespace-reader subjects: - kind: User name: system:node:mildevkub020 apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: namespace-reader apiGroup: rbac.authorization.k8s.io
- 应用绑定:
kubectl apply -f bind-namespace-reader.yaml
方案二:绑定现成只读ClusterRole(快速获取更多权限)
如果你不止需要查看Namespaces,还想访问其他集群资源(比如Pods、Deployments等),可以直接绑定K8s内置的view ClusterRole,这个角色包含了大部分资源的只读权限:
在主节点执行这条命令即可:
kubectl create clusterrolebinding node-user-view-access --clusterrole=view --user=system:node:mildevkub020
验证效果
回到本地终端,重新执行:
kubectl get namespaces
这时候应该就能正常输出所有Namespaces列表了。
如果之后需要调整权限,比如收回或新增权限,直接修改对应的ClusterRole或者ClusterRoleBinding即可~
内容的提问来源于stack exchange,提问作者Mr.DevEng
相关产品推荐
相关产品推荐

