如何通过Ubuntu宿主机IP暴露虚拟机上运行的Kind Kubernetes集群
原有方案的问题
你当前用iptables DNAT的方式暴露服务存在两个核心缺陷,也是Websocket连接失败的主要原因:
- 内核默认禁止外部流量路由到127.0.0.0/8环回网段,
net.ipv4.conf.all.route_localnet参数默认值为0,短连接的REST请求可能因超时快未显现问题,但长连接的Websocket会被内核的路由规则拦截或因连接跟踪超时断开 - 缺少对应的SNAT规则,流量转发到127.0.0.1后回包源地址为环回地址,返回客户端时会被丢弃,直接导致Websocket握手失败
手写iptables规则本身确实稳定性差,后续还可能出现连接跟踪表溢出、规则被系统其他服务覆盖、重启失效等问题,不建议生产或长期测试环境使用。
更优的内网暴露方案
推荐两种比DNAT更稳定的方案,均原生支持Websocket长连接:
方案1:修改Kind集群端口映射配置(优先推荐)
你之前配置Ingress时,Kind默认会把Ingress的80/443端口绑定到宿主机的127.0.0.1地址,只需修改集群配置把监听地址改为ens160的IP即可,无需额外配置转发规则。
修改后的Kind集群配置示例如下:
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings: - containerPort: 80 hostPort: 80 listenAddress: "192.168.xx.xx" # 替换为你的ens160网卡实际IP protocol: TCP - containerPort: 443 hostPort: 443 listenAddress: "192.168.xx.xx" # 替换为你的ens160网卡实际IP protocol: TCP
用上述配置重建Kind集群后,Ingress会直接监听在ens160网卡的80/443端口,内网机器直接访问该IP即可,基于Docker原生的端口映射实现,稳定性高,无额外性能损耗。
方案2:宿主机部署Nginx反向代理(无需重建集群)
如果不想重建现有集群,可以在Ubuntu宿主机安装Nginx,监听ens160的80/443端口,反向代理到127.0.0.1的对应端口,同时配置Websocket支持即可。
Nginx配置示例:
server { listen 192.168.xx.xx:80; # 替换为ens160的实际IP server_name _; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Websocket支持配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; # 长连接超时设为1天,避免Websocket意外断开 } } # 443端口配置逻辑一致,补充对应SSL证书配置即可
该方案还可额外配置访问控制、请求日志、限流等能力,适合需要额外管控的场景。
内容的提问来源于stack exchange,提问作者max_sargent
相关产品推荐
相关产品推荐

