{"id":10427,"date":"2022-05-24T17:27:29","date_gmt":"2022-05-24T11:57:29","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=10427"},"modified":"2022-05-24T17:33:32","modified_gmt":"2022-05-24T12:03:32","slug":"mongodb-setup-on-kubernetes-using-mongodb-operator","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/05\/24\/mongodb-setup-on-kubernetes-using-mongodb-operator\/","title":{"rendered":"MongoDB Setup on Kubernetes using MongoDB Operator"},"content":{"rendered":"\n<p>MongoDB is a popular NoSQL database that supports large as well as small size of datasets. Just like any other database standalone setup, MongoDB is straightforward but we have to make a replicated or shared cluster of MongoDB, and there we have certain complications. Especially if we are doing these kinds of setups in orchestration tools like Kubernetes.<\/p>\n\n\n\n<p>There is a lot of complexity in setting up MongoDB on Kubernetes that people(including me) have faced for a long time which I would like to highlight:-<\/p>\n\n\n\n<ul><li>Standalone setup is pretty straightforward but for replicated and sharded clusters additional mongo configurations are required.<\/li><li>In the replicated scenario, separate configurations need to be managed for the leader and follower.<\/li><li>Monitoring and access management of MongoDB inside Kubernetes is a little tricky part to handle.<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<p>Now the tough question arises who will manage this MongoDB setup on Kubernetes considering its monitoring, security, and best practices of it. But you guys don&#8217;t have to worry, we do as well have an answer and the answer is MongoDB Operator by Opstree Solutions.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/image-3.png?w=136\" alt=\"\" class=\"wp-image-10849\" width=\"218\" height=\"240\" \/><figcaption>Operator Logo<\/figcaption><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">MongoDB Operator<\/h2>\n\n\n\n<p>The MongoDB operator is a custom CRD-based operator inside Kubernetes to create, manage, and auto-heal MongoDB setup. It helps in providing different types of MongoDB setup on Kubernetes like- <strong><em>standalone, replicated, and sharded.<\/em><\/strong> There are quite amazing features we have introduced inside the operator and some are in-pipeline on which deployment is going on. Some of the MongoDB operator features are:-<\/p>\n\n\n\n<ul><li>Standalone and replicated cluster setup<\/li><li>Failover and recovery of MongoDB nodes<\/li><li>Inbuilt monitoring support for Prometheus using MongoDB Exporter.<\/li><li>Different Kubernetes-related best practices like:- Affinity, Pod Disruption Budget, Resource management, etc, are also part of it.<\/li><li>Insightful and detailed monitoring dashboards for Grafana.<\/li><li>Custom MongoDB configuration support.<\/li><\/ul>\n\n\n\n<p>Other than this, there are a lot of features are in the backlog on which active development is happening. For example:-<\/p>\n\n\n\n<ul><li>Backup and Restore support<\/li><li>TLS encryption and decryption<\/li><li>DB management support<\/li><li>User management support<\/li><li>Roles management support<\/li><\/ul>\n\n\n\n<p>MongoDB Operator architecture looks like this:-<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/image-4.png?w=1024\" alt=\"\" class=\"wp-image-10850\" width=\"512\" height=\"264\" \/><figcaption>Architecture<\/figcaption><\/figure>\n\n\n\n<p>For more information about MongoDB Operator, please check out the documentation page of it. <br><a href=\"https:\/\/ot-mongodb-operator.netlify.app\/\" target=\"_blank\" rel=\"noopener\">https:\/\/ot-mongodb-operator.netlify.app\/<\/a><br><a href=\"https:\/\/github.com\/OT-CONTAINER-KIT\/mongodb-operator\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/OT-CONTAINER-KIT\/mongodb-operator<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation and Configuration of MongoDB Operator<\/h2>\n\n\n\n<p>MongoDB Operator requires a Kubernetes cluster of version &gt;=1.16.0. If you have just started with the CRD and Operators, it&#8217;s highly recommended to use the latest version of Kubernetes.<\/p>\n\n\n\n<p>Setup of MongoDB operator can be easily done by using simple&nbsp;<a href=\"https:\/\/helm.sh\/\" target=\"_blank\" rel=\"noopener\">helm<\/a>&nbsp;and&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/overview\/\" target=\"_blank\" rel=\"noopener\">kubectl<\/a>&nbsp;commands.<\/p>\n\n\n\n<p>First, add the helm repository to your system.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Add the helm chart\n$ helm repo add ot-helm \\ \nhttps:&#047;&#047;ot-container-kit.github.io\/helm-charts\/\n...\n\"ot-helm\" has been added to your repositories<\/pre>\n\n\n\n<p>Once the helm repository is configured, we can simply deploy the operator using the <strong><em>helm install<\/em><\/strong> command.<br><\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Deploy the MongoDB Operator\n$ helm install mongodb-operator \\\not-helm\/mongodb-operator --namespace ot-operators\n...\nRelease \"mongodb-operator\" does not exist. Installing it now.\nNAME: mongodb-operator\nLAST DEPLOYED: Sun Jan  9 23:05:13 2022\nNAMESPACE: ot-operators\nSTATUS: deployed\nREVISION: 1<\/pre>\n\n\n\n<p>After the operator deployment is successful, we can verify it using the <strong>kubectl<\/strong> command line.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># List the pod and status of mongodb-operator\n$ kubectl get pods -n ot-operators -l name=mongodb-operator\n...\nNAME                               READY   STATUS    RESTARTS   AGE\nmongodb-operator-fc88b45b5-8rmtj   1\/1     Running   0          21d<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MongoDB Cluster setup on Kubernetes<\/h2>\n\n\n\n<p>MongoDB cluster can be easily set up on Kubernetes cluster by providing a simple manifest file like this:-<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">---\napiVersion: opstreelabs.in\/v1alpha1\nkind: MongoDBCluster\nmetadata:\n  name: mongodb\nspec:\n  clusterSize: 3\n  kubernetesConfig:\n    image: quay.io\/opstree\/mongo:v5.0\n    imagePullPolicy: IfNotPresent\n    securityContext:\n      fsGroup: 1001\n  storage:\n    accessModes: [\"ReadWriteOnce\"]\n    storageSize: 1Gi\n    storageClass: csi-cephfs-sc\n  mongoDBSecurity:\n    mongoDBAdminUser: admin\n    secretRef:\n      name: mongodb-secret\n      key: password\n  mongoDBMonitoring:\n    enableExporter: true\n    image: bitnami\/mongodb-exporter:0.11.2-debian-10-r382\n    imagePullPolicy: IfNotPresent<\/pre>\n\n\n\n<p>Once the manifest is ready we can simply apply it using <strong>kubectl<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">$ kubectl apply -f clusterd.yaml\n\n$ kubectl get pods --namespace ot-operators -l app=mongodb-cluster\n...\nNAME                           READY   STATUS    RESTARTS   AGE\nmongodb-ex-cluster-cluster-0   2\/2     Running   0          5m57s\nmongodb-ex-cluster-cluster-1   2\/2     Running   0          5m28s\nmongodb-ex-cluster-cluster-2   2\/2     Running   0          4m48s<\/pre>\n\n\n\n<p>After the setup is done, we can easily verify the MongoDB setup using <strong>mongo-cli<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Verifying the health of the cluster\n$ kubectl exec -it mongodb-ex-cluster-cluster-0 -n ot-operators -- bash\n\n$ mongo -u $MONGO_ROOT_USERNAME -p $MONGO_ROOT_PASSWORD --eval \"db.adminCommand( { replSetGetStatus: 1 } )\"\n...\n{\n\t\"set\" : \"mongodb-ex-cluster\",\n\t\"date\" : ISODate(\"2022-02-03T08:52:09.257Z\"),\n\t\"myState\" : 1,\n\t\"term\" : NumberLong(1),<\/pre>\n\n\n\n<p>This example is more of a POC kind of setup, there are multiple examples available inside the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/OT-CONTAINER-KIT\/mongodb-operator\/tree\/main\/examples\" target=\"_blank\">examples<\/a> directory. Also, if you want to set up a cluster using the <strong>helm chart<\/strong>, we can simply do it using the <strong>helm install <\/strong>commands as well.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Installation of MongoDB replication cluster\n$ helm install mongodb-ex-cluster --namespace ot-operators ot-helm\/mongodb-cluster\n...\nNAME:          mongodb-ex-cluster\nLAST DEPLOYED: Tue Feb  1 23:18:36 2022\nNAMESPACE:     ot-operators\nSTATUS:        deployed\nREVISION:      1\nTEST SUITE:    None\nNOTES:\n  CHART NAME:    mongodb-cluster\n  CHART VERSION: 0.1.0\n  APP VERSION:   0.1.0\n\nThe helm chart for MongoDB standalone setup has been deployed.\n\nGet the list of pods by executing:\n    kubectl get pods --namespace ot-operators -l app=mongodb-ex-cluster-cluster\n\nFor getting the credential for admin user:\n    kubectl get secrets -n ot-operators mongodb-ex-secret -o jsonpath=\"{.data.password}\" | base64 -d<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>This operator is still under development, and we are working towards adding some valuable features inside it. Since it&#8217;s an open-source project, so if you guys want to make a contribution please feel free to do it. The contribution to the project can be done by opening feature requests, bugs, and Pull Requests.<\/p>\n\n\n\n<p>For more information, please refer to the repository link.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/OT-CONTAINER-KIT\/mongodb-operator\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/OT-CONTAINER-KIT\/mongodb-operator<\/a><\/p>\n\n\n\n<p>Thanks for reading, I\u2019d really appreciate any and all feedback, please leave your comment below if you guys have any feedback.<\/p>\n\n\n\n<p>Cheers till next time!!<\/p>\n\n\n\n<p><br><strong style=\"font-weight:bold;\">Blog Pundit:<\/strong> <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\"><strong>Sandeep Rawat<\/strong><\/a><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/www.opstree.com\/contact-us?utm_source=blog&amp;utm_medium=wordpress+&amp;utm_campaign=MongoDB-Setup-on-Kubernetes-using-MongoDB-Operator\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a><\/strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.opstree.com\/contact-us?utm_source=blog&amp;utm_medium=wordpress+&amp;utm_campaign=AWS-Elastic-Network-Interface\" target=\"_blank\"> <\/a>is an End to End DevOps solution provider<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-right is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>MongoDB is a popular NoSQL database that supports large as well as small size of datasets. Just like any other database standalone setup, MongoDB is straightforward but we have to make a replicated or shared cluster of MongoDB, and there we have certain complications. Especially if we are doing these kinds of setups in orchestration &hellip; <a href=\"https:\/\/opstree.com\/blog\/2022\/05\/24\/mongodb-setup-on-kubernetes-using-mongodb-operator\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;MongoDB Setup on Kubernetes using MongoDB Operator&#8221;<\/span><\/a><\/p>\n","protected":false},"author":89038429,"featured_media":10850,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[44070,981269,768739308,304054034,768739309,21954763,97141521,768739293,56495631,283374,768739287],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2022\/05\/image-4.png","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2Ib","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10427"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/89038429"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=10427"}],"version-history":[{"count":24,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10427\/revisions"}],"predecessor-version":[{"id":10884,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10427\/revisions\/10884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/10850"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=10427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=10427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=10427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}