我在 Azure 中运行小型 Kubernetes 集群,因此可以使用 Azure 提供的抽象(如存储等)。
在其中,我在一个文件中定义了一个 Deployment 对象,其中包含一个 pod 和几个容器:一个应用程序容器、mongodb 容器和其他一些容器。应用程序一从其映像运行,该映像也包含所有二进制文件,因此它只需要可以访问 mongo 数据库(在第二个容器中)。MongoDB 将其数据存储在持久卷上。
现在假设我需要更改应用程序容器的镜像。我更改部署定义文件并执行kubectl apply -f deplyment.yml
,然后我可以看到 Kubernetes 尝试实施更改。
但问题是,它尝试运行新的 pod 而不是旧的 pod,并将负载优雅地路由到它上面,但是新的 pod 将不会运行,因为卷是安装在旧 pod 中的,并且直到旧容器关闭时它才能安装它。
这就是问题所在。我不明白如何不间断地进行此类升级。该应用程序无法实现负载平衡,因此无法运行多个副本并逐个升级。我还担心,如果我删除部署(这将尝试有效地删除与之连接的所有内容),那么卷也可能会被删除。
有没有什么好办法?
答案1
分离数据库和应用程序。
应用程序容器有自己的部署,不需要持久存储。您现在可以更新和复制此部署。
另一个部署(或 StatefulSet)包含 mongoDB。这确实使用存储。但您很少需要更新 mongodb,因此不会经常出现中断。