如何最好地在kubernetes集群中运行一次性迁移任务

在将新版本的应用程序部署到Kubernetes集群之前,我想要运行数据库迁移。 我希望这些迁移作为持续交付pipe道的一部分自动运行。 迁移将被封装为一个容器映像。 什么是实现这一目标的最佳机制?

解决scheme的要求:

  • 能够确定迁移是否失败,以便我们随后不尝试将新版本的应用程序部署到群集中。
  • 放弃如果迁移失败 – 不要继续重试。
  • 能够访问日志来诊断失败的迁移。

我曾经假设Kubernetes中的Jobsfunction会让这一切变得简单,但似乎有一些挑战:

  • Kubernetes会反复重新运行进程以非零退出代码终止的容器 ,即使作业有never
  • 阻塞等待排队工作的结果似乎需要手卷脚本

会使用“裸荚”是一个更好的方法? 如果是这样的话,那会怎样呢?

您可以尝试通过执行以下操作使迁移作业和应用程序彼此独立:

  • 即使迁移失败,迁移作业也能成功返回。 将机器消耗logging保存在迁移结果的什么地方。 这可以通过显式地(通过将最新的模式版本写入某个数据库表字段)或隐式地(假设某个字段必须在成功的迁移作业中创build)来完成。 如果由于技术原因(迁移应用于数据库的不可用)导致迁移作业将只返回错误代码。 这样,您可以通过Kubernetes Jobs进行迁移,并最终依靠其运行完成的能力。
  • 构build新的应用程序版本,使其可以在迁移前阶段和迁移后阶段与数据库一起工作。 这意味着什么取决于您的业务需求:应用程序可能会变成闲置状态,直到迁移成功完成,或者可能会根据当前阶段向客户端返回不同的结果。 这里的关键是应用程序处理先前生成的迁移作业的迁移结果,并相应地执行而不会错误地终止。

结合这两种devise方法,您应该能够相互独立地开发和执行迁移作业和应用程序,而不必引入任何时间耦合。

这个想法实际上是否合理取决于您的案例的更具体的细节,例如数据库迁移工作的复杂性。 如上所述,另一种方法是将非托pipe的pod简单地部署到执行迁移的集群中。 这需要更多布线,因为您需要定期检查结果并区分成功和失败的结果。