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

It is possible pod in kubernetes terminate before service process success?

提问人:Rawit_S 提问时间:11/28/2022 更新时间:11/28/2022 访问量:821

问:

嗨,我对通过 kubernetes 容器的 golang 微服务有疑问。示例:我有 2 个代号 A 和 B 的部署。

  1. A 有 1 个 pod 执行发送请求以在 B 服务中创建文档。
  2. B 在 1 - 5 个 pod 之间具有自动缩放配置,等待来自 A 的请求,并处理在许多集合中创建文档的过程。

有时服务 A 从服务 B 出现错误“EOF”,我去检查服务 B 的登录,找不到使 pod 终止或从 kubectl 终端崩溃循环回退状态的错误,就像服务 B 一样,只是停止运行此进程。

我想知道错误“EOF”的原因是关于 B 服务中的自动缩放配置,据我所知,B 服务的高流量必须将 pod 扩展到 5 个 pod,但是当流量下降时,pod 也必须缩减。

如果 pod 中工作的任何进程在进程成功之前终止,是否有可能缩小它?

Go Kubernetes EOF

评论


答:

1赞 user2311578 11/28/2022 #1

当 Pod 终止(由于缩减)时,它们会收到一个术语信号,并从负载均衡器中取消注册。在您的案例中,问题可能是正在运行的进程立即终止,连接被关闭。您可以尝试使用容器的 preStop 生命周期钩子来规避这个问题,即在 Pod 终止之前给正在运行的进程时间完成。

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

使用此钩子,在缩小规模时,Pod 将立即从负载均衡器中取消注册,从而阻止它接收进一步的请求,并且将执行 preStop 生命周期钩子。在这种情况下,它只需等待 10 秒。只有在钩子完成后,容器才会接收到术语信号。

https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

1赞 Andreas Wederbrand 11/28/2022 #2

确保您的服务 B 可以正常关闭。

在缩小或删除时,Pod 将首先收到 TERM 信号。然后,在宽限期过后,它将在需要时发送 KILL。

您的服务应遵循 TERM 并停止所有内部进程(在您的情况下为 goroutines),然后终止。如果您管理,则不需要 KILL 信号。

它在 Pod 生命周期文档中进行了描述

评论

0赞 Rawit_S 11/29/2022
谢谢。我的服务没有正常关闭。我会学会这样做。