El campo schedule
spec.schedule acepta una expresión cron de cinco campos, por ejemplo "0 */6 * * *" para cada seis horas. Kubernetes también acepta macros como @hourly, @daily, @weekly, @monthly y @yearly. Pon el valor entre comillas en YAML para que los asteriscos no se interpreten mal.
Zonas horarias con spec.timeZone
Sin zona horaria, las programaciones se interpretan en la zona del kube-controller-manager, que suele ser UTC. Desde Kubernetes 1.27 puedes definir spec.timeZone con un nombre IANA como Europe/Madrid. Elige la misma zona en la herramienta para previsualizar las horas exactas de creación, incluidos los cambios de horario.
Ejecuciones perdidas y concurrencia
Si el controlador se pierde una hora programada, startingDeadlineSeconds decide cuánto tarde puede empezar aún un Job. concurrencyPolicy controla qué pasa cuando una ejecución sigue activa: Allow, Forbid o Replace. Tenlo en cuenta al elegir programaciones frecuentes como cada minuto.
Usa kubectl create job --from=cronjob/<nombre> <nombre-job> para lanzar una ejecución inmediata mientras pruebas, y kubectl get cronjob para revisar las columnas LAST SCHEDULE y ACTIVE. Los eventos del objeto CronJob explican por qué se saltó una hora programada o por qué un Job no pudo arrancar.
Un manifiesto mínimo
Un CronJob usa apiVersion batch/v1 y kind CronJob, con spec.schedule, un spec.timeZone opcional y un jobTemplate que describe el Pod a ejecutar. Pon suspend: true para pausar la programación sin borrarla, y usa successfulJobsHistoryLimit y failedJobsHistoryLimit para decidir cuántos Jobs terminados se conservan para depurar.
Preguntas frecuentes
- ¿Un CronJob de Kubernetes admite segundos?
- No. La programación tiene cinco campos, así que el intervalo mínimo es un minuto.
- ¿Puedo usar CRON_TZ en la programación?
- No. Los prefijos TZ y CRON_TZ no están soportados; usa el campo spec.timeZone.
- ¿Qué significa 0 */6 * * *?
- Cada seis horas en punto: 00:00, 06:00, 12:00 y 18:00.
- ¿Por qué mi CronJob se ejecutó dos veces o ninguna?
- Revisa startingDeadlineSeconds y concurrencyPolicy, y si el controlador estuvo caído. Los CronJobs intentan crear un Job por hora programada, pero no lo garantizan.