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

Documentação Kubernetes

Job

Referência de campos para o Job.

Untitled

Untitled