Ingress给出了502错误

时间:2017-02-07 23:17:19

标签: redirect kubernetes google-cloud-platform

如果我浏览http load balancer example,它在我的Google容器引擎项目中运行正常。当我运行" kubectl描述"后端是"健康"。如果我然后将svc更改为指向我的应用程序的svc,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: app
  labels:
    name: app
spec:
  ports:
  - port: 8000
    name: http
    targetPort: 8000
  selector:
    name: app
  type: NodePort

我正在运行的应用程序是在gunicorn背后的django,并且只是找到负载平衡器而不是NodePort。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: main-ingress
spec:
  backend:
    serviceName: app
    servicePort: 8000

现在,当我运行" kubectl描述"后端被列为" UNHEALTHY"所有对入口IP的请求都给出了502.

  1. 502是不良健康检查的症状吗?
  2. 我需要做些什么才能通过健康检查?我非常确定运行我的应用程序的容器实际上是健康的。我从来没有设置健康检查,所以我假设我必须配置一些未配置的东西,但我的谷歌搜索还没有让我到处找。

4 个答案:

答案 0 :(得分:24)

经过大量挖掘后,我找到了答案: 根据此处的要求:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/cluster-loadbalancing/glbc#prerequisites应用程序必须在'/'处返回200状态代码。因为我的应用程序返回302(重定向到登录),所以运行状况检查失败。当运行状况检查失败时,入口资源返回502。

答案 1 :(得分:4)

我只是想用一个更具体的解释来补充已接受的答案,为什么需要对/进行健康检查,即使可以设置livenessProbereadinessProbe并进行容器中的容器。

我本来以为他们是同一回事,但事实并非如此。

kubernetes引擎使用这些探针来管理服务中的各个容器。而/上的运行状况检查处于服务级别,并且是GCP 负载均衡器合同的一部分。每秒与kubernetes或容器无关。

使用GKE的原因是GCP负载平衡器是默认的入口控制器。如docs中所述,GCP负载平衡器要求后备服务在200上返回/,以检查它们是否存在,以便可以管理要路由到的服务。这无法配置,您只需要这样做。

可能的是,如果您使用其他入口控制器(例如nginx控制器),则可以配置它。但是,使用开箱即用的GCP负载均衡器,您只需要这样做。它是对可能在服务内部的容器中配置的任何livenessProbereadinessProbe的补充,并且与它们完全无关。

答案 2 :(得分:0)

在我们的示例中,values.yaml中将外部端口和内部端口称为5000,但是服务正在侦听3000端口(查看pod日志后才知道),因此已显示502错误的网关。

一旦我将外部端口和内部端口更新为3000,并升级了该特定服务的部署,便可以看到所需的输出。

答案 3 :(得分:0)

在我的情况下,原因是集群崩溃后未运行入口控制器吊舱。 最简单的检测方法是使用

列出入侵
kubectl get ingress

字段地址应填写,在我的情况下为空值

我列出了ingress-nginx名称空间的容器

kubectl get pods -n ingress-nginx

发现该Pod没有运行

NAME                                       READY   STATUS             RESTARTS   AGE
nginx-ingress-controller-95db98cc5-rp5c4   0/1     CrashLoopBackOff   218        18h

原因是,pod计划主端口80忙于外部nginx的主节点。 我只是用

删除了pod
kubectl delete pod nginx-ingress-controller-95db98cc5-rp5c4 -n ingress-nginx

,并将其重新安排到工作程序节点。 而已。 502错误消失了