Kubernetes best practices: terminating with grace

https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace 

Kubernetes 终止生命周期


Kubernetes 所做的不仅仅是监控应用程序的崩溃。它可以创建应用程序的更多副本以在多台机器上运行、更新应用程序,甚至可以同时运行应用程序的多个版本

这意味着 Kubernetes 可能会终止一个完全健康的容器的原因有很多。如果您使用滚动更新来更新您的部署,Kubernetes 会在启动新 Pod 的同时缓慢终止旧 Pod。如果您排空一个节点,Kubernetes 会终止该节点上的所有 pod。如果节点耗尽资源,Kubernetes 会终止 pod 以释放这些资源(查看上一篇文章以了解有关资源的更多信息)。重要的是您的应用程序要优雅地处理终止,以便对最终用户的影响最小,并且恢复时间尽可能快!

实际上,这意味着您的应用程序需要处理SIGTERM消息并在收到它时开始关闭。这意味着保存所有需要保存的数据、关闭网络连接、完成任何剩余的工作以及其他类似任务

一旦 Kubernetes 决定终止您的 pod,就会发生一系列事件。让我们看看 Kubernetes 终止生命周期的每个步骤

1 - Pod 设置为“终止”状态并从所有服务的端点列表中删除

此时,Pod 停止获取新流量。在 pod 中运行的容器不会受到影响。

2 - preStop Hook 被执行

preStop 恢复时间是发送到 pod 中的容器的特殊命令或 http 请求。

如果您的应用程序在收到 SIGTERM 时没有正常关闭,您可以使用此挂钩来触发正常关闭。大多数程序在收到 SIGTERM 时会正常关闭,但如果您使用第三方代码或正在管理您无法控制的系统,preStop 挂钩是在不修改应用程序的情况下触发正常关闭的好方法。

3 - SIGTERM 信号被发送到 pod

扫描二维码关注公众号,回复: 14374477 查看本文章

此时,Kubernetes 会向 pod 中的容器发送 SIGTERM 信号。这个信号让容器知道它们很快就会被关闭。

您的代码应该监听此事件并在此时开始干净地关闭。这可能包括停止任何长期存在的连接(如数据库连接或 WebSocket 流)、保存当前状态或类似的任何事情

即使您使用的是 preStop 钩子,如果您向其发送 SIGTERM 信号,测试应用程序会发生什么也很重要,因此您在生产中不会感到惊讶!

4 - Kubernetes 等待宽限期

此时,Kubernetes 会等待一段称为终止宽限期的指定时间。默认情况下,这是 30 秒。需要注意的是,这与 preStop 钩子和 SIGTERM 信号并行发生。Kubernetes 不会等待 preStop 挂钩完成。

如果您的应用程序在 TerminationGracePeriod 完成之前完成关闭并退出,Kubernetes 将立即进入下一步。

如果您的 pod 通常需要超过 30 秒才能关闭,请确保增加宽限期。您可以通过在 Pod YAML 中设置 terminateGracePeriodSeconds 选项来做到这一点。例如,要将其更改为 60 秒:

5 - 向 pod 发送 SIGKILL 信号,并移除 pod

如果容器在宽限期后仍在运行,则会向它们发送 SIGKILL 信号并强制删除它们。此时,所有 Kubernetes 对象也都被清理干净了。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/125759373