使用数据库迁移处理滚动更新时,kubernetes如何处理此问题?
对于一个实例 - 我有一个应用程序从app-v1更新到app-v2,其中包括一个用于更改现有表的迁移步骤。所以这意味着它要求我在部署后为rails app运行类似descendant
的内容。
在3副本集上进行滚动部署时。它将从一个pod部署到另一个pod。可能允许没有新版本应用程序的POD中断。
虽然这种情况不是经常发生的事情。它很可能会。我想了解这种情况的最佳/推荐方法。
答案 0 :(得分:11)
防止旧版本破坏的一种方法是将迁移拆分为多个步骤。
E.g。您想要重命名数据库中的列。直接重命名列会破坏应用程序的旧版本。这可以分为多个步骤:
不幸的是,这很麻烦,但可以防止维护页面停机。
答案 1 :(得分:5)
Kubernetes本身不会使用db迁移本地处理滚动更新。这是特定于应用程序的,因此应用程序开发人员必须处理它。您可能必须执行与非k8s设置相同的操作。
无论如何,我这样做的方式是:
这不是万无一失的,但不涉及代码更改。 db:migrate步骤和实际服务器侦听之间有一个小窗口,其中请求将转到较旧的副本(一旦新副本准备就会终止)。该请求可能会失败,也可能不会失败,具体取决于代码块是否与架构更改直接相关。
如果我不太关心停机时间,那么我只会使用重新创建策略。
答案 2 :(得分:3)
我最近解决了这个问题,这是我的方式:
P.S。为了能够在您的脚本中使用Kubernetes,您可能希望熟悉以下链接:Kubernetes API,Kubernetes API Overview,Access Clusters Using the Kubernetes API,Client Libraries。