Kubernetes Ingress负载均衡器将所有内容重写为索引;为什么?

问题描述:

TL; DR由于某种原因,每个HTTP服务似乎路径改写为/Kubernetes Ingress负载均衡器将所有内容重写为索引;为什么?

我是很新,Kubernetes,并试图建立一个入口负载平衡器。

Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.6", GitCommit:"4bc5e7f9a6c25dc4c03d4d656f2cefd21540e28c", GitTreeState:"clean", BuildDate:"2017-09-14T06:55:55Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"} 
Server Version: version.Info{Major:"1", Minor:"7+", GitVersion:"v1.7.6-gke.1", GitCommit:"407dbfe965f3de06b332cc22d2eb1ca07fb4d3fb", GitTreeState:"clean", BuildDate:"2017-09-27T21:21:34Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"} 

我在谷歌集装箱引擎(GKE)

它的部分工作,这是一件好事,设置了一切。但是,由于某种原因,它会将所有内容都路由到我的服务,就好像请求指向/一样。

这里发生了什么?我的猜测是糟糕的配置。

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: main-ingress 
    annotations: 
    kubernetes.io/ingress.global-static-ip-name: "ingress-main-ip" 
spec: 
    tls: 
    - secretName: cert-main 
    hosts: 
    - api.example.com 
    rules: 
    - host: api.example.com 
    http: 
     paths: 
     - path: /my_service/* 
     backend: 
      serviceName: myService 
      servicePort: main-port 
     - path: /my_service2/* 
     backend: 
      serviceName: myService2 
      servicePort: main-port 

每当我做出api.example.com/my_service/的请求,然后为myService将注册请求从指数来 - 没问题。

https://api.example.com/my_service2/同样的事情都到myService2

但每当我提出一个请求,然后https://api.example.com/my_service/bogus/path/that/should/return/404我的服务似乎认为该请求被在/路径再像以前一样直接。

当然,当我在本地运行myService(这恰好是一个Go http服务器),那么它工作得很好。 要特别清楚:运行这个本地127.0.0.1/bogus/path/that/should/return/404返回404如预期(当然还有其他的API端点也可以)

这里有一个非常奇怪的事情:每当我直接访问的静态IP地址(又名ingress- main-ip,我们只是说它是1.2.3.4),例如http://1.2.3.4/my_service/http://1.2.3.4/my_service2/总是从GKE默认后端返回404,所以我的服务甚至没有路由到。

摘要:

  1. 为什么请求的域版本的所有路由到/
  2. 为什么直接IP请求不能工作?

谢谢你的时间和帮助!

罗伯特是正确的关于第二个问题(非常感谢)

我只是想出了主要的问题,为什么我的所有路径似乎改写为/

原来的路径发送到服务器将入口配置中指定的“路径”指定为实际服务。 因此,例如,尝试做一个GET请求api.example.com/my_service/my_endpoint的时候,我期待my_service先手路径/my_endpoint但它实际上得到充分/my_service/my_endpoint

这似乎是一个在我看来非常糟糕kubernetes副作用,而且路径应该是相对重写的。

无论如何它现在已经修复。我“认为”他们全都被重写为/的原因是由于某种原因(我写入我的代码中的逻辑错误),我的多路复用器捕获每个未知请求并将其发送到我的索引控制器。去搞清楚!

我会回答第二个问题。

非常奇怪的是由于HTTP头“主机”的问题,因为你在规则部分指定它:

rules: 
    - host: api.example.com   <----- THIS 
    http: 
     paths: 
     - path: /my_service/* 
     backend: 
      serviceName: myService 
      servicePort: main-port 
     - path: /my_service2/* 
     backend: 
      serviceName: myService2 
      servicePort: main-port 

所以它的使用将请求路由到正确的服务。如果您的服务控制器是nginx,那么“主机:”是其server_name