Creating a Job

listmonk requires us to do the DB migrations before the app can run. The DB migrations are responsible for loading the schema in the Postgres database. Since this is a one-off task, Kubernetes provides a way to run such tasks by creating a Job object.

Since at the time of writing this guide kubekutr doesn't have support for Jobs/CronJobs, we can create a raw resource ourselves.

# vim base/add-db-migration.yml apiVersion: batch/v1 kind: Job metadata: name: db-init spec: template: spec: containers: - name: listmonk-db-init image: localhost:32000/listmonk:0.5 command: [sh, -c, "yes | ./listmonk --install"] envFrom: - secretRef: name: app-secrets restartPolicy: Never backoffLimit: 5 ttlSecondsAfterFinished: 10 activeDeadlineSeconds: 100

When the Job object is applied to the cluster, a Pod is created. Just like how Deployment targets the Pod with ReplicaSet, Job manages the state of the Pod. Retry for a job or parallel scheduling can all be controlled with the Job spec about which you can read more here.

Every time we add a resource, we must remember to add it to our inventory, which is defined in kustomization.yml.

# vim base/kustomization.yml resources: ... - add-db-migration.yml ...

Since this resource is now added to our inventory, all our customisations will be applied to the Job object as well.

Note: Always remember to add resources to kustomization.yml file to keep your inventory up to date. Not doing so, would mean that those resources would be skipped out when building the manifests.