Kubernetes CronJob: automatización de tareas

Kubernetes supervisa activamente la ejecución de CronJobs y ejecuta acciones definidas por el usuario si se producen errores. La configuración de Cronjobs en Kubernetes es sencilla a través de archivos YAML.

¿Qué es CronJob en Kubernetes?

Un CronJob es un método para automatizar tareas. Es como un despertador que suena a una hora determinada. Los CronJobs pueden configurarse para que ejecuten automáticamente tareas definidas a horas predefinidas. Un CronJob puede automatizar varios tipos de tareas, tales como como actualizar bases de datos, hacer copias de seguridad de archivos, ejecutar scripts o enviar correos electrónicos a intervalos regulares. Al integrar CronJobs en Kubernetes, las tareas pueden supervisarse y controlarse de forma aislada en contenedores.

Consejo

La orquestación de clústeres con Kubernetes también es fácil de realizar con IONOS. Con la Cloud Empresarial, obtendrás la última tecnología de infraestructura como servicio (IaaS) y soluciones adaptadas a tu proyecto.

Configurar de un CronJob en Kubernetes

La creación de un CronJob es muy similar a la de un job regular en Kubernetes. Para ello, debes crear un archivo de manifiesto YAML. Este es un documento estructurado que contiene todos los detalles relevantes para el CronJob. En este archivo se establecen parámetros importantes, como el cronograma para la ejecución del job, los contenedores y los comandos exactos que se deben ejecutar en esos contenedores.

Crea un archivo YAML

Abre el editor de texto que prefieras para crear el archivo de configuración YAML para el CronJob. Asegúrate de definir el cronograma del CronJob en el formato cron. Añade la definición del job, incluyendo la tarea a ejecutar. Luego, guarda el archivo con la extensión .yaml.

apiVersion: batch/v1 
kind: CronJob 
metadata: 
    name: new_cronjob 
spec: 
    schedule: "0     ****    " 
    jobTemplate: 
        spec: 
            template: 
                spec: 
                    containers: 
                    - name: container 
                        image: image:latest 
                        command:    
                     - /bin/sh
yaml

Añade a la especificación del pod los requisitos de recursos y otras configuraciones, si fuese necesario:

spec: 
    containers: 
    - name: container 
        resources: 
            requests: 
                memory: "64Mi" 
                cpu: "250m" 
            limits: 
                memory: "128Mi" 
                cpu: "500m"
yaml

Activa el CronJob

Ingresa el siguiente comando en una terminal para crear el CronJob en el clúster de Kubernetes:

kubectl apply -f [filename].yaml
shell

Supervisa el CronJob

Ejecuta el siguiente comando para obtener una lista de los CronJobs existentes en Kubernetes, y el modo de observación (Watch) se encargará de actualizar automáticamente la salida cuando cambie el estado de los CronJobs.

kubectl get cronjob --watch
shell

Sintaxis del cronograma del CronJob

La sintaxis del cronograma para los CronJobs de Kubernetes se basa en el formato clásico de cron con cinco campos en el siguiente orden: minuto, hora, día del mes, mes y día de la semana. Aquí un breve resumen:

  • Minuto: (0–59)
  • Hora: (0–23)
  • Día del mes: (1–31)
  • Mes: (1–12 o Jan–Dec)
  • Día de la semana: (0–7 o Sun–Sat)

Caracteres especiales:

  • *: cualquier valor válido para el campo
  • ,: indica varios valores
  • /: indica pasos

Ejemplos:

0 ****: cada hora 15 2 ***: diario a las 2:15 AM 0 0 1 **: el primer día de cada mes a medianoche 0 0 *3*: diario a medianoche en marzo 0 2 ** 1: todos los lunes a las 2 AM

Política de concurrencia de CronJob

La política de concurrencia puede especificarse en la configuración de un CronJob y afecta a cómo se manejan los jobs paralelos dentro del mismo CronJob de Kubernetes.

  • Allow (predeterminado): si la política de concurrencia se establece en __Allow__, se iniciará un nuevo job incluso si el job anterior aún no ha finalizado. Esto significa que pueden ejecutarse varias instancias del mismo job al mismo tiempo.
  • Forbid: con esta configuración, no se iniciará un nuevo job si uno anterior aún no ha finalizado. Esto asegura que en un momento dado solo se ejecute una instancia del job.
  • Replace: los jobs no completados se cancelarán para que los nuevos puedan continuar. No deben ejecutarse instancias del mismo job al mismo tiempo.

