Home

Awesome

k8s-mongo-operator

MongoDB Operator for Kubernetes.

This repository is no longer actively maintained. Please fork it and make the needed changes yourself.

Features

The following feature are currently available in this operator:

Limitations

The current version has the limitations that shall be addressed in a later version:

Cluster interaction

Please refer to our simplified diagram to get an overview of the operator interactions with your Kubernetes cluster.

Deployment

To deploy this operator in your own cluster, you'll need to create some configuration files. An example of these configuration files can be found in kubernetes/operators/mongo-operator

As you can see there is a service account (mongo-operator-service-account) which has some specific permissions in the cluster. These permissions are registered in the cluster role and cluster role binding.

Lastly there is a deployment configuration to deploy the actual operator. Usually you'd use an image value like ultimaker/k8s-mongo-operator:master, or a specific version. All available tags can be found on Docker Hub.

Creating a Mongo object

To deploy a new replica set in your cluster using the operator, create a Kubernetes configuration file similar to this:

apiVersion: "operators.ultimaker.com/v1"
kind: Mongo
metadata:
  name: mongo-cluster
spec:
  mongodb:
    replicas: 3
  backups:
    cron: "0 * * * *" # hourly
    gcs:
      bucket: "ultimaker-mongo-backups"
      serviceAccount:
        secretKeyRef:
          name: "storage-service-account"
          key: json

Then deploy it to the cluster like any other object:

kubectl apply -f mongo.yaml

Configuration options

The following options are available to use in the spec section of the yaml configuration file. Keys with a * in front are required.

Config keyDefaultDescription
* mongodb.mongo_name-The name of the Mongo deployment.
mongodb.storage_namemongo-storageThe name of the persistent volumes that Kubernetes will create and mount.
mongodb.storage_size30GiThe size of the persistent volumes.
mongodb.storage_data_path/data/dbThe path on which the persistent volumes are mounted in the Mongo containers.
mongodb.storage_class_name-The name of the storage class to use to create the persistent values. If not passed it will use the Kubernetes cluster default storage class name.
mongodb.cpu_limit1The CPU limit of each container.
mongodb.cpu_request0.5The CPU request of each container.
mongodb.memory_limit2GiThe memory limit of each container.
mongodb.memory_request1GiThe memory request of each container.
mongodb.wired_tiger_cache_size0.25The wired tiger cache size.
mongodb.replicas-The amount of MongoDB replicas that should be available in the replica set. Must be an uneven positive integer and minimum 3.
* backups.cron-The cron on which to create a backup to cloud storage.
* backups.gcs.bucket-The GCS bucket to upload the backup to.
backups.gcs.restore_bucket-The GCS bucket that contains the backup we wish to restore. If not specified, the value of backups.gcs.bucket is used.
backups.gcs.restore_from-Filename of the backup in the bucket we wish to restore. If not specified, or set to 'latest', the last backup created is used.
backups.gcs.prefixbackups/The file name prefix for the backup file.

Please read https://docs.mongodb.com/manual/administration/production-notes/#allocate-sufficient-ram-and-cpu for details about why setting the WiredTiger cache size is important when you change the container memory limit from the default value.

Testing locally

To run the tests in a local Kubernetes (MiniKube) cluster, we have created a simple test script.

Ensure you have the following tools installed on your system:

Then start a new MiniKube cluster using the following commands:

minikube start

Then you can run our test script to deploy the operator and execute some end-to-end tests.

Note that this script assumes there is a file google-credentials.json in this directory that will be uploaded to Kubernetes as the secret for the backups. You will need to download this file from Google in order to run the script.

./build-and-deploy-local.sh

You will also see the operator logs streamed to your console.

Contributing

Please make a GitHub issue or pull request to help us build this operator.

Maintainance

The repo is currently maintained by Ultimaker. Contact us via the GitHub issues for questions or suggestions.