Seidor
Kubernetes con CronJobs

25 de marzo de 2024

CronJobs en tu entorno Kubernetes

Gestión de cargas de trabajo con Cronjobs en Kubernetes

Kubernetes se ha convertido rápidamente en la herramienta estándar para la gestión de infraestructuras containerizadas.Kubernetes cuenta con variedad de recursos de carga de trabajo disponibles para controlar y administrar pods y contenedores, los más comunes siendo:

  • Deployments
  • ReplicaSets
  • StatefulSets

Éstos se utilizan tanto para crear sistemas como para controlar el comportamiento deseado de las diferentes partes. Aunque estos recursos tienen diferentes propósitos y funcionalidades, todos comparten la operativa de mantener los sistemas levantados en caso de fallo, evaluando el estado de contenedores, y reiniciando o reprogramando (“rescheduling”) las partes relevantes en caso necesario.

No obstante, hay otros recursos de carga de trabajo disponibles:

  • Job
  • Cronjobs
  • Work queues

En esta entrada de blog, nos centramos en los Cronjobs: su función y las opciones de customización disponibles.

Qué es un cron?

Los “crons” son una utilidad común de Linux / UNIX que se utiliza para programar tareas (generalmente scripts o comandos) para que se ejecuten periódicamente en horas, fechas o intervalos fijos. Son útiles para tareas periódicas y recurrentes, tales como sondeos, envío de correos electrónicos, recogida de estadísticas o crear copias de seguridad de bases de datos.

Qué es un Job (en Kubernetes)?

Un Job crea un Pod, el cual irá trackeando para asegurar que termine exitosamente. Si el pod fallara, el Job continuará creando Pods hasta que el/(los) Pod(s) terminen exitosamente. En el correspondiente archivo YAML, se designa un número específico de finalizaciones exitosas. El Job hará seguimiento de las terminaciones exitosas hasta que se complete la cantidad designada de Pods, tras el cual el Job quedará completo.

Qué es un CronJob (en Kubernetes)?

Un CronJob es una tarea que garantiza que se cree un Job en horas, fechas o intervalos específicos. Ofrecen la posibilidad de:

Containerizar crones:

Esto asegura una mejorada fiabilidad en cuanto a ejecución de crons. Siendo crons ejecutados de modo serverless, si un servidor pertinente cae, los CronJobs continúan ejecutándose

Amplias opciones de customización:

Permite una amplia customización de la tarea en cuestión, lo que garantiza la flexibilidad de la tarea inherente. En la siguiente sección, junto con un ejemplo, evaluaremos el manifiesto de un recurso CronJob.

Aqui tenéis un job ejemplo:

CronJob

Como con todos los demás recursos Estos valores se deberán estipular:

  • ApiVersion: versión utilizada por el clúster
  • Kind: CronJob
  • Metadata: información pertinente al CronJob, como son: (hay más variables disponibles en este bloque, si bien no son necesarias)
  • Name: $${nombre deseado para CronJob}
  • Namespace: ${namespace where you will host CronJob}
  • Spec: dentro de este bloque necesario, algunos valores son necesarios y otros opcionales:

Necesarios

  • Schedule: especifica la fecha, horas o intervalos en los que ejecutar el Job

(Para mayor información sobre la transcripción a expresiones cron, hay múltiples links, tal y como crontab

  • JobTemplate: Aquí se crea el patrón del Job que el CronJob generará

Opcional:

  • StartingDeadlineSeconds: Plazo permitido de tiempo (segundos) en el que comenzar un Job despues de que haya pasado su momento designado de ejecución.

Es decir, en el caso que un Job no se ejecutara en su momento designado y se sopasara el plazo permitido de tiempo, el Job será terminado y se programará uno nuevo. El Job fallido se marcará como un Missed Schedule.
Dato: El Controller del CronJob mantiene la cuenta sobre cuantos Missed Schedules le hayan acontecido a un CronJob. Cuando un CronJob tiene más de 100 Missed Schedules, dejará de ejecutarse.
Valor por defecto=Sin plazo de tiempo

  • ConcurrencyPolicy: Especifica el comportamiento respecto la ejecución de Jobs concurrentes. Solo una de las siguientes opciones puede ser seleccionada:
  • Allow: Permite la ejecución de Jobs concurrentes
  • Forbid: No permite la ejecución de Jobs concurrentes. Es decir, si hay un Job programado, pero el anterior sigue en ejecución, el nuevo será saltado.
  • Replace: No permite la ejecución de Jobs concurrentes. Es decir, si hay un Job programado, pero el anterior sigue en ejecución, el nuevo Job substituirá al viejo.Valor por defecto=Allow
  • Suspend: Suspende todas las subsecuentes ejecuciones del CronJob. (No se aplica a Jobs ya comenzados)Valor por defecto=false.
  • SuccessfulJobsHistoryLimit: Estipula cuantos Jobs completados exitosamente se conservan. (Asignar un valor de 0 indica que no se mantiene ningún Job completado exitosamente)Valor por defecto=3
  • FailedJobsHistoryLimit: Estipula cuantos Jobs fallidos se conservan. (Asignar un valor de 0 indica que no se mantiene ningún Job fallido)Valor por defecto=1