如何通过宿主机单公网IP暴露VirtualBox部署的Kubernetes集群服务
整体实现思路
你提到的在宿主机上绑定单公网IP、再打通到集群的思路是可行的,不需要给每个虚拟机单独分配公网IP。完整链路为:公网用户访问请求 -> 宿主机公网网卡接收 -> 宿主机完成流量转发/代理 -> 集群内Ingress路由匹配对应Service -> 后端Pod返回响应。
第一步:基础网络连通性校验
- 公网IP绑定:完成宿主机公网网卡配置后,先在宿主机本地验证公网IP可正常被外部访问,排除机房/运营商侧的安全组拦截(需提前确认要开放的访问端口,即URL中的xxxx端口无被上层网络封禁)。
- VirtualBox网段连通性:确认三台K8s节点的默认网关指向宿主机的虚拟机网段地址192.168.50.166,无VirtualBox侧防火墙拦截虚拟机到宿主机的入站流量——可在master节点上执行临时测试端口监听,从虚拟机内访问宿主机的该端口,确认连通无阻断。
第二步:集群侧服务暴露配置
因为需要实现/services路径的路由匹配,直接用NodePort暴露单个服务的方式后续维护成本高,推荐在集群内部署Nginx Ingress Controller作为统一流量入口:
- 将Nginx Ingress Controller以NodePort模式部署到集群,记录其暴露的NodePort端口(默认端口范围30000-32767,比如分配到的端口为30080)。
- 配置Ingress路由规则,将
/services路径的请求直接关联到对应的后端业务Service,无需为每个服务单独暴露独立端口。
第三步:宿主机侧流量打通
两种可落地的配置方式,按需选择即可:
- 方案A:宿主机本地反向代理(排查最简单,稳定性最高)
在宿主机上安装Nginx,监听你计划对外暴露的端口(即URL中的xxxx,比如8080),将所有HTTP请求反向代理到集群内Ingress的NodePort地址,可配置三个节点的轮询转发避免单节点故障:
配置完成后重载Nginx服务即可生效。server { listen 8080; location / { proxy_pass http://192.168.50.28:30080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 方案B:内核级端口转发(无额外代理层,转发性能更高)
先开启宿主机的IP转发功能,编辑/etc/sysctl.conf添加net.ipv4.ip_forward=1,执行sysctl -p生效。
再添加iptables的DNAT规则,将宿主机公网IP收到的对应端口流量直接转发到Ingress的NodePort地址,同时放开FORWARD链的转发规则,最后将规则持久化避免重启失效:# 将公网8080端口流量转发到master节点的Ingress NodePort iptables -t nat -A PREROUTING -d 140.112.1.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.50.30:30080 # 放开转发链路 iptables -A FORWARD -d 192.168.50.30 -p tcp --dport 30080 -j ACCEPT
第四步:分层排查验证
按照从内到外的顺序逐层测试,快速定位问题点:
- 第一层:在宿主机本地执行
curl http://127.0.0.1:8080/services,确认能拿到后端服务的响应,说明宿主机的代理/转发规则生效。 - 第二层:在任意虚拟机节点上执行
curl http://192.168.50.166:8080/services,确认能拿到响应,说明VirtualBox网段无流量拦截。 - 第三层:从公网侧的独立设备执行
curl http://140.112.1.1:8080/services,确认能拿到响应,说明全链路打通。
常见踩坑点:宿主机本地防火墙(firewalld/ufw)需要放开对应端口的入站规则,否则即使转发规则配置正确,公网流量也无法到达宿主机的监听服务。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

