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/quitquitquit
And 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
🙂