如何避免K8s在大迁移中杀掉pod

问题描述 投票:0回答:1

我们正在进行一个迁移项目,希望将数百万个文档从一个 mongo 集合迁移到另一个(或者在某些情况下向现有文档添加新字段)。在测试过程中,我们发现当操作时间超过 10 分钟(这是预期的)时,K8s 会杀死 pod,因为 pod 的健康检查未通过。

我错过了什么吗?在进行如此大规模的迁移时是否有可以遵循的最佳实践?我们预计一次迁移将持续长达 3-4 小时。

mongock
1个回答
0
投票

我了解您希望部署 pod,以便它在启动时运行迁移,在迁移运行时保持 pod 处于活动状态,但在过程完成之前不使其可供使用,这意味着 Kubernetes 不会发送流量到它。

首先,我想让您知道,在 Mongock 的下一个主要版本中,将有一个专门设计用于处理长迁移的功能。不过,由于此功能目前不可用,我建议使用以下方法。

这里的关键思想是使用两个主要的 Kubernetes 探测器(活跃度和就绪度)来控制 pod 的状态。您可以将就绪探针设置为返回“NOT READY”,直到迁移完成,而活性探针继续返回“ALIVE”,除非 Mongock 遇到故障。

这种方法意味着,从技术上讲,您的 API 将在迁移完成之前运行,但实际上不会接收流量,因为 Kubernetes 只会在迁移成功完成后才认为 Pod 已准备好,从而导致您的 API 在实践中不可用。

要实现这一点,您可能需要异步运行 Mongock,从而允许 Kubernetes 检查 API 以及活跃性和就绪性端点。在此过程中,您应该监视 Mongock 的状态以确定活动和就绪探针的正确响应。为了管理 Mongock 的状态,您可以使用 Mongock 事件。

您可能会考虑使用启动探针,因为它似乎适合这种情况。但是,这需要设置较长的 failureThreshold,这并不理想,因为它不可靠,而且还可能影响其他部署并引入潜在的安全风险。

© www.soinside.com 2019 - 2024. All rights reserved.