use*_*r80 3 cloud kubernetes minikube
我已经在 Azure 的 Ubuntu 实例上设置了一个minikube集群,它在 IP 上公开了一个外部服务:192.168.49.2:30000
curl 192.168.49.2:30000返回所需的输出。如何使用 azure 主机公共 IP 地址在本地计算机上使用浏览器访问此服务?
好的,我看到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 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
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
好的,现在让我们暂停一下,仔细看看这种方法意味着什么。
您的minikube在Azure 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. 如果使用注册的端口,从开始1024如8080你不需要root访问权限。所以运行后:
root@minikube:~# kubectl port-forward --address 0.0.0.0 service/web 80:8080
Run Code Online (Sandbox Code Playgroud)
通过使用Azure VM的外部 IP 地址,您应该能够毫无问题地访问您的应用程序。
| 归档时间: |
|
| 查看次数: |
1863 次 |
| 最近记录: |