在WSL2上使用minikube(Windows 10)-无法访问minikube IP

6

我已在本地计算机上安装了minikube实例(--driver=docker)。Minikube IP为192.168.49.2。当我启动minikube(minikube start --memory 7168)时,控制台没有错误。但尝试ping minikube IP失败。我做错了什么?

$ kubectl get nodes -o wide
NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION                   CONTAINER-RUNTIME
minikube   Ready    control-plane,master   9d    v1.20.2   192.168.49.2   <none>        Ubuntu 20.04.1 LTS   5.4.72-microsoft-standard-WSL2   docker://20.10.3

创建另一个终端标签并执行以下命令: minikube tunnel ... 然后尝试ping minikube。 - Hackerman
5个回答

11

请回想一下,minikube是本地的Kubernetes - 它在您的个人计算机上运行单节点Kubernetes集群,以便您可以尝试Kubernetes。现在,它不会在您的本地计算机中运行Kubernetes集群,而是在虚拟机内部运行。

这就是为什么您无法简单地从本地访问Node IP的原因。另一种方法是,在Kubernetes中,您可以创建NodePort Service来访问集群外部的工作负载,但是当您使用minikube运行Kubernetes时,这种方式不起作用 - 原因与上述相同。

现在,您可以通过使用minikube service <<YOUR_SERVICE_NAME>>命令来解决这个问题。这将创建一个隧道,以便从K8S集群外部访问您的应用程序 - 该应用程序使用Service公开。


您可以尝试@Hackerman提到的minikube tunnel,但我从未尝试过。


hagrawal,我尝试使用命令minikube service calendar-ui来应用解决方法,其中calendar-ui是我的服务与前端应用程序的pod相连接,但我得到的唯一结果是弹出浏览器窗口,显示消息“Not found, nginx/1.18.0”和URL“127.0.0.1:55614”。我尝试使用“127.0.0.1:55614/calendar”访问该应用程序,但没有成功。 - Mirosław Haręza
@MirosławHaręza 不要在IE中访问它,使用Chrome访问。如果仍然无法工作,请确保您没有任何客户端代理。 - hagrawal7777
我已经在Firefox中访问了它。 - Mirosław Haręza
2
minikube service <<name>> 对我很有用!谢谢。这应该被接受为正确答案。 - Arximede
我不知道为什么在 Windows 11 上无法完成此操作。Minikube 服务名称超时。 - Anonymous Creator

4

仅是在之前的答案上添加了一些内容。有Docker桥接限制,使得无法将流量路由到Linux容器(如何解决)。那就是为什么实现了minikube隧道和服务作为解决方法。

minikube tunnel作为一个进程运行,在主机上创建一个网络路由,使用集群的IP地址作为网关,到集群的服务CIDR。隧道命令直接将外部IP暴露给运行在主机操作系统上的任何程序。

另一种可能会让你感兴趣的替代方式是使用已经在#9761拉请求中启用的入口点:

.\minikube-windows-amd64.exe addons enable ingress                                                                                           I1121 00:59:39.443965    3000 translate.go:89] Failed to load translation file for en: Asset translations/en.json not found
* After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
* Verifying ingress addon...
* The 'ingress' addon is enabled

1
我已经执行了minikube tunnel命令来运行minikube实例,但没有帮助。我尝试在minikube IP(192.168.49.2)和本地主机上运行应用程序,但都无法ping通。您写道隧道会暴露外部IP,在我的情况下是内部IP,无法访问,我怀疑(但不确定,我对这个主题很陌生)。我还尝试运行此插件,但在运行时超时。 - Mirosław Haręza

1
在您的Windows系统上,在初始“minikube start”创建的容器之后,您可以通过键入“docker ps”来查看“minikube实例”。这是在此容器中运行的minikube 'master'节点。
它应该看起来像这样:
CONTAINER ID   IMAGE                                 COMMAND                  CREATED       STATUS             PORTS                                                                                                                                  NAMES
6293ca0ba5b0   gcr.io/k8s-minikube/kicbase:v0.0.25   "/usr/local/bin/entr…"   2 hours ago   Up About an hour   127.0.0.1:59539->22/tcp, 127.0.0.1:59540->2376/tcp, 127.0.0.1:59537->5000/tcp, 127.0.0.1:59538->8443/tcp, 127.0.0.1:59536->32443/tcp   minikube

