在kubernetes中,有没有一种方法可以让statefulset pod在滚动更新时延迟完成请求?

gev0vcfq  于 2022-12-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(133)

在Kubernetes中,我有一个包含多个副本的statefulset。我将updateStrategy设置为RollingUpdate。我将podManagementPolicy设置为Parallel。我的statefulset示例没有永久卷声明--我使用statefulset作为一种确定性方式将序号0..(N-1)分配给pod的方法。
在进行滚动更新时,我希望以前的statefulset pod在仍有长时间运行的请求在处理时停留,但我希望新的流量进入statefulset中的新pod。
不幸的是,我没有看到这样做的方法--我错过了什么?
因为我不使用卷声明,您可能认为我可以使用部署来代替,但我确实需要每个Pod都有一个确定性序数,即:

  • 在分派新服务请求(传入HTTP请求)时是唯一的
  • 在pod的使用期限内持续存在
  • 从0到(N-1)连续

我能想到的第二个最佳选择是使用类似于zookeeper或etcd这样的工具来单独管理这片土地,使用一些传统的长期投票或领导人选举机制,但考虑到kubernetes已经知道了(或者可以知道)所有必要的比特,并且Kubernetes服务Map知道如何将传入的请求从旧示例引导到新示例,这看起来比必要的更冗余和复杂,所以我不想那样。

brc7rcf0

brc7rcf01#

在进行滚动更新时,我希望以前的statefulset pod在仍有长时间运行的请求在处理时停留,但我希望新的流量进入statefulset中的新pod。
Kubernetes pod支持这种行为,但您还需要在应用程序中实现对它的支持。

  • 新流量不会发送到您的“旧”Pod。
  • 一个SIGTERM信号将被发送到pod -您的应用程序可能希望侦听此信号并执行一些操作。
  • 在一个 * 可配置 * 的“终止宽限期”之后,您的pod将被杀死。

请注意,您应该连接到 services,而不是直接连接到 * pod *,这样才能正常工作。例如,您需要为StatefulSet中的副本创建headless服务。
如果你的客户端正在连接到特定的 *headless服务 *,例如N,这意味着在升级期间,该服务将在一段时间内不可用。你需要决定你的客户端是否应该在此时间段内重试其连接 *,或者 * 如果N不可用,则它们是否应该连接到另一个 *headless服务 *。
有关详细信息,请参见Kubernetes best practices: terminating with grace

flseospp

flseospp2#

您可以使用Container Lifecycle Hooks(特别是preStop挂钩)来完成此操作。
我们使用此功能在Varnish服务终止之前排出连接。
但是,您需要实现(或找到)一个脚本来执行排空操作。

相关问题