Um Job cria um ou mais Pods e repete a execução destes Pods até que um número determinado de Pods termine com sucesso. O Job faz um rastreamento das completions(conclusões) dos Pods. Quando um número específico de successfully completions(conclusões com sucesso) é atingido, a task é considerada como concluída com sucesso. Deletar um Job implica na exclusão dos seus Pods. fonte
Antes de entrar em qualquer detalhe vamos criar um Job e avaliar seu comportamento na prática. Para criar um Job imperativamente, utilize o comando create job
. Se a imagem fornecida não executa nenhum comando, você pode anexar um comando para ser executado no Pod correspondente.
O comando a seguir cria um Job que executa um loop e a cada iteração deste loop a variável counter é incrementada. A execução do comando termina quando o counter atinge o valor 3.
$ kubectl create job counter \\
--image=nginx \\
-- /bin/sh -c 'counter=0; \\
while [ $counter -lt 3 ]; do counter=$(counter+1); echo "$counter"; \\
sleep 3; done;'
job.batch/counter created
<aside>
💡 A especificação do Job não exige que um selector
seja definido no manifesto, mas o Kubernetes gera um selector
quando o Job é criado.
</aside>
# Veja o selector criado
$ kubectl get jobs counter -o yaml
apiVersion: batch/v1
kind: Job
metadata:
labels:
controller-uid: 8762b16d-ba32-4619-9e10-10b94db18bee
job-name: counter
name: counter
uid: 8762b16d-ba32-4619-9e10-10b94db18bee
spec:
selector:
matchLabels:
controller-uid: 8762b16d-ba32-4619-9e10-10b94db18bee
template:
metadata:
labels:
controller-uid: 8762b16d-ba32-4619-9e10-10b94db18bee
job-name: counter
spec:
containers:
- name: counter
...
O que seria gerado pelo comando acima caso usássemos a flag --dry-run=client
?
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: counter
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- /bin/sh
- -c
- "counter=0; while [ $counter -lt 3 ]; do counter=$((counter+1)); \\
echo \\"$counter\\"; sleep 3; done;"
image: nginx
name: counter
resources: {}
restartPolicy: Never
status: {}
Criando um Job manualmente acompanhando a documentação do Kubernetes.
# Identificando versão da API antes de criar o objeto
$ kubectl api-resources | grep -1 "^jobs"
NAME SHORTNAMES APIVERSION NAMESPACED KIND
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
apiVersion: batch/v1
kind: Job
metadata:
name: counter
labels:
section: 06-pod-design
spec:
parallelism: 1
completions: 1
template:
metadata:
name: job-pod
spec:
containers:
- image: nginx
name: counter
command: ["/bin/sh", "-c"]
args: ["counter=0; \\
while [ $counter -lt 3 ]; do \\
counter=$((counter+1)); \\
echo \\"$counter\\"; \\
done;"]
restartPolicy: Never
parallelism
: Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info.completions
: Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info.
A listagem dos Jobs exibe o número real de completions(conclusões) e o número esperado de completions. Quando o número real e número esperado de completions são iguais significa que o(s) Pod(s) executou(aram) sua(s) atividade(s) com sucesso e o Job é considerado completo.
$ kubectl get jobs,pods
NAME COMPLETIONS DURATION AGE
job.batch/counter 1/1 2s 15m
NAME READY STATUS RESTARTS AGE
pod/counter-94cf5 0/1 Completed 0 15m
Indo mais além, podemos avaliar o comportamento do Job através dos logs do Pod.
# logs do loop declarado no command do Pod
$ kubectl logs pods/counter-94cf5
1
2
3
O autor disponibiliza um exemplo declarativo do Job equivalente ao que foi criado pelo comando no inicio da página.
apiVersion: batch/v1
kind: Job
metadata:
name: counter
spec:
template:
spec:
containers:
- name: counter
image: nginx
command:
- /bin/sh
- -c
- counter=0; while [ $counter -lt 3 ]; do counter=$((counter+1)); \\
echo "$counter"; sleep 3; done;
restartPolicy: Never
Referência de campos para o Job.