在 WSL2 中安装 Minikube 集群时无法访问已部署的服务

Cannot access deployed services when Minikube cluster is installed in WSL2

我在 Windows 10 pro 的 WSL 2 中设置了一个 Minikube 集群,其中 docker-for-windows 用于 WSL2 集成。 Minikube 使用默认 docker 驱动程序启动。

$ minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7

如果我遵循 getting started guide,在创建 hellow-minikube 服务后,我应该能够通过 <minikube-ip>:nodeportminikube service 命令连接到该服务。

但是第一种方法没有用。因为甚至不可能从 WSL 2 ping minikube ip: (这在纯 Ubuntu 安装的 Minikube 设置中有效。问题出在 WSL2 - linux 的 Windows 子系统中)。

$ minikube ip
192.168.49.2

$ ping 192.168.49.2
PING 192.168.49.2 (192.168.49.2) 56(84) bytes of data.
^C
--- 192.168.49.2 ping statistics ---
293 packets transmitted, 0 received, 100% packet loss, time 303708ms

第二种方法 minikube service hello-minikube 也没有用,因为它再次使用 minikube IP 提供访问权限 url。

$ minikube service hello-minikube

  Starting tunnel for service hello-minikube.
  Opening service default/hello-minikube in default browser...
  **http://192.168.49.2:30080**
❗  Because you are using a Docker driver on linux, the terminal needs to be open to run it.

但这实际上在以前的 Minikube 版本中是有效的,因为它实际上是将主机端口暴露给服务,我们可以连接到主机端口来访问服务。它需要手动干预,因为主机端口访问仅在 minikube service 命令保持 运行.

之前可用

有什么办法可以预先配置一个访问服务的端口(nodePort),即使部署在WSL2的Minikube中也能访问到服务?

注:

我尝试使用 WSL 的其他驱动程序,例如 --driver=none。但是该设置会复杂得多,因为它有 systemdconntrack 和其他包作为依赖项,而 WSL2 目前没有这些。

还尝试在 Windows 10 中设置一个 Virtualbox+vagrant Ubuntu 框并安装 docker 并在那里启动带有 docker 驱动程序的 minikube。一切都在该 VM 内运行。但是无法从 windows 主机访问服务,因为 minikube ip 是仅在该 VM 内部可用的主机专用 IP 地址。

WSL2 中带有 docker 驱动程序的 Minikube,在执行 minikube start 命令时创建名称为 minikube 的 docker 容器。该容器具有一些端口映射,可帮助 kubectl 和客户端连接到服务器。

请注意 kubectl cluster-info 作为服务器连接到其中一个端口。 (正常情况下,控制平面会运行在8443端口,这里是一个随机的高端口,是映射的)。

$ kubectl cluster-info

Kubernetes control plane is running at https://127.0.0.1:55757
CoreDNS is running at https://127.0.0.1:55757/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ docker ps

CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS         PORTS
                                                                                                                    NAMES
9cc01654bd2f   gcr.io/k8s-minikube/kicbase:v0.0.30   "/usr/local/bin/entr…"   7 minutes ago   Up 7 minutes   127.0.0.1:55758->22/tcp, 127.0.0.1:55759->2376/tcp, 127.0.0.1:55756->5000/tcp, 127.0.0.1:55757->8443/tcp, 127.0.0.1:55760->32443/tcp   minikube

要进一步调试和诊断集群问题,请使用 'kubectl cluster-info dump'。

如果您可以为应用程序的服务提供固定的 nodePort,那么您可以在 minikube 上添加一个自定义端口映射,从该 nodePort(minikube host/VM)到 hostPort(WSL2)。然后您可以使用 localhost:hostPort.

访问该服务

例如,

您想使用 nodePort 30080 创建一个服务。

在这种情况下,请确保使用包含此节点端口的自定义端口映射启动 minikube:

$ minikube start --ports=127.0.0.1:30080:30080

现在,如果您使用 nodePort=30080 部署服务,您将能够通过 http://localhost:30080/.

访问它

在 MacOS 上安装 Minikube 时出现了这样的问题。 以下是有关解决方法的一些详细信息:https://github.com/kubernetes/minikube/issues/11193

@AnjanaAK 所述的解决方案有效。请记住删除我们 运行 minikube start 时创建的 docker 图像“minikube”,然后从 minikube start --ports=127.0.01:{portnumber}:{portnumber}

开始