为什么LoadBalancer在GKE上工作时Ingress会失败?

问题描述:

由于健康检查失败,我无法让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

你的超时值设置为1秒。也许增加到5秒将解决问题。

+0

该服务在几ms内响应请求。我看不出1s超时会如何导致这种情况。 – Bosh

几个星期前有类似的问题。为我解决的问题是在服务描述中添加一个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