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

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

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

现在让我们想象我需要更改应用程序容器的图像。 我更改了部署定义文件,并执行kubectl apply -f deplyment.yml ,我可以看到Kubernetes尝试实施更改。

但问题是,它试图运行新的pod而不是旧的pod,并优雅地将负载路由到它上面,但是新的pod不能运行,因为卷被安装在旧的pod中,并且在旧的容器closures之前无法挂载。

所以这是问题。 我无法理解如何不中断地进行这样的升级。 应用程序无法进行负载平衡,因此无法运行多个副本并逐一升级。 而且我也担心,如果我删除了部署(将尝试有效地删除所有连接到的部分),那么卷也可能被删除。

有什么好方法吗?

分开数据库和你的应用程序。

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

另一个部署(或StatefulSet)拥有mongoDB。 这确实使用存储。 但是你很less需要更新mongodb,所以不会经常中断。