Establecer un plazo para la ejecución

El campo startingDeadlineSeconds en un CronJob de Kubernetes indica cuántos segundos después de la hora programada un job puede iniciarse como máximo. Si el job no se inicia dentro de este límite de tiempo, se considerará fallido.

apiVersion: batch/v1 
kind: CronJob 
metadata: 
    name: new_cronjob 
spec: 
    schedule: "0     ****    " 
    startingDeadlineSeconds: 300    
    jobTemplate: 
        spec: 
            template: 
                spec: 
                    containers: 
                    - name: container 
                        image: image:latest 
                        command: 
                     - /bin/sh
yaml

En este ejemplo, el job definido por el CronJob debe iniciarse dentro de los 300 segundos (5 minutos) posteriores al tiempo programado; de lo contrario, se considerará fallido.

Limitar el historial de jobs

En los CronJobs de Kubernetes, las configuraciones spec.successfulJobsHistoryLimit y spec.failedJobsHistoryLimit permiten limitar la cantidad de jobs almacenados en el historial del CronJob. spec.successfulJobsHistoryLimit es un campo opcional que especifica cuántos jobs completados exitosamente deben mantenerse en el historial. Esto es útil para controlar el uso de recursos y asegurarse de que el historial no se sobrecargue con una cantidad excesiva de jobs exitosos. De manera similar, spec.failedJobsHistoryLimit permite controlar la cantidad de jobs fallidos que se mantienen en el historial.

apiVersion: batch/v1beta1 
kind: CronJob 
metadata: 
    name: new_cronjob 
spec: 
    schedule: "0     ****    " 
    successfulJobsHistoryLimit: 3    # Keep only the last 3 successfully completed jobs in history. 
    failedJobsHistoryLimit: 1                    # Keep only the last failed job in history. 
    jobTemplate: 
        spec: 
            template: 
                spec: 
                    containers: 
                    - name: container 
                        image: image:latest 
                        command: 
                     - /bin/sh
yaml

En el ejemplo especificamos mantener solo los últimos tres jobs completados exitosamente y el último job fallido en el historial del CronJob de Kubernetes new_cronjob.

Errores y solución de problemas de un CronJob en Kubernetes

En los CronJobs de Kubernetes pueden producirse varios errores, por lo que debes conocer técnicas eficaces de resolución de problemas. A continuación te indicamos algunas fuentes de error comunes y procedimientos de solución:

El job no se inicia

Cuando un CronJob en Kubernetes no se inicia, puede haber varias causas. Estas pueden incluir un contenedor con una imagen no disponible o defectuosa, así como permisos faltantes para la cuenta de servicio del pod. Para diagnosticar el problema, revisa los registros del contenedor con kubectl logs <pod-name>, los eventos del CronJob con kubectl describe cronjob <cronjob-name>, y los eventos del pod con kubectl describe pod <pod-name>. Asegúrate de que la cuenta de servicio tenga los permisos necesarios revisando los roles y vinculaciones de roles.

Configuración incorrecta del CronJob

Una configuración incorrecta de CronJob puede deberse a errores de sintaxis en el archivo YAML o a configuraciones inválidas para Schedule y RestartPolicy. Para identificar estos problemas, verifica que el archivo YAML tenga una sintaxis y configuraciones correctas. Utiliza kubectl describe cronjob <cronjob-name> para obtener información detallada sobre la configuración y detectar posibles errores o discrepancias.

Límites de recursos excedidos

El exceso de los límites de recursos puede causar que los CronJobs no se ejecuten correctamente. Para solucionar este problema, verifica los límites de recursos en el CronJob y los pods asociados utilizando kubectl describe cronjob <cronjob-name> y kubectl describe pod <pod-name>. Además, puedes monitorear el uso de recursos del clúster con kubectl top nodes y kubectl top pods, ya que pueden proporcionarte información importante. Ajusta los límites de recursos según sea necesario en el archivo YAML.

Si te estás iniciando en la gestión de clústeres en Kubernetes, te recomendamos el tutorial de Kubernetes de nuestra guía digital.

¿Le ha resultado útil este artículo?
Page top