【发布时间】:2019-02-15 03:42:13
【问题描述】:
我们有一个由 kubernetes 入口创建的 HTTP(s) Load Balancer,它指向由运行 nginx 和 Ruby on Rails 的一组 pod 形成的后端。
查看负载均衡器日志,我们发现越来越多的请求的响应代码为0 和statusDetails = client_disconnected_before_any_response。
我们正试图了解他发生这种情况的原因,但我们没有发现任何相关信息。 nginx 访问或错误日志中没有任何内容。
这发生在从 GET 到 POST 的多种请求中。
我们还怀疑,有时尽管请求记录了该错误,但请求实际上已传递到后端。例如,我们看到 PG::UniqueViolation 错误,这是由于在我们的注册端点中向后端发送了两次相同的注册请求。
任何形式的帮助将不胜感激。谢谢!
更新 1
根据请求的 here is the yaml 入口资源文件:
更新 2
我创建了一个基于日志的 Stackdriver 指标,以计算出现此行为的请求数。这是图表:
大峰值与这些 kubernetes 事件的时间戳大致匹配:
完全错误:Readiness probe failed: Get http://10.48.1.28:80/health_check: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"
因此,后端后面的 pod 的就绪性探测似乎有时会失败,但并非总是如此。
这里是readinessProbe的定义
readinessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: X-Forwarded-Proto
value: https
- name: Host
value: [redacted]
path: /health_check
port: 80
scheme: HTTP
initialDelaySeconds: 1
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
【问题讨论】:
-
您能否将负载均衡器的 yaml 添加到您的问题中?
-
您的后端似乎无法与您的客户对话。您的集群上有任何传出流量规则吗?
-
@mstorkson 为入口添加了 yaml
-
@rico 请注意,并非所有请求都发生这种情况,仅针对其中一些请求(我会说少于 1% 或 5%),所以我不认为这是传出流量防火墙规则的问题。
-
这些事件是否会随着流量的增加而变得更加频繁?这个负载均衡器服务了多少个 Pod?你的节点的空闲内存/cpu 怎么样?
标签: kubernetes google-kubernetes-engine kubernetes-ingress google-cloud-networking