创建并连接到 MongoDB 集群
本文档展示如何创建并连接到一个 MongoDB 集群。
创建 MongoDB 集群
开始之前
- 
如果您想通过 kbcli创建并连接 MongoDB 集群,请先安装 kbcli。
- 
确保 MongoDB 引擎已启用。如果引擎未安装/启用,可参考相关文档,安装/启用该引擎。 - kubectl
- kbcli
 kubectl get addons.extensions.kubeblocks.io mongodb
 >
 NAME TYPE VERSION PROVIDER STATUS AGE
 mongodb Helm Enabled 23mkbcli addon list
 >
 NAME TYPE STATUS EXTRAS AUTO-INSTALL
 ...
 mongodb Helm Enabled true
 ...
- 
查看可用于创建集群的数据库类型和版本。 - kubectl
- kbcli
 kubectl get clusterdefinition mongodb
 >
 NAME TOPOLOGIES SERVICEREFS STATUS AGE
 mongodb Available 23mkubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=mongodbkbcli clusterdefinition list
 kbcli clusterversion list
- 
为了保持隔离,本文档中创建一个名为 demo的独立命名空间。kubectl create namespace demo
 >
 namespace/demo created
创建集群
KubeBlocks 支持创建两种 MongoDB 集群:单机版(Standalone)和主备版(ReplicaSet)。MongoDB 单机版仅支持一个副本,适用于对可用性要求较低的场景。对于高可用性要求较高的场景,建议创建主备版集群,以支持自动故障切换。为了确保高可用性,所有的副本都默认分布在不同的节点上。如果您只有一个节点可用于部署主备版集群,可设置 spec.schedulingPolicy 或 spec.componentSpecs.schedulingPolicy,具体可参考 API 文档。但生产环境中,不建议将所有副本部署  在同一个节点上,因为这可能会降低集群的可用性。
- kubectl
- kbcli
- 
创建 MongoDB 集群。 KubeBlocks 通过 Cluster定义集群。以下是创建 MongoDB 单机版的示例。cat <<EOF | kubectl apply -f -
 apiVersion: apps.kubeblocks.io/v1
 kind: Cluster
 metadata:
 name: mycluster
 namespace: demo
 spec:
 terminationPolicy: Delete
 clusterDef: mongodb
 topology: replicaset
 componentSpecs:
 - name: mongodb
 serviceVersion: "6.0.16"
 replicas: 3
 resources:
 limits:
 cpu: '0.5'
 memory: 0.5Gi
 requests:
 cpu: '0.5'
 memory: 0.5Gi
 volumeClaimTemplates:
 - name: data
 spec:
 storageClassName: ""
 accessModes:
 - ReadWriteOnce
 resources:
 requests:
 storage: 20Gi
 EOF字段 定义 spec.terminationPolicy集群终止策略,有效值为 DoNotTerminate、Delete和WipeOut。具体定义可参考 终止策略。spec.clusterDef指定了创建集群时要使用的 ClusterDefinition 的名称。注意:请勿更新此字段。创建 MongoDB 集群时,该值必须为 mongodb。spec.topology指定了在创建集群时要使用的 ClusterTopology 的名称。 spec.componentSpecs集群 component 列表,定义了集群 components。该字段支持自定义配置集群中每个 component。 spec.componentSpecs.serviceVersion定义了 component 部署的服务版本。有效值为[4.0.28,4.2.24,4.4.29,5.0.28,6.0.16,7.0.1]。 spec.componentSpecs.disableExporter定义了是否在 component 无头服务(headless service)上标注指标 exporter 信息,是否开启监控 exporter。有效值为 [true, false]。 spec.componentSpecs.replicas定义了 component 中 replicas 的数量。 spec.componentSpecs.resources定义了 component 的资源要求。 spec.componentSpecs.volumeClaimTemplatesPersistentVolumeClaim 模板列表,定义 component 的存储需求。 spec.componentSpecs.volumeClaimTemplates.name引用了在 componentDefinition.spec.runtime.containers[*].volumeMounts中定义的 volumeMount 名称。spec.componentSpecs.volumeClaimTemplates.spec.storageClassName定义了 StorageClass 的名称。如果未指定,系统将默认使用带有 storageclass.kubernetes.io/is-default-class=true注释的 StorageClass。spec.componentSpecs.volumeClaimTemplates.spec.resources.storage可按需配置存储容量。 您可参考 API 文档,查看更多 API 字段及说明。 KubeBlocks operator 监控 ClusterCRD 并创建集群和全部依赖资源。您可执行以下命令获取集群创建的所有资源信息。kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo执行以下命令,查看已创建的 MongoDB 集群: kubectl get cluster mycluster -n demo -o yaml
- 
验证集群是否创建成功。 kubectl get cluster mycluster -n demo
- 
创建 MongoDB 集群。 kbcli cluster create mongodb mycluster -n demo如果您需要自定义集群规格,kbcli 也提供了诸多参数,如支持设置引擎版本、终止策略、CPU、内存规格。您可通过在命令结尾添加 --help或-h来查看具体说明。比如,kbcli cluster create mongodb --help
 kbcli cluster create mongodb -h例如,您可使用 --mode指定集群形态,创建 MongoDB 主备版。kbcli cluster create mongodb mycluster --mode replicaset -n demo如果您只有一个节点用于部署多副本集群,可在创建集群时配置集群亲和性,配置 --pod-anti-affinity,--tolerations和--topology-keys。但需要注意的是,生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。例如,kbcli cluster create mongodb mycluster \
 --mode='replicaset' \
 --pod-anti-affinity='Preferred' \
 --tolerations='node-role.kubeblocks.io/data-plane:NoSchedule' \
 --topology-keys='null' \
 --namespace demo
- 
验证集群是否创建成功。 kbcli cluster list -n demo
 >
 NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
 mycluster demo mongodb mongodb-7.0.12 Delete Running Sep 19,2024 16:01 UTC+0800
连接到 MongoDB 集群
- kubectl
- port-forward
- kbcli
使用 kubectl exec 命令进入 Pod 并连接到数据库。
KubeBlocks operator 会创建一个名为 mycluster-conn-credential 的新的 Secret 来存储 MongoDB 集群的连接凭证。该 Secret 包含以下 key:
- username:集群的根用户名。
- password:根用户的密码。
- port:集群的端口。
- host:集群的主机。
- endpoint:集群的终端节点,与- host:port相同。
- 
获取用于 kubectl exec命令的username和password。kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d
 >
 root
 kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d
 >
 266zfqx5
- 
使用用户名和密码,进入 Pod mycluster-mongodb-0并连接到数据库。kubectl exec -ti -n demo mycluster-mongodb-0 -- bash
 root@mycluster-mongodb-0:/# mongo --username root --password 266zfqx5 --authenticationDatabase admin
还可以使 用端口转发在本地计算机上连接数据库。
- 
通过端口转发服务。 kubectl port-forward -n demo svc/mycluster-mongodb 27017:27017
- 
在新的终端窗口中执行以下命令,连接到数据库。 root@mycluster-mongodb-0:/# mongo --username root --password 266zfqx5 --authenticationDatabase admin
kbcli cluster connect mycluster --namespace demo
有关详细的数据库连接指南,请参考连接数据库。