Skip to main content
Version: release-0.9

Create and connect to a MongoDB cluster

This tutorial shows how to create and connect to a MongoDB cluster.

Create a MongoDB cluster

Before you start

  • Install kbcli if you want to create and connect a MySQL cluster by kbcli.

  • Install KubeBlocks.

  • Make sure the MongoDB Addon is enabled. If this addon is not enabled, enable it first.

    kubectl get addons.extensions.kubeblocks.io mongodb
    >
    NAME TYPE VERSION PROVIDER STATUS AGE
    mongodb Helm Enabled 23m
  • View all the database types and versions available for creating a cluster.

    kubectl get clusterdefinition mongodb
    >
    NAME TOPOLOGIES SERVICEREFS STATUS AGE
    mongodb Available 23m
    kubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=mongodb
  • To keep things isolated, create a separate namespace called demo throughout this tutorial.

    kubectl create namespace demo
    >
    namespace/demo created

Create a cluster

KubeBlocks supports creating two types of MongoDB clusters: Standalone and ReplicaSet. Standalone only supports one replica and can be used in scenarios with lower requirements for availability. For scenarios with high availability requirements, it is recommended to create a ReplicaSet, which creates a cluster with two replicas to support automatic failover. To ensure high availability, all replicas are distributed on different nodes by default.

  1. Create a MongoDB cluster.

    KubeBlocks implements a Cluster CRD to define a cluster. Here is an example of creating a MongoDB Standalone.

    If you only have one node for deploying a ReplicaSet Cluster, set spec.affinity.topologyKeys as null. But for a production environment, it is not recommended to deploy all replicas on one node, which may decrease the cluster availability.

    cat <<EOF | kubectl apply -f -
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: Cluster
    metadata:
    name: mycluster
    namespace: demo
    spec:
    terminationPolicy: Delete
    affinity:
    podAntiAffinity: Preferred
    topologyKeys:
    - kubernetes.io/hostname
    tolerations:
    - key: kb-data
    operator: Equal
    value: 'true'
    effect: NoSchedule
    componentSpecs:
    - name: mongodb
    componentDef: mongodb
    replicas: 3
    resources:
    limits:
    cpu: '0.5'
    memory: 0.5Gi
    requests:
    cpu: '0.5'
    memory: 0.5Gi
    volumeClaimTemplates:
    - name: data
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 20Gi
    EOF
    FieldDefinition
    spec.terminationPolicyIt is the policy of cluster termination. The default value is Delete. Valid values are DoNotTerminate, Delete, WipeOut. For the detailed definition, you can refer to Termination Policy.
    spec.affinityIt defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster.
    spec.affinity.podAntiAffinityIt specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance.
    spec.affinity.topologyKeysIt represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints.
    spec.tolerationsIt is an array that specifies tolerations attached to the cluster's Pods, allowing them to be scheduled onto nodes with matching taints.
    spec.componentSpecsIt is the list of components that define the cluster components. This field allows customized configuration of each component within a cluster.
    spec.componentSpecs.componentDefRefIt is the name of the component definition that is defined in the cluster definition and you can get the component definition names with kubectl get clusterdefinition mongodb -o json | jq '.spec.componentDefs[].name'.
    spec.componentSpecs.nameIt specifies the name of the component.
    spec.componentSpecs.replicasIt specifies the number of replicas of the component.
    spec.componentSpecs.resourcesIt specifies the resource requirements of the component.

    KubeBlocks operator watches for the Cluster CRD and creates the cluster and all dependent resources. You can get all the resources created by the cluster by running the command below.

    kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo

    Run the following command to view the created MongoDB cluster object.

    kubectl get cluster mycluster -n demo -o yaml
  2. Verify whether this cluster is created successfully.

    kubectl get cluster mycluster -n demo
    >
    NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
    mycluster mongodb mongodb-5.0 Delete Running 12m

Connect to a MongoDB Cluster

You can use kubectl exec to exec into a Pod and connect to a database.

KubeBlocks operator has created a new Secret called mycluster-conn-credential to store the connection credential of the MongoDB cluster. This secret contains the following keys:

  • username: the root username of the MongoDB cluster.
  • password: the password of the root user.
  • port: the port of the MongoDB cluster.
  • host: the host of the MongoDB cluster.
  • endpoint: the endpoint of the MongoDB cluster and it is the same as host:port.
  1. Get the username and password to connect to this MongoDB cluster for the kubectl exec command.

    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
  2. Exec into the Pod mycluster-mongodb-0 and connect to the database using username and password.

    kubectl exec -ti -n demo mycluster-mongodb-0 -- bash

    root@mycluster-mongodb-0:/# mongo --username root --password 266zfqx5 --authenticationDatabase admin

For the detailed database connection guide, refer to Connect database.