kubectl连接远程Kubernetes集群遇权限拒绝,如何解决?
解决Kubespray部署K8s集群后kubectl权限问题的正确步骤
你遇到的问题其实是绕开了Kubespray自带的管理员配置文件,手动创建的用户没有绑定足够权限导致的。下面给你两种解决思路,优先推荐第一种最简便的方法:
方法一:直接使用Kubespray生成的管理员kubeconfig
Kubespray在部署完成后,会在集群的master节点自动生成拥有集群管理员权限的配置文件,路径是/etc/kubernetes/admin.conf,这才是你应该用来连接集群的正确配置,不需要手动从头创建用户和上下文:
- 先在本地创建kube配置目录(如果还没有的话):
mkdir -p ~/.kube - 通过scp把master节点的admin.conf复制到本地的kube配置目录:
scp root@<你的master节点IP>:/etc/kubernetes/admin.conf ~/.kube/config - 验证配置是否生效:
这时候应该能看到所有命名空间下的Pod了,说明权限正常。kubectl get pods -A
方法二:修复你手动创建的用户权限(适合自定义用户场景)
如果你一定要用自己创建的kubeuser来操作集群,那需要先以管理员身份登录集群(通过master节点的kubectl),给这个用户绑定足够的权限:
- 登录到master节点,执行以下命令创建ServiceAccount:
kubectl create serviceaccount kubeuser -n default - 创建ClusterRoleBinding,把
kubeuser绑定到cluster-admin(集群最高权限角色):kubectl create clusterrolebinding kubeuser-cluster-admin --clusterrole=cluster-admin --serviceaccount=default:kubeuser - 获取这个ServiceAccount对应的token:
SECRET_NAME=$(kubectl get serviceaccount kubeuser -n default -o jsonpath='{.secrets[0].name}') TOKEN=$(kubectl get secret $SECRET_NAME -n default -o jsonpath='{.data.token}' | base64 -d) - 回到本地,修改你的kubeconfig,用token替代之前设置的密码:
kubectl config set-credentials kubeuser/<你的集群IP> --token=$TOKEN - 重新切换到你的上下文:
kubectl config use-context default/<你的集群IP>/kubeuser - 再次验证:
这时候就能正常查看default命名空间的Pod了。kubectl get pods
为什么你之前的操作会失败?
你手动创建的kubeuser只是在本地kubeconfig里定义了用户名和密码,但集群里并没有对应的用户实体,也没有给它分配任何权限,所以K8s会把你识别为system:anonymous匿名用户,自然没有权限查看Pod。Kubespray默认不会创建你自定义的kubeuser,所以必须先在集群内创建对应的ServiceAccount并绑定权限才行。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

