
Running multiple Kubernetes jobs with completion index
If you need to run a Kubernetes job many times, use .spec.completions
. Job will be completed when run successfully .spec.completions
times. If you need to differentiate between the runs, set .spec.completionMode
to Indexed
. That will inject the environment variable JOB_COMPLETION_INDEX
with the index of the run.
For example, in the past, I used this to deploy multiple customers of my application. The customers to be deployed are listed in a ConfigMap and the Job used the JOB_COMPLETION_INDEX
to select the customer. Something like this:
apiVersion: v1
kind: ConfigMap
metadata:
name: customers-list
data:
customers: "customerA,customerB,customerC,customerD,customerE,customerF,customerG,customerH,customerI,customerJ"
---
apiVersion: batch/v1
kind: Job
metadata:
name: customer-deployer
spec:
completions: 10 # Customers list length
completionMode: Indexed
template:
spec:
restartPolicy: Never
containers:
- name: customer-deployer
image: customer-deployer:1.0
command: ["sh", "-c"]
args:
- |
CUSTOMER_NAME=$(echo $CUSTOMER_LIST | cut -d',' -f $((JOB_COMPLETION_INDEX + 1)))
/app/deploy-customer.sh $CUSTOMER_NAME
env:
- name: CUSTOMER_LIST
valueFrom:
configMapKeyRef:
name: customers-list
key: customers
You can use .spec.parallelism
to set the maximum number of parallel runs.