树莓派4运行Minikube时Ingress局域网及公网暴露配置咨询
我在树莓派4设备上运行Minikube,执行$ minikube addons enable ingress命令启用Ingress组件后,参考公开的YAML配置文件为kubernetes-dashboard创建了对应的Ingress资源,配置内容如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress namespace: kubernetes-dashboard annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: dashboard.com http: paths: - path: / pathType: Exact backend: service: name: kubernetes-dashboard port: number: 80
配置生效后Ingress资源正常创建,分配到的外部IP地址为192.168.49.2。按照公开教程指引,我修改了树莓派的/etc/hosts文件,添加域名解析规则192.168.49.2 dashboard.com。在树莓派本机执行curl dashboard.com可返回预期响应,由于树莓派未安装图形浏览器无法直接查看页面,返回的HTML为Kubernetes Dashboard的标准首页代码。
我的MacBook与树莓派连接在同一台ISP提供的家用路由器下,处于同一局域网,但在MacBook上执行curl dashboard.com、ping 192.168.49.2均请求失败。树莓派与其他局域网设备默认处于192.168.1.x/24网段,已知可能需要配置iptables规则才能允许其他设备访问Ingress服务,在树莓派上执行ip addr show返回的网络接口信息如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTIPLE,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether dc:a6:32:a0:5b:17 brd ff:ff:ff:ff:ff:ff inet 192.168.1.x/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::dea6:32ff:fea0:5b17/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTIPLE> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether dc:a6:32:a0:5b:18 brd ff:ff:ff:ff:ff:ff 5: docker0: <NO-CARRIER,BROADCAST,MULTIPLE,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:66:3d:68:77 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:66ff:fe3d:6877/64 scope link valid_lft forever preferred_lft forever 6: br-982a6fd0200b: <BROADCAST,MULTIPLE,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:dd:e3:e1:66 brd ff:ff:ff:ff:ff:ff inet 192.168.49.1/24 brd 192.168.49.255 scope global br-982a6fd0200b valid_lft forever preferred_lft forever inet6 fe80::42:ddff:fee3:e166/64 scope link valid_lft forever preferred_lft forever 54: vetha0ba61f@if53: <BROADCAST,MULTIPLE,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-982a6fd0200b state UP group default link/ether aa:33:e5:14:69:e3 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::a833:e5ff:fe14:69e3/64 scope link valid_lft forever preferred_lft forever 78: veth8ae0efb@if77: <BROADCAST,MULTIPLE,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-982a6fd0200b state UP group default link/ether 6e:7b:d8:21:79:21 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::6c7b:d8ff:fe21:7921/64 scope link valid_lft forever preferred_lft forever
1. 同一局域网内其他计算机访问Ingress服务的配置方法
访问失败的核心原因是192.168.49.2是Minikube创建的内部网桥br-982a6fd0200b所属网段的地址,仅在树莓派本机的Minikube网络命名空间内可达,局域网其他设备没有到这个网段的路由,自然无法直接连通。按以下步骤配置即可实现局域网访问:
- 第一步:在树莓派上开启内核IP转发,执行如下命令:
sysctl -w net.ipv4.ip_forward=1 # 写入配置实现重启永久生效 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
- 第二步:添加iptables转发规则,将树莓派物理网卡
eth0(对应192.168.1.x局域网段的接口)收到的80、443端口请求,转发到Ingress控制器的实际监听地址192.168.49.2的对应端口,执行命令:
# 转发HTTP端口流量 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.49.2:80 # 转发HTTPS端口流量 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.49.2:443 # 配置源地址转换保证回包正常 iptables -t nat -A POSTROUTING -d 192.168.49.2/24 -j MASQUERADE
如果需要永久保存iptables规则,安装iptables-persistent包后执行netfilter-persistent save即可。
- 第三步:在局域网内其他访问设备(比如你的MacBook)上修改本地hosts文件,添加解析规则
[树莓派eth0的实际局域网IP] dashboard.com,例如树莓派eth0地址为192.168.1.100,则添加192.168.1.100 dashboard.com。
配置完成后,局域网设备即可正常访问Kubernetes Dashboard页面。
2. 将Ingress服务暴露到路由器层面实现跨网段访问的操作
跨网段访问不需要直接暴露Minikube内部的192.168.49.2网段,核心是让所有接入路由器的设备都能将访问请求转发到树莓派节点,有两种可落地的方案:
- 首选方案:直接在路由器后台配置端口映射,将路由器LAN口网关IP(或跨网段可达的IP)的80、443端口,映射到树莓派eth0的局域网IP的80、443端口,配合前面配置的iptables转发规则,所有能连通路由器的设备都可以正常访问服务。如果需要统一域名解析,可以在路由器后台配置本地自定义DNS记录,将
dashboard.com解析到路由器LAN口IP,这样所有接入路由器的设备不需要单独修改hosts即可访问。 - 备选方案:如果路由器支持自定义静态路由,可以添加路由规则将
192.168.49.0/24网段的下一跳地址设置为树莓派的eth0 IP,同时放开树莓派iptables的转发过滤规则,所有接入路由器的设备即可直接访问192.168.49.2这个Ingress地址。但部分家用ISP定制路由器没有静态路由配置功能,且该方案会将Minikube内部网段直接暴露到整个局域网,安全性较低,不推荐优先使用。
3. 将Ingress地址加入DMZ实现公网暴露的可行性
直接将192.168.49.2这个Minikube内部地址加入DMZ是完全不可行的。这个IP属于树莓派本地的Docker网桥网段,路由器和该地址不在同一个二层网络,无法直接将流量转发到这个IP上。
可行的公网暴露方案操作如下:
- 先按照第一部分的配置,确保树莓派eth0的IP可以正常将80、443端口流量转发到内部Ingress服务
- 在路由器后台配置DMZ主机时,直接填写树莓派eth0的局域网IP(192.168.1.x),而非Minikube内部的192.168.49.2。配置完成后所有发送到路由器公网IP的流量都会被转发到树莓派,再通过树莓派上的iptables规则转到Ingress控制器,即可实现公网访问。
注意:直接将服务暴露到公网存在极高安全风险,Kubernetes Dashboard默认没有强认证机制,务必配置身份认证、访问控制规则,不要长期无防护暴露在公网。
内容的提问来源于stack exchange,提问作者Giacomo Gagliano

