小结
我在WSL(Windows Subsystem for Linux)安装了Minikube中并设置好了Kubernetes环境。在Kubernetes环境中配置好微服务后,从局域网中的另一台主机无法访问WSL中的MiniKube生成的微服务,通过网络转发解决了这个问题。
问题
设置Minikube可参考How to Install Minikube on Ubuntu 22.04 / 20.04,验证在WSL(Windows Subsystem for Linux)是没有任何问题的。
这里有一个问题对后面在局域网中的另一台主机如何访问WSL中的MiniKube生成的微服务造成麻烦,因为这里DOCKER_HOST
被设置成了127.0.0.1
,本机访问这个回环地址是没有问题,那么在局域网中的另一台主机如何访问呢?
john@LAPTOP-XXYYZZ:~$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://127.0.0.1:53167"
export DOCKER_CERT_PATH="/home/john/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"
如下路由是无法从另外一台主机访问到的:
john@LAPTOP-XXYYZZ:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-service LoadBalancer 10.102.81.61 127.0.0.1 80:30699/TCP 19h
这里使用到了Kong和Minikube tunnel
john@LAPTOP-XXYYZZ:~$ kubectl -n kong get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-proxy LoadBalancer 10.109.94.249 127.0.0.1 80:30446/TCP,443:31224/TCP 25h
kong-validation-webhook ClusterIP 10.104.169.231 <none> 443/TCP 25h
john@LAPTOP-XXYYZZ:~$
使用以下指令启动minikube tunnel
john@LAPTOP-XXYYZZ:~$ minikube tunnel
不知为何,DOCKER_HOST没有设置成eth0, 以下这个eth0地址172.31.170.141
可以从本地主机访问,但是每次主机重启后,有可能是因为这个地址是动态变化的。
john@LAPTOP-XXYYZZ:~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.31.170.141 netmask 255.255.240.0 broadcast 172.31.175.255
inet6 fe80::215:5dff:fe1b:3ec5 prefixlen 64 scopeid 0x20<link />
ether 00:15:5d:1b:3e:c5 txqueuelen 1000 (Ethernet)
RX packets 10497870 bytes 1870201808 (1.8 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 672122 bytes 54296608 (54.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 126517780 bytes 20016489328 (20.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 126517780 bytes 20016489328 (20.0 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
解决
参考[Stackoverflow: Connecting to WSL2 server via local network [closed]][4]
使用以下两条指令(注意是在Windows中):
netsh advfirewall firewall add rule name="Allowing LAN connections" dir=in action=allow protocol=TCP localport=5000
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=5000 connectaddress=localhost connectport=80
以上第一条指令在本机开通了一个端口5000,这样可以通过局域网中的另一台主机访问这个端口5000。第二条指令,端口5000的流量被转发到WSL中的服务端口80。
也就是,以上test-service
这个微服务是在Kubernetes中使用端口80, 在局域网中的另一台主机访问本地主机的5000端口,这个流量就被转发到WSL中的MiniKube生成的微服务的80端口。
参考
https://kubernetes.io: Ingress Controllers
Minikube K8S FAQ
How to Install Minikube on Ubuntu 22.04 / 20.04
[Stackoverflow: Connecting to WSL2 server via local network [closed]][4]
[4]: https://stackoverflow.com/questions/61002681/connecting-to-wsl2-server-via-local-network