1

由於健康檢查失敗,我無法讓Ingress在GKE上工作。我已經嘗試了所有我能想到的調試步驟,包括:爲什麼LoadBalancer在GKE上工作時Ingress會失敗?

  • 驗證我不是
  • 驗證的任何配額所剩無幾,我的服務是從集羣
  • 驗證中訪問該我的服務在k8s/GKE負載均衡器後面工作。
  • 已驗證healthz檢查傳入的Stackdriver登錄

......我很想了解如何調試或修復任何建議。以下詳情!


我已經建立了與GKE LoadBalancer類型的服務。通過外部IP的偉大工程:

apiVersion: v1 
kind: Service 
metadata: 
    name: echoserver 
    namespace: es 
spec: 
    ports: 
    - port: 80 
    targetPort: 8080 
    protocol: TCP 
    type: LoadBalancer 
    selector: 
    app: echoserver 

然後我嘗試建立一個入口在這同一服務之上:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: echoserver-ingress 
    namespace: es 
    annotations: 
    kubernetes.io/ingress.class: "gce" 
    kubernetes.io/ingress.global-static-ip-name: "echoserver-global-ip" 
spec: 
    backend: 
    serviceName: echoserver 
    servicePort: 80 

入口被創建,但它認爲後端節點都是不健康的:

$ kubectl --namespace es describe ingress echoserver-ingress | grep backends 
    backends:  {"k8s-be-31102--<snipped>":"UNHEALTHY"} 

檢查在GKE Web控制檯的入口後端的狀態下,我看到了同樣的事情:

0 of 3 healthy

健康檢查細節出現預期:

health check details

...並在我的羣集吊艙內我可以調用成功服務:

# curl -vvv echoserver 2>&1 | grep "< HTTP" 
< HTTP/1.0 200 OK 

# curl -vvv echoserver/healthz 2>&1 | grep "< HTTP" 
< HTTP/1.0 200 OK 

我可以通過NodePort解決該服務:

# curl -vvv 10.0.1.1:31102 2>&1 | grep "< HTTP" 
< HTTP/1.0 200 OK 

(這不用說,是因爲我在步驟1中設置負載平衡器服務,導致在的工作就好了一個網站)

我也看到healthz抽查合格的爲Stackdriver日誌:

enter image description here

有關配額,我檢查,看看我只使用3月30日的後端服務:

$ gcloud compute project-info describe | grep -A 1 -B 1 BACKEND_SERVICES 
- limit: 30.0 
    metric: BACKEND_SERVICES 
    usage: 3.0 
+0

不知道如果這會引起你的問題,但至少在你張貼在這裏的入口是一個錯字,在「kubernetes.io/ingress.class」註釋「kubernetes」與「N」來代替「s」結尾 –

+0

感謝您的密切閱讀 - 只是我的文章中的一個錯字(我更新以解決錯字;問題依然存在)。 – Bosh

+0

您的Ingress部署是否爲HTTP(S)負載均衡器/運行狀況檢查器創建了所需的防火牆規則?有關防火牆規則的詳細信息,請訪問[本文](https://cloud.google.com/compute/docs/load-balancing/http/#firewall_rules)。 – Kamran

回答

0

你的超時值設置爲1秒。也許增加到5秒將解決問題。

+0

該服務在幾ms內響應請求。我看不出1s超時會如何導致這種情況。 – Bosh

0

幾個星期前有類似的問題。爲我解決的問題是在服務描述中添加一個NodePort,以便Google Cloud Loadbalancer可以探測此NodePort。爲我工作的配置:

apiVersion: v1 
kind: Service 
metadata: 
    name: some-service 
spec: 
    selector: 
    name: some-app 
    type: NodePort 
    ports: 
    - port: 80 
     targetPort: 8080 
     nodePort: 32000 
     protocol: TCP 

這可能需要一些時間進入到選擇這個了。您可以重新創建入口以加快速度。

+0

使用的服務類型':每https://kubernetes.io/docs/concepts/services- NodePort'(「NodePort和ClusterIP服務,其外部負載平衡器將路線,自動創建。」:LoadBalancer'意味着'型網絡/服務/#type-loadbalancer,我在上面的日誌中顯示了這一點)。 – Bosh

+0

好點@Bosh我讀過,但比我困惑你爲什麼創建一個LoadBalancer類型和一個入口控制器。 LoadBalancer應該已經給你一個外部IP,但是也許你有一個像SSL這樣的用例。您是否嘗試將NodeB類型的LoadBalancer類型換成只是爲了排除問題? –

+0

我開始使用NodePort並看到相同的行爲;我切換到LoadBalancer,以便我可以記錄在互聯網上運行的服務(並顯示它如何通過LoadBalancer而不是通過Ingress)。 – Bosh

相關問題