我有一个可以在多种环境下运行的简单入口文件,但要访问它,它的行为会有所不同,具体取决于我是在 Mac 还是 Ubuntu 机器上运行 minikube 集群。
具体来说,对于我的 Mac,我必须添加以下条目:
127.0.0.1 my.kube
到 /etc/hosts,并运行 minikube tunnel
让我能够在浏览器中访问我的应用程序:http://my.kube
。
但是,对于我的 Ubuntu 系统,我必须获取
minikube ip
并将生成的 IP 放入 /etc/hosts
中,例如 192.168.49.2 my.kube
。然后我就不需要运行minikube tunnel
。
虽然我可以看到每种方法的优缺点:
127.0.0.1
和隧道消除了对 minikube IP 的依赖,如果删除并重新创建集群,这可能会发生变化(尽管已经进行了一些工作以使其持久化)。但是,我的问题是为什么事情的表现完全不同?
我已经在两个环境中启用了入口插件
minikube addons enable ingress
。
当我使用
kubectl get ingress my-ingress -o yaml
检查入口创建的 loadBalancer 的主机名时,我得到了相同的结果。我希望在使用 minikube IP 的情况下看到 IP (Ubuntu)。
....
status:
loadBalancer:
ingress:
- hostname: localhost
再次强调,所有服务都已启动并运行良好,问题只是
/etc/hosts
中的内容以及 minikube tunnel
是否正在运行。
另外,需要明确的是,我的 Ubuntu 系统无法与
127.0.0.1
和 minikube tunnel
配合使用。我找不到适用于这两种环境的通用方法。
作为参考,这是我的入口文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my.kube
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-ui
port:
number: 3000
- path: /api
pathType: Prefix
backend:
service:
name: my-api
port:
number: 8080
为了保护无辜者,一些名字已被更改。
为了完整起见,服务很简单:
apiVersion: v1
kind: Service
metadata:
name: my-ui
spec:
selector:
app: my-ui
ports:
- protocol: TCP
port: 3000
targetPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: my-api
spec:
selector:
app: my-api
ports:
- protocol: TCP
port: 8080
targetPort: 8080
Minikube 在 Mac 和 Linux 上对 ingress 的支持不同。
在 Linux 上,完全支持入口,因此不需要使用
minikube tunnel
。
在 Mac 上,由于网络问题存在一个未解决的问题。文档指出不支持 minikube ingress 插件,但我认为这即使不是不正确,也是高度误导的。只是支持方式不同(而且不太好)。
在 Mac 和 Linux 上都需要
minikube addons enable ingress
。在 Mac 上启用 ingress 插件表明 ingress 将在 127.0.0.1 上可用,如屏幕截图所示,而 Linux 将通过 minikube ip
使其可用。然后,当我们在 Mac 上启动 minikube tunnel
时,它将像任何其他公开的服务一样连接到入口。
感谢加布里埃尔为我指明了正确的方向。
在我的 minikube(macos BigSur) 中,版本为 v1.25.2,
我需要在一个终端中运行
minikube tunnel
minikube tunnel
此外,入口主机需要在
/etc/hosts
中映射到 127.0.0.1
。例如,假设我的入口主机为“core.harbor.domain”。此域映射必须在/etc/hosts
文件中设置
sudo vi /etc/hosts
127.0.0.1 core.harbor.domain