有没有可能pod在kubernetes服务进程成功之前终止?

brccelvz  于 2022-12-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(134)

你好,我有一个关于通过kubernetes容器的golang微服务的问题。例如,我有两个代码名为A和B的部署。

  1. A让1个pod发送请求,以在B服务中创建文档。
  2. B具有1 - 5个pod之间自动缩放配置,等待来自A的请求,并处理在多个集合中创建文档。
    有时服务A从服务B中出现错误“EOF”,我检查服务B中的日志,无法从kubectl终端中找到导致pod终止或崩溃回路回退状态的错误,就像服务B一样,只是停止运行此进程。
    我想知道错误“EOF”的原因是关于B服务中的自动缩放配置,在我的理解中,B服务的高流量必须将pod放大到5个pod,但当流量下降时,pod也必须缩小。
    是否有可能在pod中工作的任何进程在进程成功之前终止,从而缩小pod?
ulmd4ohb

ulmd4ohb1#

当单元终止(由于缩小)时,它们会收到期限信号并从负载平衡器中注销。在您的情况下,问题可能是正在运行的进程被立即终止,连接被关闭。您可以尝试使用容器的preStop生命周期挂接来避免该问题,即在单元终止之前为正在运行的进程提供完成时间。

lifecycle:
    preStop:
      exec:
        command:
          - "sleep"
          - "10"

使用此挂接,在按比例缩小时,Pod将立即从负载平衡器中取消注册,以防止它接收更多请求,并将执行preStop生命周期挂接。在这种情况下,它只等待10秒。只有在挂接完成后,容器才会收到期限信号。
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

1qczuiv0

1qczuiv02#

确保服务B可以正常关闭。
在按比例缩小或删除时,吊舱将首先接收到一个TERM信号。然后,在一段宽限期后,如果需要,它将发送一个KILL。
你的服务应该尊重TERM,停止所有的内部进程(在你的例子中是goroutine),然后终止。如果你进行管理,就不需要KILL信号了。
Pod生命周期文档中对此进行了描述

相关问题