Search code examples
mongodbkubernetesminikubeskaffold

Seed MongoDB in local minikube cluster using skaffold


I am using a skaffold to deploy mongodb to my local minikube cluster.

sample files below:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/mongodb.yaml"
    defaultNamespace: "mongodb"

config/namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: mongodb
  labels:
    name: mongodb

config/mongodb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-mongo-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb-mongo
  template:
    metadata:
      labels:
        app: mongodb-mongo
    spec:
      containers:
        - name: mongodb-mongo
          image: mongo
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-mongo-srv
spec:
  selector:
    app: mongodb-mongo
  ports:
    - name: db
      protocol: TCP
      port: 27017
      targetPort: 27017

It successfully creates a mongodb instance in my minikube cluster.

I would also like to seed the db with some json data.

Is there are way to do this using skaffold ?


Update:

I have also created a configmap and a job to seed the database so my config is as follows:

skaffold.yaml

apiVersion: skaffold/v2beta26
kind: Config

metadata:
  name: mongodb

deploy:
  kubectl:
    manifests:
    - "config/namespace.yaml"
    - "config/configmap.yaml"
    - "config/mongodb.yaml"
    - "config/mongo-seed-job.yaml"
    defaultNamespace: "mongodb"

congigmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: seed-data
  namespace: mongodb
data:
  init.json: |
    [{"name":"Joe Smith","email":"[email protected]","age":40,"admin":false},{"name":"Jen Ford","email":"[email protected]","age":45,"admin":true}]

mongo-seed-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: mongo-seed
spec:
  template:
    spec:
      containers:
      - name: seed
        image: mongo:latest
        command: ["sh", "-c", "mongoimport --uri mongodb://mongodb:27017/mydb --collection accounts --type json --file '/init.json' --jsonArray"]
        volumeMounts: 
        - name: seed-data
          mountPath: /data
      volumes:
      - name: seed-data
        configMap:
          name: seed-data
          items:
          - key: init.json
            path: init.json
      restartPolicy: Never

now the mongo-seed pod wont start. I am getting ContainerCannotRun


Solution

  • I managed to get it working. Here is the working code if anyone else needs it:

    skaffold.yaml

    apiVersion: skaffold/v2beta26
    kind: Config
    
    metadata:
      name: mongodb
    
    deploy:
      kubectl:
        manifests:
        - "config/namespace.yaml"
        - "config/mongodb-credentials.yaml"
        - "config/configmap.yaml"
        - "config/mongodb.yaml"
        - "config/mongo-seed-job.yaml"
        defaultNamespace: "mongodb"
    

    config/namespace.yaml

    kind: Namespace
    apiVersion: v1
    metadata:
      name: mongodb
      labels:
        name: mongodb
    

    config/mongodb-credentials.yaml

    Note: username: admin password: password

    Please change this to whatever you want

    apiVersion: v1
    kind: Secret
    metadata:
      name: mongodb-credentials
    type: Opaque
    data:
      username: YWRtaW4=
      password: cGFzc3dvcmQ=
    

    config/configmap.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: seed-data
    data:
      init.json: |
        [{"name":"Joe Smith","email":"[email protected]","age":40,"admin":false},{"name":"Jen Ford","email":"[email protected]","age":45,"admin":true}]
    

    config/mongodb.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mongodb
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mongodb
      template:
        metadata:
          labels:
            app: mongodb
        spec:
          containers:
            - name: mongodb
              image: mongo:latest
              ports:
              - containerPort: 27017
              volumeMounts:
              - name: mongo-data
                mountPath: /data/db
              env:
                - name: MONGO_INITDB_ROOT_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: mongodb-credentials
                      key: username
                - name: MONGO_INITDB_ROOT_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mongodb-credentials
                      key: password
          volumes:
          - name: mongo-data
            emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mongodb
    spec:
      ports:
        - port: 27017
      selector:
        app: mongodb
    

    config/mongo-seed-job.yaml

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mongo-seed
    spec:
      template:
        spec:
          initContainers:
          - name: init-copy
            image: busybox
            command: ['sh', '-c', 'cp /config/init.json /data/']
            volumeMounts:
            - name: config-volume
              mountPath: /config
            - name: data-volume
              mountPath: /data
          containers:
          - name: seed
            image: mongo:latest
            command: ["sh", "-c", "mongoimport --uri mongodb://$(MONGO_USERNAME):$(MONGO_PASSWORD)@mongodb:27017/mydb --collection accounts --type json --file /data/init.json --jsonArray --authenticationDatabase=admin"]
            env:
              - name: MONGO_USERNAME
                valueFrom:
                  secretKeyRef:
                    name: mongodb-credentials
                    key: username
              - name: MONGO_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mongodb-credentials
                    key: password
            volumeMounts: 
            - name: data-volume
              mountPath: /data
          restartPolicy: Never
          volumes:
          - name: config-volume
            configMap:
              name: seed-data
          - name: data-volume
            emptyDir: {}
    

    If anyone has any alternate solutions it would be good to know.

    Thanks @imran-premnawaz for your help