Solución de problemas · Kubernetes

¿Tu CronJob de Kubernetes no se ejecuta? Diagnosícalo rápido

Por qué un CronJob de Kubernetes no se ejecuta — suspendido, zona horaria, política de concurrencia, pods fallidos, deadlines superados — y cómo resolverlo.

Un CronJob de Kubernetes añade sus propios modos de fallo sobre el cron normal. Recorre estos pasos en orden.

1. ¿Está suspendido?

Un CronJob suspendido no crea ningún Job:

kubectl get cronjob my-job -o jsonpath='{.spec.suspend}'   # true = suspendido
kubectl patch cronjob my-job -p '{"spec":{"suspend":false}}'

2. Comprueba el schedule y la zona horaria

Por defecto, el schedule se evalúa en la zona horaria del kube-controller-manager (históricamente UTC). Desde Kubernetes 1.27 puedes definirla explícitamente:

spec:
  schedule: "0 2 * * *"
  timeZone: "Europe/Berlin"

3. Revisa los Jobs recientes y los eventos

kubectl get jobs --selector=job-name --sort-by=.metadata.creationTimestamp
kubectl describe cronjob my-job        # eventos: "Created job", "Missed schedule"

“Cannot determine if job needs to be started… missed start window” apunta al problema 4.

4. startingDeadlineSeconds y schedules perdidos

Si el controlador está caído brevemente y se pierden más de 100 schedules, el CronJob deja de planificar por completo hasta que lo corrijas. Define un deadline para que un slot perdido se omita limpiamente:

spec:
  startingDeadlineSeconds: 200
  concurrencyPolicy: Forbid     # evita ejecuciones solapadas

5. El pod se ejecuta pero falla

Un Job creado cuyos pods dan error no siempre es obvio. Inspecciónalo:

kubectl logs job/<job-name>
kubectl describe pod <pod>      # errores de imagen, OOMKilled, problemas de config

Configura backoffLimit y failedJobsHistoryLimit para que los fallos se conserven y sean visibles.

El problema más profundo: un CronJob en verde puede no estar haciendo nada

Que kubectl get cronjob muestre tu job no significa que el trabajo se esté realizando — los pods pueden fallar silenciosamente, los deadlines pueden superarse, un mal despliegue puede suspenderlo. El ruido a nivel de clúster a menudo entierra estos problemas.

Haz que el contenedor del job haga ping a un heartbeat cuando tenga éxito. Si los Jobs dejan de completarse — por cualquier motivo — el ping desaparece y recibes una alerta, independientemente del monitoreo propio del clúster:

# último paso del comando de tu contenedor
curl -fsS https://ping.steadycron.com/<tu-ping-token>