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>