使用入口访问远程 Kubernetes 集群中的演示服务

Access a demo service in remote Kubernetes cluster using ingress

我在 Linux 机器上安装了一个 minikube,我尝试按照 Deploy Hello World App 从外部(我的浏览器)访问演示服务。

$ kubectl get service web
NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web    NodePort   10.103.184.174   <none>        8080:30068/TCP   17h
~$ minikube service web --url
http://192.168.49.2:30068

但是当我尝试从我的浏览器访问此 url 时,我得到:

Connection timeout. The server at 192.168.49.2 is taking too long to respond.

我尝试进行端口转发(在 Linux 机器上),但也没有用!

~$ kubectl port-forward svc/web 30068:8080

注意:: linux 机器内部可以 ping 到那个 ip,但外部没有 ping。

我错过了什么?

What am I missing?

你缺少的是网络知识的基础知识。您的 minikube 很可能 运行 在虚拟机中。此 VM 分配了一个虚拟网络接口,其 IP 地址仅被提到的 linux 机器知道,它在 运行 上,您网络中的其他设备都不知道它,因此不知道在哪里发送数据包。连接超时表明数据包在某处丢失(很可能在路由器上,但​​在某些情况下防火墙也可能是原因)。

你能做些什么来解决它?

尝试使用 --driver=none 启动 minikube,这样 minikube 就不会在虚拟机中启动,而是直接访问主机的网络接口及其 IP 地址。

$ minikube start --driver=none

其他解决方案是使用 kubectl port-forward。你使用它的方式几乎是正确的。你只忘记了一件事:kubectl port-forward 默认绑定 loopback/localhost。您需要明确告诉它绑定所有接口,以便可以从外部访问它。添加 --address=0.0.0.0 应该可以完成工作,但请记住使用 linux 机器的 ip,而不是 minikube 来访问网站。

$ kubectl port-forward svc/web 30068:8080 --address=0.0.0.0
Forwarding from 0.0.0.0:30068 -> 8080