提问人:Rawit_S 提问时间:11/28/2022 更新时间:11/28/2022 访问量:821
kubernetes 中的 pod 有可能在服务进程成功之前终止吗?
It is possible pod in kubernetes terminate before service process success?
问:
嗨,我对通过 kubernetes 容器的 golang 微服务有疑问。示例:我有 2 个代号 A 和 B 的部署。
- A 有 1 个 pod 执行发送请求以在 B 服务中创建文档。
- B 在 1 - 5 个 pod 之间具有自动缩放配置,等待来自 A 的请求,并处理在许多集合中创建文档的过程。
有时服务 A 从服务 B 出现错误“EOF”,我去检查服务 B 的登录,找不到使 pod 终止或从 kubectl 终端崩溃循环回退状态的错误,就像服务 B 一样,只是停止运行此进程。
我想知道错误“EOF”的原因是关于 B 服务中的自动缩放配置,据我所知,B 服务的高流量必须将 pod 扩展到 5 个 pod,但是当流量下降时,pod 也必须缩减。
如果 pod 中工作的任何进程在进程成功之前终止,是否有可能缩小它?
答:
当 Pod 终止(由于缩减)时,它们会收到一个术语信号,并从负载均衡器中取消注册。在您的案例中,问题可能是正在运行的进程立即终止,连接被关闭。您可以尝试使用容器的 preStop 生命周期钩子来规避这个问题,即在 Pod 终止之前给正在运行的进程时间完成。
lifecycle:
preStop:
exec:
command:
- "sleep"
- "10"
使用此钩子,在缩小规模时,Pod 将立即从负载均衡器中取消注册,从而阻止它接收进一步的请求,并且将执行 preStop 生命周期钩子。在这种情况下,它只需等待 10 秒。只有在钩子完成后,容器才会接收到术语信号。
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
确保您的服务 B 可以正常关闭。
在缩小或删除时,Pod 将首先收到 TERM 信号。然后,在宽限期过后,它将在需要时发送 KILL。
您的服务应遵循 TERM 并停止所有内部进程(在您的情况下为 goroutines),然后终止。如果您管理,则不需要 KILL 信号。
它在 Pod 生命周期文档中进行了描述
评论