你好,我有一个关于通过kubernetes容器的golang微服务的问题。例如,我有两个代码名为A和B的部署。
- A让1个pod发送请求,以在B服务中创建文档。
- B具有1 - 5个pod之间自动缩放配置,等待来自A的请求,并处理在多个集合中创建文档。
有时服务A从服务B中出现错误“EOF”,我检查服务B中的日志,无法从kubectl终端中找到导致pod终止或崩溃回路回退状态的错误,就像服务B一样,只是停止运行此进程。
我想知道错误“EOF”的原因是关于B服务中的自动缩放配置,在我的理解中,B服务的高流量必须将pod放大到5个pod,但当流量下降时,pod也必须缩小。
是否有可能在pod中工作的任何进程在进程成功之前终止,从而缩小pod?
2条答案
按热度按时间ulmd4ohb1#
当单元终止(由于缩小)时,它们会收到期限信号并从负载平衡器中注销。在您的情况下,问题可能是正在运行的进程被立即终止,连接被关闭。您可以尝试使用容器的preStop生命周期挂接来避免该问题,即在单元终止之前为正在运行的进程提供完成时间。
使用此挂接,在按比例缩小时,Pod将立即从负载平衡器中取消注册,以防止它接收更多请求,并将执行preStop生命周期挂接。在这种情况下,它只等待10秒。只有在挂接完成后,容器才会收到期限信号。
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
1qczuiv02#
确保服务B可以正常关闭。
在按比例缩小或删除时,吊舱将首先接收到一个TERM信号。然后,在一段宽限期后,如果需要,它将发送一个KILL。
你的服务应该尊重TERM,停止所有的内部进程(在你的例子中是goroutine),然后终止。如果你进行管理,就不需要KILL信号了。
Pod生命周期文档中对此进行了描述