基于入口域的路由在浏览器中不起作用,但我能够成功地在入口控制器pod上卷曲URL

时间:2018-05-28 09:00:57

标签: reverse-proxy google-kubernetes-engine kubernetes-ingress

我使用以下链接安装了入口控制器: https://cloud.google.com/community/tutorials/nginx-ingress-gke

已启动并正在运行

NAME TYPE CLUSTER-I EXTERNAL-IP PORT(S)

nginx-ingress-controller LoadBalancer X.X.X.X X.X.X.X1 80:123 / TCP,443:456 / TCP

之后我安装了应用程序并将其暴露为nodePort,bot app up并运行。

入口规则的定义如附件中所述:

enter image description here

我非常喜欢inginx-controller pod并测试以下内容:

测试:1

输入:curl localhost

输出:默认后端 - 404

测试:2

输入:curl localhost -H'Host:foo.com'

输出:app正常工作

测试:3

输入:curl localhost -H'主持人:faa.com'

输出:app正常工作

测试:浏览器Chrome上的4

  • 输入:foo.com

  • 输入:faa.com

输出:默认后端 - 404

我无法弄清楚我在哪里重新检查

请支持我。

2 个答案:

答案 0 :(得分:0)

查看您的YAML文件后,我发现您在Ingress服务中没有“默认后端”。 “默认后端”将定义如果页面导致错误404时要采取的规则。

“默认后端”与backend下的path不同。 默认后端必须在spec下。

有关默认后端的更多信息,您可以阅读k8s documentation

这是在YAML文件中定义默认后端的方法。

spec:
   backend:

出于相同的原因,它无法在chrome浏览器上运行。没有“默认后端”。

答案 1 :(得分:0)

我知道已经晚了,但是有人可能也有类似的情况。

就我而言,下一个问题是

执行curl命令时:

curl http://<ip-address>:<k8s-svc-port> -H 'Host:foo.com'

HTTP请求类似于:

GET / HTTP/1.1
Host: foo.com
User-Agent: curl/7.64.0
Accept: */*

在浏览器中执行时,http请求如下所示: firefox http request example

Host: foo.com:32009
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
...

这就是区别,因为haproxy入口控制器将查找http请求的主机字段。在这种情况下,
-curl设置标头 Host:foo.com
-浏览器设置标头 Host:foo.com:32009 ,而haproxy无法识别该标头
(haproxy期望 foo.com 并获得 foo.com:32009

因此,入口控制器工作正常,这是浏览器的http请求造成了问题。

我希望这会有所帮助。