是否有一种设计模式可以定期更新 kubernetes 中的数据库而不会出现不一致?

Is there a design pattern to periodically update a database in kubernetes without inconsistency?

我在 Kubernetes 集群中有一个简单的 Node.js API 服务,它连接到 MongoDB。此应用程序将清除数据库中的所有数据,并每十分钟用新数据填充一次。

在我当前的设置中,我有一个用于 API 的 NodePort 服务和一个用于数据库的 ClusterIP 服务。我认为只要有服务,一切都很好。但是,恐怕如果Node.jspods的数量不是一个,而是说10个,它会在10个不同的时间删除和上传数据库。

有没有办法保证不管有多少Node.jspods这个数据库每10分钟删除和上传一次?

我看到了两种方法,但都需要一些代码更改:

  1. 定义一个环境变量以启用删除作业并将您的部署分成两部分:一个部署单个副本并启用删除,另一个部署包含所有其他副本但禁用删除。

  2. 使用 statefulset 和 运行 仅在第一个 pod 上删除。您可以通过检查每个 pod 上始终相同的 pod 名称来执行此操作,例如第一个 pod 的“myapp-0”。

这两种情况都解决了你的问题,但不是那么优雅。更符合 kubernetes 设计的是从代码中删除“每 10 分钟删除一次”并将删除代码放在 CLI 命令中。然后创建一个 kubernete CronJob,它将 运行 每 10 分钟执行一次此命令。通过这种方式,您可以保持单一、“干净”的部署,并且可以从 kubernetes cronjobs 获得所有可见性、功能和保证。