【发布时间】:2020-10-27 07:20:33
【问题描述】:
我在 Kubernetes 集群中部署了一个有状态的应用程序。现在的挑战是我如何以优雅的方式缩减集群,以便每个 pod 在终止时(在缩减期间)完成它的待处理任务,然后优雅地关闭。该场景类似于下面解释的场景,但在我的情况下,终止的 pod 将有很少的飞行任务需要处理。
https://medium.com/@marko.luksa/graceful-scaledown-of-stateful-apps-in-kubernetes-2205fc556ba91
我们是否有来自 kubernetes api 的官方功能支持。
Kubernetes version: v1.11.0
Host OS: linux/amd64
CRI version: Docker 1.13.1
更新:
可能的解决方案 - 在执行 statefulset 缩减时,终止 pod(s) 的 preStop 挂钩将向队列发送消息通知,其中包含相应的元数据详细信息。待完成的任务。之后使用 K8 Job 完成任务。如果从 K8 的角度来看同样是推荐的方法,请发表评论。
提前致谢!
问候, 巴鲁
【问题讨论】:
-
这在StatefulSet documentation 中至少有简短的讨论:
pod-n不会开始终止,直到pod-n+1完全停止。到目前为止你有什么,什么没用? -
亲爱的大卫,这一点已经理解,我的具体问题是 pod 在终止时如何完成它们的待处理任务。例如:- 使用 3 个副本的 statefulset 集群,而我缩减到 2 个副本,我的 pod-3 在终止时如何确保所有待处理的任务(标记到 pod-3)都已完成。
-
Termination of Pods 是另一个关键文档链接。您的服务获得 SIGTERM 并且(默认情况下)有 30 秒完成;完成待处理的任务并结束进程,或者获得 SIGKILL 并强制终止。
-
preStop 钩子是我尝试过的,但预测终止GracePeriodSeconds 是一个挑战,因为我不知道待处理任务完成所需的确切时间(因为它可能会不时变化)。跨度>
标签: kubernetes kubernetes-pod kubernetes-statefulset