如何使用 minikube 主机的 public ip 地址访问外部服务

how to access external service using the minikube host's public ip address

我在 Azure 的 Ubuntu 实例上设置了一个 minikube 集群,它在 IP 上公开了一个外部服务:192.168.49.2:30000

curl 192.168.49.2:30000 returns 所需的输出。 如何使用 azure 主机 public IP 地址在本地计算机上使用浏览器访问此服务?

说明:


编辑:

好的,我看到 docker 驱动程序默认使用 192.168.49.2 IP 地址:

azureuser@minikube:~$ minikube service web --url
http://192.168.49.2:31527

所以很可能你用过这个。虽然进一步的解释是基于 virtualbox 示例,但它也可以完全应用于这种情况,唯一的区别是 minikube 运行它作为一个独立的 docker 容器而不是一个虚拟机。但是,如果您 运行 docker psAzure VM 实例 上,您只会看到一个名为 minikube:

的容器
azureuser@minikube:~$ docker ps
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                                                                                                      NAMES
af68ab219c6c        gcr.io/k8s-minikube/kicbase:v0.0.14   "/usr/local/bin/entr…"   53 minutes ago      Up 53 minutes       127.0.0.1:32771->22/tcp, 127.0.0.1:32770->2376/tcp, 127.0.0.1:32769->5000/tcp, 127.0.0.1:32768->8443/tcp   minikube

仅在运行宁之后:

azureuser@minikube:~$ minikube ssh

然后:

docker@minikube:~$ docker ps

您会看到容器 运行 由您的 app Pod 以及 kubernetes 控制平面组件。名单比较长就不放了

但它表明您的 kubernetes 集群实际上以与您的 Azure VM 主机非常相似的方式隔离,以防万一它 运行 在 嵌套 VM 中。这里的关键点是 minikube 集群的网络与主机 VM 网络隔离,并且 NodePort 服务只能在 VM 或 minikube docker 容器的外部 IP 上访问,不会暴露任何端口任何主机 VM 网络接口。


我已经重现了你的案例,假设你用 virtualbox driver 启动了你的 minikube,所以如果我的假设是错误的,请纠正我。你可以这样开始:

minikube start --driver=virtualbox

或简单地:

minikube start

如果你在你的 minikube 虚拟机上安装了 VirtualBox,它也会被自动检测到,virtualbox 驱动程序将被使用。

好的,让我们暂停一下,仔细看看这种方法意味着什么。

你的 minikube 运行s 在你的 Azure VM 中,但它不直接 运行 .使用嵌套虚拟化,您的 minikube kubernetes 集群实际上 运行s 在另一个 vm 内的一个 vm 上。

因此,如果您使用 NodePort 服务公开了 Deployment,它将在 minikube vm 的外部 IP 地址上可用(即嵌套虚拟机)。但是这个 IP 只是从这个 vm 的角度来看是外部的。

让我们通过 ssh 进入我们的 Azure VM 和 运行:

azureuser@minikube:~$ minikube service web --url
http://192.168.99.100:31955

您的服务名称和地址会有所不同,但我展示它只是为了说明这个想法。

然后 运行:

azureuser@minikube:~$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
3: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.99.1/24 brd 192.168.99.255 scope global vboxnet0
       valid_lft forever preferred_lft forever

如您所见,192.168.99.100 可通过 vboxnet0 网络接口访问,因为它是 192.168.99.0/24 网络的一部分,由 virtualbox vm 使用。

因此,如果不使用额外的端口转发,就无法访​​问它,不仅在 Azure VM 的外部 IP 上,而且在其任何内部网络接口上。 NodePort 服务仅在嵌套的 VirtualBox VM(或其他管理程序)的外部 IP 上公开 Deployment,可从 Azure VM 访问 主机,但它没有暴露在任何网络接口上,因此也无法从外部访问它。

解决方案:

我刚才说的是端口转发吗?幸运的是 kubectl 使它变得相当容易。如果到目前为止您还没有在 Azure VM 上安装它,请安装它,因为 minikube kubectl 可能无法正常工作。您可以使用以下命令:

kubectl port-forward --address 0.0.0.0 service/<service-name> 8080:8080

这会将发往任何 Azure VM 地址(也是 public 地址)的流量转发到您的 Service,在这种情况下不会甚至必须是 NodePort 类型,ClusterIP 也可以。

警告:为了能够绑定到众所周知的端口,例如 80,您需要 运行 此命令为 root。如果您使用已注册的端口,从 1024 开始,例如 8080,您不需要 root 访问权限。所以在 运行ning:

之后
root@minikube:~# kubectl port-forward --address 0.0.0.0 service/web 80:8080

您应该可以使用 Azure VM.

的外部 IP 地址访问您的应用程序而不会出现任何问题