我正在探索 Kubernetes 工具集,现在我的专用 3 节点集群已经启动并运行。
下一步是将我们公司的项目迁移到集群。由于我们使用 MongoDB 和 ElasticSearch,并希望在集群内托管多个项目,我不确定如何正确处理持久性。
我将使用 glusterfs 直接在节点上运行复制(而不是在 kubernetes 中),并使用以下方式将卷安装到 pod 中:
https://github.com/kubernetes/examples/tree/master/staging/volumes/glusterfs
我应该将 MongoDB 安装为 ReplicaSet 吗直接地在节点以及或运行一MongoDB 实例对于每个项目在相应的 pod 内使用 glusterfs 进行复制存储和备份?
作为一项要求,一个(工作)节点的丢失应该允许在其他节点上运行丢失的 pod,而不会丢失数据。
我应该如何在多个节点之间保存数据库数据?即使是复制(MongoDB ReplicaSet eq)也需要每个 pod 的持久存储。
答案1
好吧,经过一番研究,我发现这篇文章很有帮助:
https://portworx.com/ha-mongodb-kubernetes/
他们使用 portworx 作为 sds 但 gluster 也可以工作。
因此,我打算采用的解决方案是在单独的 pod/容器中运行每个项目的数据库。在我们的 3 节点集群中,我将复制数据库卷,但一次只运行一个数据库实例。这样,故障转移和在另一个节点上启动数据库容器就根本不是问题了。
当我们向集群添加更多节点或应用程序需要更多数据库实例以实现更好的扩展时,我将为每个数据库实例提供一个复制卷,并使用 ReplicaSet 连接数据库。
答案2
我建议使用自定义运算符来处理 Kubernetes 上的数据库等有状态应用。处理有状态应用时,有很多方法可能会让你自食其果。
看看 kubedb.com,他们有 ElasticSearch 和 MongoDB 的运算符。自定义运算符以编程方式处理复制、处理 pod 故障(例如提升新主节点)、扩展等。
蒙戈->https://kubedb.com/docs/0.8.0-beta.0/guides/mongodb/overview/
弹性搜索 ->https://kubedb.com/docs/0.8.0-beta.0/guides/elasticsearch/overview/
当然,在考虑投入生产之前,您应该部署一个暂存版本并根据您的工作负载进行测试。