Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes滚动部署和数据库迁移_Kubernetes_Database Migration - Fatal编程技术网

Kubernetes滚动部署和数据库迁移

Kubernetes滚动部署和数据库迁移,kubernetes,database-migration,Kubernetes,Database Migration,在处理带有数据库迁移的滚动更新时,kubernetes如何处理这个问题 例如,我有一个从app-v1更新到app-v2的应用程序,其中包括一个修改现有表的迁移步骤。因此,这意味着一旦部署rails应用程序,我就需要运行类似于db:migrate的程序 在3个副本集上进行滚动部署时。它将从一个吊舱部署到另一个吊舱。可能会导致没有新版本应用程序的豆荚破裂 虽然这种情况并不经常发生。很可能会。我想了解此场景的最佳/推荐方法。防止旧版本崩溃的一种方法是将迁移拆分为多个步骤 例如,您希望重命名数据库中的列

在处理带有数据库迁移的滚动更新时,kubernetes如何处理这个问题

例如,我有一个从app-v1更新到app-v2的应用程序,其中包括一个修改现有表的迁移步骤。因此,这意味着一旦部署rails应用程序,我就需要运行类似于
db:migrate
的程序

在3个副本集上进行滚动部署时。它将从一个吊舱部署到另一个吊舱。可能会导致没有新版本应用程序的豆荚破裂


虽然这种情况并不经常发生。很可能会。我想了解此场景的最佳/推荐方法。

防止旧版本崩溃的一种方法是将迁移拆分为多个步骤

例如,您希望重命名数据库中的列。直接重命名该列将破坏应用程序的旧版本。这可以分为多个步骤:

  • 添加插入新列的db迁移
  • 更改应用程序,以便所有写入都转到旧列和新列
  • 运行将所有值从旧列复制到新列的任务
  • 更改从新列读取的应用程序
  • 添加删除旧列的迁移

不幸的是,这是一个相当麻烦的问题,但它可以防止在维护页面打开时出现停机。

Kubernetes不以本机方式处理数据库迁移的滚动更新。这是特定于应用程序的,因此应用程序开发人员必须处理它。您可能需要执行与在非k8s设置中相同的操作

无论如何,我会这样做:

  • 将复制副本扩展到1
  • 更新图像
  • 将副本扩展到3个
这不是傻瓜式的,但不涉及代码更改。在db:migrate步骤和实际侦听服务器之间有一个小窗口,在该窗口中,请求将发送到旧副本(新副本准备就绪后将立即终止)。该请求可能会失败,也可能不会失败,这取决于代码块是否与模式更改直接相关


如果我不太关心停机时间,那么我只会使用重新创建策略。

我最近解决了这个问题,下面是我的方法:

  • 用于存储通常需要在部署之前或之后运行的命令
  • 创建一个脚本,该脚本将能够按名称读取部署,然后创建一个作业来运行部署批注中指定的命令
  • 将图像推送到docker注册表时,添加一个webhook,该webhook将调用上一点中指定的脚本
  • 要避免不兼容的数据库结构出现问题,请执行以下操作:
    • 不要以向后不兼容的方式修改db列
    • 不要在迁移中立即删除未使用的列。您可以在下一版本中执行此操作。这样你就只有一个了 将在部署之前运行的迁移脚本

另外,为了能够在脚本中使用Kubernetes,您可能需要熟悉以下链接:,,。

这是一篇很好的文章,解释了这个想法:这听起来很有希望,但我不确定我是否理解第3点。你能提供一个这样做的例子吗?@Gregferri不幸的是,我为其编写的应用程序不是开源的,但我在golang中编写了它,在Kubernetes(读/写部署和作业)中授予了访问权限,它作为http守护进程进行侦听并执行所描述的操作。