Note: the Job in the title refers to the Job resource in a Kubernetes cluster.
At the time the Istio sidecar doesn’t play well with a Job or a Cronjob, because the istio-proxy might not be ready when the Job starts (which causes connection issues for the job) and won’t exit after the job finishes (which causes the Job stuck and won’t be marked as complete).
Here’s a simple Bash script for a Job assuming the Job’s container has Bash and curl
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
spec:
template:
metadata:
name: db-migrate
spec:
restartPolicy: Never
containers:
- name: db-migrate
image: "some-image-with-curl:v0.1"
command:
- /bin/bash
- -c
- |
# wait for the istio-proxy to become ready
until curl -fsI http://localhost:15021/healthz/ready; do
echo 'Waiting for Sidecar...'
sleep 1
done
# do the job here
bundle exec rails db:migrate
# ask the istio-proxy to exit
curl -fsI -X POST http://localhost:15020/quitquitquitAnd if the job container image doesn’t have bash or curl, I used a curl image as another sidecar to get the job done
---
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
spec:
template:
metadata:
name: db-migrate
spec:
restartPolicy: Never
volumes:
- name: flags
emptyDir: {}
containers:
- name: curl
image: curlimages/curl:7.78.0
command:
- /bin/sh
- -c
- |
# test istio-proxy
until curl -fsI http://localhost:15021/healthz/ready; do
echo 'Waiting for Sidecar...'
sleep 1
done
# touch the flag in tmp dir
touch /tmp/flags/istio-proxy-ready
# then wait for the job to finish
until [ -f /tmp/flags/done ]; do
echo 'Waiting for the job to finish...'
sleep 1
done
# ask istio-proxy to exit
curl -fsI -X POST http://localhost:15020/quitquitquit
volumeMounts:
- name: flags
mountPath: /tmp/flags
- name: db-migrate
image: "some-image-without-curl:v0.1"
command:
- /bin/bash
- -c
- |
# wait for the flag of istio-proxy
until [[ -f /tmp/flags/istio-proxy-ready ]]; do
echo 'Waiting for Sidecar...'
sleep 1
done
# do the job
bundle exec rails db:migrate
# set the flag so curl can shut down istio-proxy
touch /tmp/flags/done
volumeMounts:
- name: flags
mountPath: /tmp/flags
🙂
