mh377
mh377

Reputation: 1856

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

Upvotes: 0

Views: 126

Answers (1)

mh377
mh377

Reputation: 1856

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

Upvotes: 1

Related Questions