Jobs en Kubernetes
En más de un cliente he visto que una de las razones por la que usan Kubernetes es para la ejecución de tareas de forma escalable y programable. Ya sean trabajos de Spark, transcodificación de video, proyectos de machine learning, etcétera. Hoy vamos a ver cómo funcionan los jobs en Kubernetes.
Qué es un job
Por si no estás familiarizado/a con el concepto, un job o trabajo, también conocido como tareas, es la ejecución de un programa que tiene un principio y un fin. Es decir, no es una aplicación que está continuamente ejecutándose, como puede ser un sitio web o un proceso en segundo plano como veíamos en el artículo anterior.
Su estructura en YAML es la siguiente:
Para este ejemplo, voy a lanzar un job que, utilizando como imagen ubuntu, simplemente cuenta desde cero hasta 15. Puedes crearlo como el resto de recursos a través del siguiente comando:
Los jobs de tu clúster puedes recuperarlos así:
Estos trabajos se apoyan en pods, que son los que van a realizar las tareas. Sin embargo, una vez que finalice permanecerá con el estado Completed entre tus pods.
kubectl get pods
Esto es así para que puedas revisar los logs incluso después de haber finalizado.
kubectl logs countdown-8vgl5
Como el resto de recursos vistos hasta ahora, también tienen su sección en el dashboard de Kubernetes:
Jobs en el dashboard de Kubernetes
Para volver a ejecutar un trabajo deberás eliminarlo y volver a crearlo o bien utilizar CronJobs, que veremos después.
Tipos de tareas
Podríamos decir que es posible configurar tres tipos de tareas:
Tareas simples
Se tratan de aquellas que solamente se ejecutan una vez, que es el ejemplo que hemos visto, con un único pod.
Tareas secuenciales
Tareas por lotes que se ejecutan de manera secuencial, es decir una detrás de otra. Modificando nuestro ejemplo quedaría de la siguiente manera:
Simplemente añadiendo la propiedad completions y el número de veces que queremos que se ejecute se lanzará la tarea N veces de manera secuencial.
Tareas en paralelo
Por último, también tenemos la posibilidad de crear tareas que se lancen en paralelo:
Junto con la propiedad completions, si añadimos la propiedad parallelism conseguimos que el número de tareas elegido se pueda paralelizar hasta el número especificado en esta propiedad.
Paralelizando jobs con parallelism
Programar tareas con CronJob
Otro de los escenarios frecuentes es que sea necesario programar ciertas tareas. Para ello, existe otro recurso llamado CronJob que funciona de la misma manera que un cron de Linux. Siguiendo el ejemplo anterior, podemos modificarlo para que el mismo se ejecute
cada minuto:
Como puedes ver, el formato es bastante similar solo que utilizamos la típica expresión de cron en la propiedad schedule para indicar cada cuánto queremos que se ejecute esta tarea. Crea el cronjob:
Y comprobarás que el mismo se lanza cada minuto.
kubectl get cronjobs
En el dashboard podrás ver más información, como cuántos pods se han lanzado, hace cuánto, los eventos relacionados, etcétera:
Cron Jobs en el dashboard de Kubernetes
¡Saludos!