Vagrant搭建虚拟机K8s集群后宿主机无法访问Dashboard的问题排查
核心问题根因定位
从你提供的节点本地curl测试结果就能直接锁定两个核心问题,不存在“宿主机跨虚拟机网络不通”的基础网络问题:
- 你以为在master节点启动成功的
kubectl proxy进程根本没有正常常驻运行,所以哪怕在master节点本地用127.0.0.1访问8001端口,直接返回连接拒绝 - 就算
kubectl proxy正常启动,默认配置下它只会绑定127.0.0.1回环网卡,其他网卡收到的请求(包括同网段宿主机、虚拟机IP的请求)都会被直接拒绝
你之前脚本输出“Started kube proxy on v-kube-master machine”但实际进程不存在,就是因为远程执行时用了
kubectl proxy &的后台启动方式,SSH通道关闭后进程直接被系统回收,根本没有常驻在节点上。
分步排查与解决方案
1. 先在master节点启动可常驻的kubectl proxy进程
选下面任意一种启动方式即可,不要再用裸&的方式启动:
- 方式1:用nohup让进程脱离SSH会话常驻,适合长期使用
# 绑定所有网卡,放开Host头校验,日志输出到临时文件 nohup kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' >/tmp/kube-proxy.log 2>&1 & - 方式2:临时测试用,登录master节点后直接前台执行kubectl proxy命令,保持SSH窗口在线即可
启动完成后先在master节点本地做连通性验证:
# 确认进程存在 ps aux | grep kubectl proxy # 本地访问Dashboard代理地址 curl http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
只要本地curl能返回正常的响应内容,就说明proxy进程运行正常。
特别提醒:必须加--accept-hosts='^*$'参数,不然kubectl proxy会默认拦截所有非localhost的Host请求,哪怕端口完全通了,也会直接返回403错误,很多人卡在这里反复排查网络问题。
2. 打通宿主机到虚拟机的访问通路
根据你的Vagrant网络配置选对应验证逻辑:
- 如果用的是host-only网络(即你日志里的192.168.50.10这个网段),只要kubectl proxy绑定了0.0.0.0,虚拟机内部防火墙没有拦截8001端口,宿主机直接访问
http://192.168.50.10:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/就能正常打开 - 如果用的是Vagrant默认NAT网络,需要在Vagrantfile里配置端口转发规则,把宿主机的127.0.0.1:8001端口映射到master虚拟机的8001端口,之后直接访问宿主机本地的127.0.0.1:8001即可
免kubectl proxy的备选访问方案
如果不想常驻kubectl proxy进程,可以直接把Dashboard服务改成NodePort类型,直接通过节点端口访问,稳定性更高:
# 修改Dashboard服务类型为NodePort kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' # 查看自动分配的NodePort端口 kubectl -n kubernetes-dashboard get svc kubernetes-dashboard
拿到端口号后,放开节点对应端口的防火墙规则,直接通过http://<任意集群节点IP>:<NodePort端口>就能从宿主机访问Dashboard。
内容的提问来源于stack exchange,提问作者Sebastian Sommerfeld
相关产品推荐
相关产品推荐

