2017-10-12 106 views
2

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請求不能工作?

謝謝你的時間和幫助!

回答

1

羅伯特是正確的關於第二個問題(非常感謝)

我只是想出了主要的問題,爲什麼我的所有路徑似乎改寫爲/

原來的路徑發送到服務器將入口配置中指定的「路徑」指定爲實際服務。 因此,例如,嘗試做一個GET請求api.example.com/my_service/my_endpoint的時候,我期待my_service先手路徑/my_endpoint但它實際上得到充分/my_service/my_endpoint

這似乎是一個在我看來非常糟糕kubernetes副作用,而且路徑應該是相對重寫的。

無論如何它現在已經修復。我「認爲」他們全都被重寫爲/的原因是由於某種原因(我寫入我的代碼中的邏輯錯誤),我的多路複用器捕獲每個未知請求並將其發送到我的索引控制器。去搞清楚!

0

我會回答第二個問題。

非常奇怪的是由於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