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.
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
yamlAñ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"
yamlActiva el CronJob
Ingresa el siguiente comando en una terminal para crear el CronJob en el clúster de Kubernetes:
kubectl apply -f [filename].yaml
shellSupervisa 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
shellSintaxis 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
yamlEn 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
yamlEn 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.