前言
近年来,Kubernetes 受到了越来越多云计算从业者的青睐。随着云原生时代的到来,越来越多的企业开始使用 Kubernetes 来管理他们的应用程序。Kubernetes 是一个容器编排平台,可以方便地将容器化应用程序部署到云上。而 MongoDB 作为一种流行且开源的 NoSQL 数据库,也非常适合在 Kubernetes 集群中进行部署和使用。
本文将介绍在 Kubernetes 集群中部署和使用 MongoDB 的详细过程,包括双活和单活架构的部署和使用。
MongoDB 在 Kubernetes 集群中的部署
基础设施要求
在开始部署 MongoDB 之前,需要明确你的 Kubernetes 环境是否满足以下要求:
- Kubernetes v1.12 或更高版本
- 一个工作节点(或称为 Minion)有至少 2 个 CPU 核心、8GB 内存、20GB 存储空间
- 至少两个工作节点
双活架构的部署
创建 Kubernetes 部署描述文件
下面的 YAML 文件描述了一个在 Kubernetes 集群中创建双活 MongoDB 副本集的部署。
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------------ ----- --------- ------------ ---- ------- --------- - --------- --------- ------- ---- ------- ----- ----------- - ----- ----- ------ ----- ----- - ------------ - --------- --- ------ - -------------- ----- ------------- - ----- ------------------------ ---------- -------- -------- - ----- ------------------------ --------- ----- --------- ------------- ----------------------- -----
关于文件中的一些值,我们有以下解释:
apiVersion
:用于指定 YAML 文件使用的 Kubernetes API 版本。kind
:指定 YAML 文件中的部署资源种类。metadata
: 部署的元数据。name
: 部署名称。selector
: 用于标识与该 Deployment 相关联的 Pod。matchLabels
: 用于关联 Pod 的标签。spec
: 用于描述组成该 Deployment 的 Pod 数量、所需的存储容量、以及镜像等信息。replicas
: Deployment 所需的 Pod 数量。template
: Pod 的模板。containers
: 容器描述。name
: 容器名称。image
: 容器所需镜像名称。args
: 镜像执行时的参数。ports
: 暴露的端口。containerPort
: 容器监听的端口。volumeMounts
: 挂载提供的卷。name
: 提供的卷名称。mountPath
: 将容器虚拟出来的路径挂载到提供的路径下。volumes
: 提供的卷的列表。name
: 提供的卷名称。hostPath
: 挂载主机的路径。path
: 指定要挂载的数据的路径。nodeSelector
: 指定本次 Deployment 部署程序所要求的 worker node。
在 YAML 文件中,将 replicas
设置为 3 将创建 3 个 MongoDB Pod。这些 Pod 将运行 MongoDB 并负责数据的存储。args
选项被设置为小文件(--smallfiles
)(MongoDB 省略了这个选项会启用 mmap)和复制集名称(--replSet
)。
hostPath
卷是 Kubernetes 中的一种卷类型。它允许使用主机上的目录来提供存储,用于数据预加载。在 YAML 示例中,hostPath
卷将使用节点上的 /mnt/data
目录作为数据目录。
部署 MongoDB
使用 kubectl
工具执行以下命令来部署 MongoDB:
kubectl apply -f mongodb-deployment.yaml
部署双活架构
一旦 Pod 开始运行,可以使用 kubectl exec
命令对每个 Pod 输入命令。在其中一个 Pod 中执行以下命令来启动具有三个节点的副本集:
kubectl exec <pod-name> -- mongo --eval 'rs.initiate({_id: "rs0", members: [{_id: 0, host: "mongodb-deployment-0.mongodb:27017"}, {_id: 1, host: "mongodb-deployment-1.mongodb:27017"}, {_id: 2, host: "mongodb-deployment-2.mongodb:27017"}]})'
执行上述命令后,MongoDB 应该自动配置副本集,并在一个 Pod 之间进行通信。
单活架构的部署
在某些情况下,部署双活副本集可能会耗费大量资源。因此,我们聚焦于部署一个单活实例,虽然它无法提供像双活实例那样的容错能力,但它提供了更好的性能和资源利用率。
创建 Kubernetes 部署描述文件
下面的 YAML 文件描述了一个在 Kubernetes 集群中创建单活 MongDB 实例的部署。
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------------------- ----- --------- ------------ ---- ------- --------- - --------- --------- ------- ---- ------- ----- ----------- - ----- ----- ------ ----- ----- - ------------ - ------------- - ------ - ------- ------ - -------------- ----- -------- - ----- ------------------------ --------- ----- --------- ------------- ----------------------- -----
参数说明同双活架构的描述文件。
部署 MongoDB
使用 kubectl
工具执行以下命令来部署 MongoDB:
kubectl apply -f mongodb-deployment-single.yaml
部署单活架构
在 Pod 中执行以下命令来连接 MongoDB:
kubectl exec -it mongodb-deployment-single-0 -- mongo
现在,您已经可以使用 MongoDB 来存储和检索数据。
MongoDB 在 Kubernetes 集群中的使用
创建 Mongo 客户端
使用 Node.js 创建一个 Mongo 客户端。此客户端将使用 Node.js MongoDB 驱动程序,该驱动程序通常称为 mongodb
。以下是一个示例。
const MongoClient = require('mongodb').MongoClient; const client = new MongoClient("mongodb://localhost:27017");
上述代码将创建一个名为 client
的新 MongoClient
对象,该对象将使用 MongoDB 的默认端口 27017 连接到本地 MongoDB 实例。这时,您可以将 client
对象传递给应用程序其它部分,以便后续使用。
连接到 MongoDB
MongoDB 驱动程序使用 connect()
方法来连接到 MongoDB 服务器。以下是一个示例:
client.connect(function(err) { assert.equal(null, err); console.log("Connected successfully to server"); });
该示例中,调用 connect()
方法,它返回一个 Promise
。在 Promise
执行完成后,我们打印 Connected successfully to server
。
插入数据
在 MongoDB 中,可以使用 insertOne()
方法将单个文档插入集合中。以下是一个示例:
-- -------------------- ---- ------- ----- --------------- - ------------ --------- - ----- ---------- - --------------------------- ---------------------- - - - -- ------------- ------- - ----------------- ------ --------------- ----------------- --------------- ------------------- --------------------- - -------- ---- --- ------------- ----------------- --- -
在该示例中,我们定义了一个 insertDocuments()
方法,该方法将使用 collection
对象将文档插入集合中。
请注意,当 Mongo 客户端使用 insertOne()
方法向集合中插入文档时,它将返回一个带有以下两个属性的对象,表示插入操作的结果:
result.n
插入的数量。ops
包含插入的文档。
查询数据
在 MongoDB 中,可以使用 find()
方法来查询集合中的文档。如果找到匹配的文档,则将返回一个游标。以下是一个查询单个文档的示例:
-- -------------------- ---- ------- ----- ------------- - ------------ --------- - ----- ---------- - --------------------------- ----------------- -- - ------------------------ ----- - ----------------- ------ ------------------ --- --------- ---------- ------------------ --------------- --- -
删除数据
使用 deleteOne()
方法可以删除单个匹配文档。以下是一个示例:
const deleteDocument = function(db, callback) { const collection = db.collection('documents'); collection.deleteOne({ a : 3 }, function(err, result) { assert.equal(err, null); console.log("Removed the document with the field a equal to 3"); callback(result); }); }
总结
本文介绍了 MongoDB 在 Kubernetes 集群中部署和使用的过程。我们覆盖了双活和单活架构的部署。我们还提供了一个示例代码,演示如何使用 MongoDB 驱动程序来连接和操作 MongoDB 数据库。在完成本文的阅读之后,您应该可以在 Kubernetes 集群中部署和使用 MongoDB 数据库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6502680c95b1f8cacdfb3155