在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知道如何将传入的请求从旧示例引导到新示例,这看起来比必要的更冗余和复杂,所以我不想那样。
2条答案
按热度按时间brc7rcf01#
在进行滚动更新时,我希望以前的statefulset pod在仍有长时间运行的请求在处理时停留,但我希望新的流量进入statefulset中的新pod。
Kubernetes pod支持这种行为,但您还需要在应用程序中实现对它的支持。
SIGTERM
信号将被发送到pod -您的应用程序可能希望侦听此信号并执行一些操作。请注意,您应该连接到 services,而不是直接连接到 * pod *,这样才能正常工作。例如,您需要为StatefulSet中的副本创建headless服务。
如果你的客户端正在连接到特定的 *headless服务 *,例如
N
,这意味着在升级期间,该服务将在一段时间内不可用。你需要决定你的客户端是否应该在此时间段内重试其连接 *,或者 * 如果N
不可用,则它们是否应该连接到另一个 *headless服务 *。有关详细信息,请参见Kubernetes best practices: terminating with grace。
flseospp2#
您可以使用Container Lifecycle Hooks(特别是
preStop
挂钩)来完成此操作。我们使用此功能在Varnish服务终止之前排出连接。
但是,您需要实现(或找到)一个脚本来执行排空操作。