Kubernetes滚动部署和数据库迁移
在处理带有数据库迁移的滚动更新时,kubernetes如何处理这个问题 例如,我有一个从app-v1更新到app-v2的应用程序,其中包括一个修改现有表的迁移步骤。因此,这意味着一旦部署rails应用程序,我就需要运行类似于Kubernetes滚动部署和数据库迁移,kubernetes,database-migration,Kubernetes,Database Migration,在处理带有数据库迁移的滚动更新时,kubernetes如何处理这个问题 例如,我有一个从app-v1更新到app-v2的应用程序,其中包括一个修改现有表的迁移步骤。因此,这意味着一旦部署rails应用程序,我就需要运行类似于db:migrate的程序 在3个副本集上进行滚动部署时。它将从一个吊舱部署到另一个吊舱。可能会导致没有新版本应用程序的豆荚破裂 虽然这种情况并不经常发生。很可能会。我想了解此场景的最佳/推荐方法。防止旧版本崩溃的一种方法是将迁移拆分为多个步骤 例如,您希望重命名数据库中的列
db:migrate
的程序
在3个副本集上进行滚动部署时。它将从一个吊舱部署到另一个吊舱。可能会导致没有新版本应用程序的豆荚破裂
虽然这种情况并不经常发生。很可能会。我想了解此场景的最佳/推荐方法。防止旧版本崩溃的一种方法是将迁移拆分为多个步骤 例如,您希望重命名数据库中的列。直接重命名该列将破坏应用程序的旧版本。这可以分为多个步骤:
- 添加插入新列的db迁移
- 更改应用程序,以便所有写入都转到旧列和新列
- 运行将所有值从旧列复制到新列的任务
- 更改从新列读取的应用程序
- 添加删除旧列的迁移
不幸的是,这是一个相当麻烦的问题,但它可以防止在维护页面打开时出现停机。Kubernetes不以本机方式处理数据库迁移的滚动更新。这是特定于应用程序的,因此应用程序开发人员必须处理它。您可能需要执行与在非k8s设置中相同的操作 无论如何,我会这样做:
- 将复制副本扩展到1李>
- 更新图像
- 将副本扩展到3个
如果我不太关心停机时间,那么我只会使用重新创建策略。我最近解决了这个问题,下面是我的方法:
- 用于存储通常需要在部署之前或之后运行的命令
- 创建一个脚本,该脚本将能够按名称读取部署,然后创建一个作业来运行部署批注中指定的命令
- 将图像推送到docker注册表时,添加一个webhook,该webhook将调用上一点中指定的脚本
- 要避免不兼容的数据库结构出现问题,请执行以下操作:
- 不要以向后不兼容的方式修改db列
- 不要在迁移中立即删除未使用的列。您可以在下一版本中执行此操作。这样你就只有一个了 将在部署之前运行的迁移脚本
另外,为了能够在脚本中使用Kubernetes,您可能需要熟悉以下链接:,,。这是一篇很好的文章,解释了这个想法:这听起来很有希望,但我不确定我是否理解第3点。你能提供一个这样做的例子吗?@Gregferri不幸的是,我为其编写的应用程序不是开源的,但我在golang中编写了它,在Kubernetes(读/写部署和作业)中授予了访问权限,它作为http守护进程进行侦听并执行所描述的操作。