我已经在Kubernetes中配置了一个Ingress控制器,并且有一个关于功能的问题。
$ minikube service list
ingress-nginx | ingress-nginx-controller | http/80 | http://192.168.64.2:30691
字符串
我可以连接并从我的Web服务HTTP API获得响应:
$ curl --resolve "nr-demo.com:80:$( minikube ip )" -i http://nr-demo.com/api
HTTP/1.1 200 OK
Date: Sun, 23 Jul 2023 21:56:34 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: http://undefined:undefined
Vary: Origin
型
但是,当我使用下面的a连接时,返回了一个404响应:
curl http://192.168.64.2:30691/api
型
我尝试使用下面的入口规则,在相同的源、前端和后端上使用不同的路径提供两个微服务。这样就不会触发CORS。
首先,curl --resolve
命令的实际作用是什么?我没有看到在命令中的任何地方指定了端口30691
,那么它是如何知道在该端点上建立连接的?
第二,如果需要curl --resolve
来建立连接,我将如何测试我的应用程序?例如,我需要在浏览器地址中键入http://192.168.64.2:30691/api
和http://192.168.64.2:30691/
,但此curl请求不可用。这是一种测试前端和后端的可行方法吗?是否有其他选项可以让浏览器像curl一样工作?
谢啦,谢啦
此处为上述的入口规则,以供参考:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nr-demo-mean-api-1-ing
spec:
rules:
- host: nr-demo.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: nr-demo-mean-api-1-svc-np
port:
number: 8080
型
1条答案
按热度按时间odopli941#
首先,curl --resolve命令实际上在做什么?
--resolve
选项显示:“当您在80
端口上看到一个到nr.demo.com
的连接时,请使用$(minikube ip)
返回的ip地址,而不是nr.demo.com
的DNS查找结果。我没有看到命令中任何地方指定了端口30691,那么它是如何知道在该端点上建立连接的呢?
对入口服务的访问由minikube容器(或虚拟机,如果您不使用Docker驱动程序)中的NAT规则处理。我有一个基于Docker的minikube示例运行;在容器中,我们看到:
字符串
这将请求Map到minikube地址,对于端口80和443,到同一端口上的
10.244.0.5
(具体的目标ip可能会对您有所不同)。在本例中,
10.244.0.5
是运行入口服务的Pod:型
因此,您对
$(minikube ip):80
的请求命中NAT规则,该规则将其发送到nginx pod,其中nginx正在侦听端口80和443。第二,如果需要curl --resolve来建立连接,我将如何测试我的应用程序?
如果您想在浏览器中加载这些网站,最简单的解决方案是在
/etc/hosts
文件中添加条目,将适当的主机名Map到您的入口服务地址。也就是说,执行以下操作:型
然后,您可以在浏览器中输入
nr.demo.com
,它将像curl --resolve ...
命令行一样得到处理。