在 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>:nodeport
或 minikube 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
。但是该设置会复杂得多,因为它有 systemd
、conntrack
和其他包作为依赖项,而 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}
开始
我在 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>:nodeport
或 minikube 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
。但是该设置会复杂得多,因为它有 systemd
、conntrack
和其他包作为依赖项,而 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}