在局域网中的另一台主机如何访问WSL中的MiniKube生成的微服务

文章目录

  • 小结
  • 问题
  • 解决
  • 参考

小结

我在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]

使用以下两条指令(注意是在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]

你可能感兴趣的:(Cloud,Linux,微服务,架构,云原生,kubernetes)