Mesmo depois de completar uma atividade, o Pod controlado por um CronJob não é deletado automaticamente. Manter um registro histórico de Pods pode ser extremamente útil para realizar troubleshooting de workloads com falha ou inspecionar logs. Por padrão, o CronJob retém os últimos três Pods executados com sucesso e o último com falha.

$ kubectl get cronjobs current-date -o yaml | grep successfulJobsHistoryLimit:
  successfulJobsHistoryLimit: 3
$ kubectl get cronjobs current-date -o yaml | grep failedJobsHistoryLimit:
  failedJobsHistoryLimit: 1

Para configurar os limites de retenção de Pods, defina novos valores para os atributos: spec.successfulJobsHistoryLimit e spec.failedJobsHistoryLimit. O exemplo abaixo mantém as últimas 5 execuções bem-sucedidas e as últimas 3 mal-sucedidas.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: current-date
spec:
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 3
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: current-date
            image: nginx
            args:
            - /bin/sh
            - -c
            - 'echo "Current date: $(date)"'
          restartPolicy: OnFailure

Criando CronJob manualmente acompanhando a documentação do Kubernetes.

# Avaliando API disponivel
$ kubectl api-resources | grep "^cronjobs"
	NAME          SHORTNAMES   APIVERSION  NAMESPACED   KIND
	cronjobs      cj           batch/v1    true         CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-job
  labels:
    section: 06-pod-design
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          name: cronjob-pod
        spec:
          containers:
            - image: nginx
              name: nginx
							command: ["/bin/sh", "-c"]
							args: ["echo \\"Current date: $(date)\\""]
          restartPolicy: Never
      parallelism: 1
      completions: 1
      backoffLimit: 5
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 2

Forçando um erro no command para avaliar a retenção de pods mal-sucedidos

command: ["/bin/sh", "-c"]
args: ["comando-inexistente --force --error"]
# Resultado esperado...
$ kubectl get cronjobs,pods
	NAME                     SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
	cronjob.batch/cron-job   * * * * *   False     1        35s             38s

	NAME                          READY   STATUS              RESTARTS   AGE
	pod/cron-job-27527127-fcx9b   0/1     Error               0          35s
	pod/cron-job-27527127-nlnwp   0/1     Error               0          33s
	pod/cron-job-27527127-xckw4   0/1     Error               0          23s
	pod/cron-job-27527127-z6lx9   0/1     ContainerCreating   0          3s

Documentação Kubernetes

CronJob

Referência de campos para o CronJob.