如果我浏览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.
答案 0 :(得分:24)
经过大量挖掘后,我找到了答案: 根据此处的要求:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/cluster-loadbalancing/glbc#prerequisites应用程序必须在'/'处返回200状态代码。因为我的应用程序返回302(重定向到登录),所以运行状况检查失败。当运行状况检查失败时,入口资源返回502。
答案 1 :(得分:4)
我只是想用一个更具体的解释来补充已接受的答案,为什么需要对/
进行健康检查,即使可以设置livenessProbe
和readinessProbe
并进行容器中的容器。
我本来以为他们是同一回事,但事实并非如此。
kubernetes引擎使用这些探针来管理服务中的各个容器。而/
上的运行状况检查处于服务级别,并且是GCP 负载均衡器合同的一部分。每秒与kubernetes或容器无关。
使用GKE的原因是GCP负载平衡器是默认的入口控制器。如docs中所述,GCP负载平衡器要求后备服务在200
上返回/
,以检查它们是否存在,以便可以管理要路由到的服务。这无法配置,您只需要这样做。
可能的是,如果您使用其他入口控制器(例如nginx控制器),则可以配置它。但是,使用开箱即用的GCP负载均衡器,您只需要这样做。它是对可能在服务内部的容器中配置的任何livenessProbe
和readinessProbe
的补充,并且与它们完全无关。
答案 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的主节点。 我只是用
删除了podkubectl delete pod nginx-ingress-controller-95db98cc5-rp5c4 -n ingress-nginx
,并将其重新安排到工作程序节点。 而已。 502错误消失了