kubernetes Minikube:Nginix入口控制器路径规则和从主机OS浏览器连接?

wz8daaqr  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(122)

我已经在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/apihttp://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

odopli94

odopli941#

首先,curl --resolve命令实际上在做什么?
--resolve选项显示:“当您在80端口上看到一个到nr.demo.com的连接时,请使用$(minikube ip)返回的ip地址,而不是nr.demo.com的DNS查找结果。
我没有看到命令中任何地方指定了端口30691,那么它是如何知道在该端点上建立连接的呢?
对入口服务的访问由minikube容器(或虚拟机,如果您不使用Docker驱动程序)中的NAT规则处理。我有一个基于Docker的minikube示例运行;在容器中,我们看到:

$ docker exec -it minikube iptables -t nat -S
[...]
-A CNI-DN-d53472351adf60f6edddc -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.244.0.5:80
-A CNI-DN-d53472351adf60f6edddc -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.244.0.5:443
[...]

字符串
这将请求Map到minikube地址,对于端口80和443,到同一端口上的10.244.0.5(具体的目标ip可能会对您有所不同)。
在本例中,10.244.0.5是运行入口服务的Pod:

$ k -n ingress-nginx get pod -l app.kubernetes.io/component=controller -o json | jq .items[].status.podIP
"10.244.0.5"


因此,您对$(minikube ip):80的请求命中NAT规则,该规则将其发送到nginx pod,其中nginx正在侦听端口80和443。
第二,如果需要curl --resolve来建立连接,我将如何测试我的应用程序?
如果您想在浏览器中加载这些网站,最简单的解决方案是在/etc/hosts文件中添加条目,将适当的主机名Map到您的入口服务地址。也就是说,执行以下操作:

echo "$(minikube ip) nr.demo.com" >> /etc/hosts


然后,您可以在浏览器中输入nr.demo.com,它将像curl --resolve ...命令行一样得到处理。

相关问题