如何将Kubernetes Dashboard限制为仅显示指定命名空间
看起来你已经做了大部分正确的RBAC配置,但问题大概率出在你用来登录Dashboard的凭证不对——你之前用的应该是集群级高权限的token(比如Dashboard默认ServiceAccount的token),所以才会看到所有命名空间。我来一步步帮你解决:
第一步:获取你创建的受限ServiceAccount的token
你在xxx命名空间下创建了dashboard-account这个ServiceAccount,但你之前在Lens里看到的token,大概率是kube-system命名空间里Dashboard默认ServiceAccount的凭证(那个权限很高,能访问所有资源)。你需要获取自己创建的这个ServiceAccount对应的token:
- 先列出
xxx命名空间下的secret,找到和dashboard-account关联的那个:
kubectl get secrets -n xxx
你会看到类似dashboard-account-secret的条目(就是你手动创建的那个,或者Kubernetes自动生成的)。
- 解码获取token:
kubectl get secret dashboard-account-secret -n xxx -o jsonpath='{.data.token}' | base64 --decode
把输出的这段长字符串复制下来,这就是你需要的受限权限token。
第二步:用这个token登录Dashboard
打开Kubernetes Dashboard的登录页面,选择Token登录方式,粘贴刚才复制的token,点击登录。这时候Dashboard应该只会显示xxx命名空间的资源——因为你的dashboard-account只有这个命名空间的全权限,没有任何集群级别的权限。
(可选)创建受限的kubeconfig文件
如果你想用kubeconfig方式登录,而不是每次输入token,可以创建一个只包含dashboard-account凭证的kubeconfig:
- 先导出集群的CA证书(用于kubeconfig验证):
kubectl get secret -n kube-system default-token-$(kubectl get secrets -n kube-system | grep default-token | awk '{print $1}') -o jsonpath='{.data.ca\.crt}' | base64 --decode > ca.crt
- 创建kubeconfig文件(命名为
dashboard-restricted.conf),替换其中的占位符:
apiVersion: v1 kind: Config clusters: - cluster: certificate-authority: ca.crt server: https://<你的集群API地址>:6443 # 用kubectl cluster-info查看真实地址 name: microk8s-cluster contexts: - context: cluster: microk8s-cluster namespace: xxx user: dashboard-account name: dashboard-context current-context: dashboard-context users: - name: dashboard-account user: token: <刚才解码得到的token>
用这个kubeconfig登录Dashboard,会自动默认进入xxx命名空间,且无法访问其他命名空间的资源。
额外检查:确保没有多余的集群权限
如果还是能看到其他命名空间,可以检查一下dashboard-account有没有被意外绑定到集群级Role:
kubectl get clusterrolebindings | grep dashboard-account
如果有结果,说明这个ServiceAccount被赋予了集群权限,需要删除对应的ClusterRoleBinding:
kubectl delete clusterrolebinding <对应的绑定名称>
备注:内容来源于stack exchange,提问作者Viktor Eriksson

