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

use*_*r80 3 cloud kubernetes minikube

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

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

mar*_*rio 7

解释:


编辑:

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

azureuser@minikube:~$ minikube service web --url
http://192.168.49.2:31527
Run Code Online (Sandbox Code Playgroud)

所以很可能你用过这个。尽管进一步的解释基于virtualbox示例,但它也可以完全应用于这种情况,唯一的区别是minikube作为隔离的docker容器而不是作为 VM 运行。但是,如果您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
Run Code Online (Sandbox Code Playgroud)

仅在运行后:

azureuser@minikube:~$ minikube ssh
Run Code Online (Sandbox Code Playgroud)

进而:

docker@minikube:~$ docker ps
Run Code Online (Sandbox Code Playgroud)

您将看到由您的应用程序Pod运行的容器以及kubernetes 控制平面组件。列表很长,所以我不会把它放在这里。

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


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

minikube start --driver=virtualbox
Run Code Online (Sandbox Code Playgroud)

或者干脆:

minikube start
Run Code Online (Sandbox Code Playgroud)

如果您在minikube vm上安装了VirtualBox,它也会被自动检测到并使用驱动程序。virtualbox

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

您的minikubeAzure VM内运行,但不直接在其上运行。使用嵌套虚拟化,并且您的 minikube kubernetes 集群实际上运行在另一个虚拟机内的虚拟机上。

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

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

azureuser@minikube:~$ minikube service web --url
http://192.168.99.100:31955
Run Code Online (Sandbox Code Playgroud)

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

然后运行:

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
Run Code Online (Sandbox Code Playgroud)

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

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

解决方案:

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

kubectl port-forward --address 0.0.0.0 service/<service-name> 8080:8080
Run Code Online (Sandbox Code Playgroud)

这将注定任何的流量转发Azure的VM地址(也包括公众一个)到你的Service,在这种情况下甚至不必须的NodePort类型,ClusterIP也可以工作。

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

root@minikube:~# kubectl port-forward --address 0.0.0.0 service/web 80:8080
Run Code Online (Sandbox Code Playgroud)

通过使用Azure VM的外部 IP 地址,您应该能够毫无问题地访问您的应用程序。