Kubernetes:如何通过保持挂载存储的部署来部署新版本的容器?

Kubernetes:如何通过保持挂载存储的部署来部署新版本的容器?

我在 Azure 中运行小型 Kubernetes 集群,因此可以使用 Azure 提供的抽象(如存储等)。

在其中,我在一个文件中定义了一个 Deployment 对象,其中包含一个 pod 和几个容器:一个应用程序容器、mongodb 容器和其他一些容器。应用程序一从其映像运行,该映像也包含所有二进制文件,因此它只需要可以访问 mongo 数据库(在第二个容器中)。MongoDB 将其数据存储在持久卷上。

现在假设我需要更改应用程序容器的镜像。我更改部署定义文件并执行kubectl apply -f deplyment.yml,然后我可以看到 Kubernetes 尝试实施更改。

但问题是,它尝试运行新的 pod 而不是旧的 pod,并将负载优雅地路由到它上面,但是新的 pod 将不会运行,因为卷是安装在旧 pod 中的,并且直到旧容器关闭时它才能安装它。

这就是问题所在。我不明白如何不间断地进行此类升级。该应用程序无法实现负载平衡,因此无法运行多个副本并逐个升级。我还担心,如果我删除部署(这将尝试有效地删除与之连接的所有内容),那么卷也可能会被删除。

有没有什么好办法?

答案1

分离数据库和应用程序。

应用程序容器有自己的部署,不需要持久存储。您现在可以更新和复制此部署。

另一个部署(或 StatefulSet)包含 mongoDB。这确实使用存储。但您很少需要更新 mongodb,因此不会经常出现中断。

相关内容