在Kubernetes中运行MongoDB已成为常态。在Kubernetes中运行数据库的最常见用例是:
- 创建专用数据库即服务(DBaaS)。
- 维护一致的基础设施,使数据库和应用程序在同一平台上运行。
- 避免供应商锁定,并能够利用Kubernetes和容器的强大功能在任何地方运行其数据库。
有多种解决方案允许您在Kubernetes中运行MongoDB,在本文中,我们将比较这些解决方案,并回顾它们各自的优缺点。
我们将审查的解决方案包括: - Bitnami Helm图表
- KubeDB
- MongoDB社区运营商
- MongoDB的Percona操作员
摘要和比较表可在我们的文档中找到。
Bitnami Helm图表
Bitnami于2019年被VMWare收购,以在Kubernetes部署各种应用程序而闻名。这里的关键词是部署,因为此解决方案中没有管理功能。
所有Bitnami Helm图表都在Apache 2.0许可证下,纯开源。Bitnami周围的社区相当大,非常活跃。
部署
安装通常分为两步:添加Helm存储库,然后部署图表。
添加存储库:
$ helm repo add bitnami https://charts.bitnami.com/bitnami
您可以通过值调整图表安装。我决定试用它,并部署一个副本集,而不是默认的独立设置:
$ helm install my-mongo bitnami/mongodb --set architecture="replicaset" --set replicaCount=2
此命令部署一个MongoDB副本集,其中包含两个节点和一个仲裁器。
值得注意的是,Github自述并不是唯一的文档,但是官方的Bitnami文档中有更多的示例和细节。
特征
管理功能不是此解决方案的主要部分,但可以水平扩展复制集(向其添加更多节点)和垂直扩展复制集中(向节点添加更多资源)。
mongodb exporter将监控表示为一个sidecar。度量参数部分对此进行了描述。这是一种简单的方法,对于大多数用例来说已经足够了。
我喜欢所有Bitnami Helm图表的地方在于,它们为您提供了很多灵活性,可以调整Kubernetes原语和组件:标签、注释、图像、资源等等。
如果我们研究该解决方案中与MongoDB相关的功能,有几个值得注意:
1.在数据库资源调配期间创建用户和数据库。这有点奇怪,您无法立即创建角色并分配它们。但这是一个不错的举动。
2.隐藏节点––在本文的任何其他解决方案中都找不到它。
3.TLS––您可以加密副本集节点之间的流量。很好的移动,但由于某些原因,它在默认情况下被禁用。
我没有找到任何关于支持的MongoDB版本的信息。最新的Helm chart版本部署了MongoDB 5.0。
您可以部署分片集群,但它是一个单独的掌舵图——MongoDB分片。但是,您仍然无法轻松将其与企业解决方案集成——比如LDAP或Hashicorp vault。至少这不会是一个简单的集成。
KubeDB
由AppsCode创建的KubeDB是一家瑞士军刀运营商,负责在Kubernetes部署各种数据库,包括MongoDB。
此解决方案遵循开放核心模型,在该模型中,免费提供有限的功能,但在购买许可证后会有一些好东西。在这里,您可以找到社区版本与企业版本的比较。
我们的审查重点将放在社区版本上,但我们将提到企业版本中提供的功能。
部署
我发现部署有点麻烦,因为它需要先下载许可证,即使对于社区版本也是如此。
添加Helm repo:
$ helm repo add appscode https://charts.appscode.com/stable/
安装操作器:
$ helm install kubedb appscode/kubedb \
--version v2022.05.24 \
--namespace kubedb --create-namespace \
--set-file global.license=/path/to/the/license.txt
使用下面的命令部署数据库。值得一提的是,使用社区版本,您只能在演示名称空间中部署数据库。
Shell
$ kubectl create -f https://github.com/kubedb/docs/raw/v2022.05.24/docs/examples/mongodb/clustering/mongo-sharding.yaml
这将部署一个分片集群。您可以在github中找到大量示例。
特征
社区版几乎没有管理功能。您可以添加和删除资源和节点,因此只需执行基本的缩放,而无需执行其他操作。
备份、恢复、升级、加密等都仅在企业版中提供。
对于监控,KubeDB采用与Bitnami相同的方法,允许您将mongodb导出器容器部署为sidecar。在这里阅读更多。
当然,社区版的功能有限,不足以在生产中运行。同时,还有一些有趣的功能:
- 一个操作员,多个数据库。我喜欢这种方法,因为如果您运行各种数据库风格,它可以简化您的操作环境。
- 选择您的MongoDB版本。您可以轻松找到各种受支持的MongoDB版本,并通过自定义资源选择所需的版本:
$ kubectl get mongodbversions
NAME VERSION DISTRIBUTION DB_IMAGE DEPRECATED AGE
3.4.17-v1 3.4.17 Official mongo:3.4.17 20m
3.4.22-v1 3.4.22 Official mongo:3.4.22 20m
3.6.13-v1 3.6.13 Official mongo:3.6.13 20m
3.6.8-v1 3.6.8 Official mongo:3.6.8 20m
4.0.11-v1 4.0.11 Official mongo:4.0.11 20m
4.0.3-v1 4.0.3 Official mongo:4.0.3 20m
4.0.5-v3 4.0.5 Official mongo:4.0.5 20m
4.1.13-v1 4.1.13 Official mongo:4.1.13 20m
4.1.4-v1 4.1.4 Official mongo:4.1.4 20m
4.1.7-v3 4.1.7 Official mongo:4.1.7 20m
4.2.3 4.2.3 Official mongo:4.2.3 20m
4.4.6 4.4.6 Official mongo:4.4.6 20m
5.0.2 5.0.2 Official mongo:5.0.2 20m
5.0.3 5.0.3 Official mongo:5.0.3 20m
percona-3.6.18 3.6.18 Percona percona/percona-server-mongodb:3.6.18 20m
percona-4.0.10 4.0.10 Percona percona/percona-server-mongodb:4.0.10 20m
percona-4.2.7 4.2.7 Percona percona/percona-server-mongodb:4.2.7-7 20m
percona-4.4.10 4.4.10 Percona percona/percona-server-mongodb:4.4.10 20m
如您所见,它甚至支持用于MongoDB的Percona服务器。
分片。我喜欢社区版附带切分支持,因为它有助于试验和了解此解决方案未来是否适合您的环境。
MongoDB社区运营商
与KubeDB类似,MongoDB Corp遵循开放核心模式。运营商的社区版是免费的,还有一个企业版(MongoDB enterprise Kubernetes Operator),功能更丰富。
部署
Helm chart可用于此操作员,但同时,没有Helm Chard可用于部署自定义资源本身。这使得入职更加复杂。
添加存储库:
$ helm repo add mongodb https://mongodb.github.io/helm-charts
安装操作器:
Shell
$ helm install community-operator mongodb/community-operator
要部署数据库,需要修改此示例并设置密码。完成后,应用它部署三个节点的副本集:
$ kubectl apply -f mongodb.com_v1_mongodbcommunity_cr.yaml
特征
由于MongoDB Community Operator缺乏基本功能:备份和恢复、分片、升级等,因此预计不会有人在生产中运行MongoDB community Oprator。但与此同时,仍然有一些有趣的想法值得一提:
- 用户配置。如这里所述。您可以创建一个MongoDB数据库用户,使用SCRAM对您的MongoDB副本集进行身份验证。创建Secret对象并列出用户及其相应角色。
- 机密中的连接字符串。创建集群后,您就可以获得连接字符串,而无需找出服务端点或获取用户凭据。
"connectionString.standard": "mongodb://my-user:mySupaPass@example-mongodb-0.example-mongodb-svc.default.svc.cluster.local:27017,example-mongodb-1.example-mongodb-svc.default.svc.cluster.local:27017,example-mongodb-2.example-mongodb-svc.default.svc.cluster.local:27017/admin?replicaSet=example-mongodb&ssl=false",
"connectionString.standardSrv": "mongodb+srv://my-user:mySupaPass@example-mongodb-svc.default.svc.cluster.local/admin?replicaSet=example-mongodb&ssl=false",
"password": "mySupaPass",
"username": "my-user"
MongoDB的Percona操作员
最后但并非最不重要的一点是我们的解决方案列表——MongoDB的完全开源Percona操作符。它创建于2018年,经过了多个阶段的改进,于2020年达到GA。最新版本于2022年5月发布。
如果您是Percona客户,您将获得运营商及其部署集群的全天候支持。
部署
部署Percona操作符有多种方法,其中之一就是通过Helm charts。一个用于操作员的图表,另一个用于数据库。
添加存储库:
$ helm repo add percona https://percona.github.io/percona-helm-charts/
部署操作员:
$ helm install my-operator percona/psmdb-operator
部署群集:
$ helm install my-db percona/psmdb-db
特征
运营商利用Percona发行版为MongoDB提供服务,这将立即解锁各种企业功能。运营商本身功能丰富,为用户提供了各种功能,可以简化从常规MongoDB部署到Kubernetes的迁移:分片、仲裁器、备份和恢复等。
我想提及的一些关键特征:
- 自动升级。您可以设置升级时间表,运营商将自动升级MongoDB集群的次要版本,而无需停机操作。
- 时间点恢复。Percona Backup for MongoDB是我们发行版的一部分,在我们的运营商中提供备份和恢复功能,其中包括在您选择的对象存储上存储oplog的能力。在我们的文档中了解更多信息。
- 多集群部署。Percona Operator支持具有跨集群复制能力的复杂拓扑。最常见的用例是灾难恢复和迁移。
结论
选择部署和管理MongoDB的解决方案是一项重要的技术决策,这可能会影响未来的各种业务指标。在这篇博客文章中,我们总结并强调了在Kubernetes中运行MongoDB的各种开源解决方案的优缺点。
需要记住的一点是,您选择的解决方案不仅应该提供一种部署数据库的方法,还应该使您的团队能够执行各种管理和维护任务,而不会淹没在MongoDB的复杂性中。
原文标题:在Kubernetes中运行MongoDB:解决方案、优点和缺点
原文作者:Sergey Pronin
原文链接:https://www.percona.com/blog/run-mongodb-in-kubernetes-solutions-pros-and-cons