O campo schedule
spec.schedule recebe uma expressão cron de cinco campos, por exemplo "0 */6 * * *" para a cada seis horas. O Kubernetes também aceita macros como @hourly, @daily, @weekly, @monthly e @yearly. Coloque o valor entre aspas no YAML para que os asteriscos não sejam mal interpretados.
Fusos horários com spec.timeZone
Sem fuso horário, os agendamentos são interpretados no fuso do kube-controller-manager, geralmente UTC. Desde o Kubernetes 1.27 você pode definir spec.timeZone com um nome IANA como America/Sao_Paulo. Escolha o mesmo fuso na ferramenta para ver os horários exatos de criação, incluindo mudanças de horário.
Execuções perdidas e concorrência
Se o controlador perder um horário agendado, startingDeadlineSeconds define com quanto atraso um Job ainda pode começar. concurrencyPolicy controla o que acontece quando uma execução ainda está ativa: Allow, Forbid ou Replace. Leve essas configurações em conta ao escolher agendamentos frequentes, como a cada minuto.
Use kubectl create job --from=cronjob/<nome> <nome-do-job> para iniciar uma execução imediata durante os testes, e kubectl get cronjob para conferir as colunas LAST SCHEDULE e ACTIVE. Os eventos do objeto CronJob explicam por que um horário agendado foi pulado ou por que um Job não conseguiu iniciar.
Um manifesto mínimo
Um CronJob usa apiVersion batch/v1 e kind CronJob, com spec.schedule, um spec.timeZone opcional e um jobTemplate que descreve o Pod a executar. Defina suspend: true para pausar o agendamento sem apagá-lo, e use successfulJobsHistoryLimit e failedJobsHistoryLimit para controlar quantos Jobs concluídos ficam guardados para depuração.
Perguntas frequentes
- O CronJob do Kubernetes suporta segundos?
- Não. O agendamento tem cinco campos, então o menor intervalo é de um minuto.
- Posso usar CRON_TZ no agendamento?
- Não. Os prefixos TZ e CRON_TZ não são suportados; use o campo spec.timeZone.
- O que significa 0 */6 * * *?
- A cada seis horas, na hora cheia: 00:00, 06:00, 12:00 e 18:00.
- Por que meu CronJob rodou duas vezes ou não rodou?
- Verifique startingDeadlineSeconds e concurrencyPolicy, e se o controlador estava fora do ar. CronJobs buscam criar cerca de um Job por horário agendado, mas não garantem isso.