【发布时间】:2021-06-23 15:35:09
【问题描述】:
我们最近在 GKE 上运行 Kubernetes 时遇到了问题。 似乎随机地,为我们的前端应用程序服务的 NGINX 前端容器似乎死了。这引起了很大的骚动,因为 nginx-ingress 只会告诉我们存在 HTTP2 协议错误。经过大约一周的动荡,我们终于在 FE 容器的日志中注意到,只要我们遇到 HTTP2 协议错误(在 chrome 中),就会发生此输出:
一旦我们将 nginx-ingress 切换到 HTTP1,就会出现 ERR_CONTENT_LENGTH_MISMATCH 200 的错误,但这仍然是一个误导性错误。
这是我们为感兴趣的人提供的所有配置的要点: gist
至于nginx版本,我尝试了以下:
稳定的高山
稳定
主线高山
1.17.10-高山
所有结果都产生相同的日志集。
我尝试过的事情:
- 更改 FE 的 nginx 版本
- 告诉 nginx-ingress 使用 HTTP 1
- 告诉 nginx-ingress 不要使用 GZIP
- 使用了本网站的所有内容tencent high availability in nginx blog post
- 为整个 nginx-ingress 和每个单独的 child-ingress 打开和关闭代理缓冲
- 在 nginx-ingress 中将 max-temp-file-size 设置为 0
- 在 nginx-ingress 中将 max-temp-file-size 设置为 10M
- 从对上游的请求中删除了 Accept Encoding、Content-Length 和 Content-Type
- 为 FE 容器启用 Gzip
- 将工作进程设置为自动,在 FE 容器中将工作进程设置为 1
- 设置keepalive-timeout为65,在FE容器中设置为15
- 更新了 FE 部署的生命周期 preStop
- 从 FE 部署中将 terminateGracePeriodSeconds 设置为 60(然后将其删除)
在有人问之前:到目前为止,对 nginx-ingress 所做的所有配置都是为了解决 HTTP2 协议错误。显然这些都不起作用,因为如果上游服务器关闭,这无关紧要。
我可以推断的是,虽然 NGINX 正在关闭(为什么,我仍然不知道),但容器本身并未重新启动,因此该 pod 实际上是一个僵尸案例。我该如何 A. 强制重启或 B. 强制 pod 死亡并重生?
当然,如果有人知道为什么 nginx 容器首先被告知要关闭,那也会很有帮助。
另一个可能相关的问题是,有时此部署的副本未启动,容器已准备好,但没有日志或连接。
手动杀死 pod,似乎可以解决这个问题,但这不是真正的解决方案。
集群正在运行 n1-standard-2 节点,并且我们已启用自动缩放,因此 CPU/内存/存储不是(不应该,永远不要说永远)问题。
提前致谢!如果我可以改进这个问题,请发表评论。
编辑 #1:包括我们在 GKE 上。
编辑 #2:我添加了准备就绪和活力探测。我已经使用健康检查路由更新了 nginx FE 服务器。这似乎是一种故障保险,以确保如果内部 nginx 进程停止或什至没有启动,容器将重新启动。但是,如果有人有更好的选择或根本原因,我很想知道!也许我应该为每个 pod 设置特定的 cpu 和内存请求?
【问题讨论】:
-
请告诉我们您是只使用 Kubernetes 还是使用 GKE?
标签: docker nginx kubernetes google-kubernetes-engine nginx-ingress