如何使用 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 ps
在 Azure 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 地址访问您的应用程序而不会出现任何问题
我在 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 ps
在 Azure 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 地址访问您的应用程序而不会出现任何问题