Kubernetes MongoDB autoscaling

9/18/2019

I've deployed a stateful mongodb setup in my k8s cluster. Everytime a scale a new pod, I need to add the pod from mongodb console using rs.add() command. Is there any way I can orchestrate this ?..Also how can I expose my mongodb service outside my k8s cluster..Changing the service type to nodeport didn't work for me..Please help.

Giving below the stateful yaml file which I used to deploy mongodb.

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    name: mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    role: mongo
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 3
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo:3.4
          command:
            - mongod
            - "--replSet"
            - rs0
            - "--bind_ip"
            - 0.0.0.0
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
        - name: mongo-sidecar
          image: cvallance/mongo-k8s-sidecar
          env:
            - name: MONGO_SIDECAR_POD_LABELS
              value: "role=mongo,environment=test"
  volumeClaimTemplates:
  - metadata:
      name: mongo-persistent-storage
      annotations:
        volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
-- Nithin Radhakrishnan
kubernetes
kubernetes-statefulset
mongodb

2 Answers

9/20/2019

As you are using Kubernetes, which is Container Orchestration platform, you can always scale your deployment/statefulset using $ kubectl scale deployment [deployment_name] --repplicas=X or $ kubectl scale statefulset [statefulset-name] --replicas=X where X means how many pods in total you want to have in deployment. It will create autoamatically pods based on your deployment settings. If you don't want to create it manually, you should read about Kubernetes autoscaling - HPA.

About exposing application outside Kubernetes you have to do it using Service. More information can be found here. I am not sure if NodePort is right in this scenario. You can check ServiceType description.

However I am not very familiar with MongoDB with Kubernetes, but maybe those tutorials help you. Scaling MongoDB on Kubernetes, Running MongoDB as a Microservice with Docker and Kubernetes, Running MongoDB on Kubernetes with StatefulSets.

Hope it will help.

-- PjoterS
Source: StackOverflow

9/20/2019

As @PjoterS suggest you can scale the mongoDB replicas or pods inside the kubernetes using HPA.

But with that you should have to also take care about the volume mounting with it.also data latency between replicas.

I would suggest better first check the native scaling cluster option provided by the mongo db it self and configure. You can use some operators for mongoDB like : https://docs.mongodb.com/kubernetes-operator/master/tutorial/install-k8s-operator/

Otherwise if you have current config is following native cluster and support scaling replica and data copy between replca's you can go for HPA.

you can also have a look at this : https://medium.com/faun/scaling-mongodb-on-kubernetes-32e446c16b82

-- Harsh Manvar
Source: StackOverflow