在PORTS列中,您将看到由于minikube启动docker容器的方式而转发的端口。您可以看到这些类型的转发与您可能执行的任何包含“docker run -p port:port”的容器一样由docker处理。
请注意,此列表中的第一个端口转发是ssh端口:“127.0.0.1:59539->22/tcp”。
当您执行“minikube tunnel”时,minikube将打开ssh.exe实例,如果您在列设置中启用了命令行显示,则可以在Windows任务管理器中看到它们。
这些“隧道”看起来像这样:
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -N docker@127.0.0.1 -p 59539 -i C:\Users\steve.sims\.minikube\machines\minikube\id_rsa "-L 8080:10.102.174.166:8080"

如果我将该命令拆分并仅从命令提示符中运行此命令:
ssh docker@127.0.0.1 -p 59539 -i C:\users\steve.sims\.minikube\machines\minikube\id_rsa

然后我获得了一个交互式远程窗口进入minikube虚拟机(或节点)。键入“ifconfig eth0”我会得到:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.49.2  netmask 255.255.255.0  broadcast 192.168.49.255

事实上,我的minikube ip是192.168.49.2,但正如上面的人提到的那样,它是一个内部地址。

除此之外,ssh中的-N参数表示“无命令”,而结尾的-L则是以port-to-forward:destination-socket格式的端口转发标志。当然,所有的隧道都通过minikube在容器启动时建立的初始docker -p端口:端口转发来传输。

如果有用的话,您可以按照该行的格式通过脚本创建自己的ssh实例,它们将同样有效。


0
解决方案是按照您的服务名称运行。
minikube service <<*your_service_name*>> 

这个方法对我也起作用。而且这正是我在minikube官方网站上看到的解决方案。他们给出了一个创建服务的示例。如果你想暴露该服务,那么你需要运行与上述相同的命令。

enter image description here


0
运行这个命令:
minikube service --all

这是一个示例输出:
|-----------|------------|-------------|--------------|
| NAMESPACE |    NAME    | TARGET PORT |     URL      |
|-----------|------------|-------------|--------------|
| default   | kubernetes |             | No node port |
|-----------|------------|-------------|--------------|
  service default/kubernetes has no node port
|-----------|---------------|-------------|--------------|
| NAMESPACE |     NAME      | TARGET PORT |     URL      |
|-----------|---------------|-------------|--------------|
| default   | mongo-service |             | No node port |
|-----------|---------------|-------------|--------------|
  service default/mongo-service has no node port
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | webapp-service |        3000 | http://192.168.49.2:30100 |
|-----------|----------------|-------------|---------------------------|
  Starting tunnel for service kubernetes.
  Starting tunnel for service mongo-service.
  Starting tunnel for service webapp-service.
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | kubernetes     |             | http://127.0.0.1:34355 |
| default   | mongo-service  |             | http://127.0.0.1:43027 |
| default   | webapp-service |             | http://127.0.0.1:45361 |
|-----------|----------------|-------------|------------------------|
  Opening service default/kubernetes in default browser...
  http://127.0.0.1:34355
  Opening service default/mongo-service in default browser...
  http://127.0.0.1:43027
  Opening service default/webapp-service in default browser...
  http://127.0.0.1:45361
❗  Because you are using a Docker driver on linux, the terminal needs to be open to run it.

在最后,您可以看到可以从Windows访问的IP/端口列表。例如,我可以使用"http://127.0.0.1:45361"打开我的"default/webapp-service"服务。它将通过minikube创建的隧道进行传输。无需额外配置。
以下是命令文档和详细信息:
Returns the Kubernetes URL(s) for service(s) in your local cluster. In the case
of multiple URLs they will be printed one at a time.

Available Commands:
  list          Lists the URLs for the services in your local cluster

Options:
    --all=false:
        Forwards all services in a namespace (defaults to "false")

    --https=false:
        Open the service URL with https instead of http (defaults to "false")

    --interval=1:
        The initial time interval for each check that wait performs in seconds

    -n, --namespace='default':
        The service namespace

    --url=false:
        Display the Kubernetes service URL in the CLI instead of opening it in
        the default browser

    --wait=2:
        Amount of time to wait for a service in seconds

Usage:
  minikube service [flags] SERVICE [options]

Use "minikube service <command> --help" for more information about a given
command.
Use "minikube options" for a list of global command-line options (applies to all
commands).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接