Trabajos en Kubernetes

Un trabajo crea uno o más pods para realizar una operación concreta y se asegura de que los pods terminen con éxito. Cuando un número especificado de pods finaliza con éxito, el trabajo está completo. Cuando un trabajo se elimina, borra los Pods que creó. Un Job también puede utilizarse para ejecutar varios Pods en paralelo.

Para saber más sobre los Jobs de Kubernetes, haz clic aquí.

En este artículo, veremos la implementación de un job simple, un job con límite de tiempo y un cronjob.

Requisitos previos

  1. Cluster de Kubernetes con al menos 1 nodo trabajador.
    Si quieres aprender a crear un Cluster de Kubernetes, haz clic aquí. Esta guía te ayudará a crear un clúster Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 de AWS Ubuntu 18.04.

¿Qué haremos?

  1. Crear trabajos

Crear trabajos

Trabajo simple

Crea un archivo de definición de puertos multicontenedores con el siguiente contenido.

vim simple-job-1.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: simple-job-1
spec:
  template:
    spec:
      containers:
        - name: job-1
          image: busybox
          args:
            - /bin/sh
            - -c
            - date; echo sleeping....; sleep 30s; echo exiting!; date
      restartPolicy: Never

simple-job-defination

Obtén una lista de los pods y trabajos existentes en el Cluster de Kubernetes y crea un trabajo utilizando los siguientes comandos.

kubectl get pods
kubectl get jobs
kubectl create -f simple-job-1.yml

crear-un-trabajo-simple

En la captura de pantalla anterior, puedes ver que no hay pods y trabajos en el clúster existente y que se ha creado un nuevo trabajo.

Cuando creas un trabajo, se crea un pod con el nombre del trabajo junto con el trabajo.

Puedes obtener el pod y el trabajo utilizando los siguientes comandos.

kubectl get pods
kubectl get jobs

get-simple-job-pod

En la captura de pantalla anterior, puedes ver que el trabajo se completa tras su ejecución.

Cuando ya no necesites el trabajo, puedes eliminarlo utilizando el siguiente comando.

kubectl delete -f simple-job-1.yml
kubectl get pods
kubectl get jobs

borrar-el-trabajo-simple

Un trabajo con el límite de tiempo de ejecución

Puedes forzar un límite de tiempo en el trabajo que asegure que el trabajo debe completar su ejecución dentro del límite de tiempo especificado.

Crea un archivo de definición del trabajo con el siguiente contenido.

vim enforce-time-limit-job-2.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: enforce-time-limit-job-2
spec:
  activeDeadlineSeconds: 20
  template:
    spec:
      containers:
        - name: job-2
          image: busybox
          args:
            - /bin/sh
            - -c
            - date; echo some task which should complete in 30 secs....but due to activeDeadlineSeconds=5 will get terminated within 5 secs before its completetion; sleep 30s; echo exiting!; date 
restartPolicy: Never

definición del trabajo

Obtén de nuevo una lista de pods y trabajos en el cluster de Kubernetes y crea un trabajo utilizando el archivo anterior.

kubectl get jobs
kubectl get pods
kubectl create -f enforce-time-limit-job-2.yml

crear un trabajo

Después de crear el trabajo, si compruebas sus detalles, podrás observar que el pod que se creó después de crear el trabajo termina antes de su finalización, es decir, no se ejecuta durante 30 segundos y se termina

Comprueba la razón de su finalización utilizando el siguiente comando

kubectl get pods
kubectl  get jobs enforce-time-limit-job-2 -o yaml

razón de la terminación del trabajo

En la captura de pantalla anterior, en la primera línea, puedes ver que hemos especificado activeDeadlineSeconds=20. Y hemos especificado sleep=30 segundos. Esto significa que nuestro pod debería haber estado vivo durante 30 segundos, pero se ha terminado en 20 segundos.

Ahora, para eliminar el trabajo, puedes utilizar el siguiente comando.

kubectl delete -f enforce-time-limit-job-2.yml
kubectl get jobs

borrar el trabajo con límite de tiempo forzado

Cronjob

Para crear un trabajo cronjob como un objeto en Kubernetes, crea un archivo con el siguiente contenido. Este cronjob en Kubernetes es igual que el Cronjob en Linux.

vim cronjob-3.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-3
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: cronjob-container
              image: busybox
              args:
                - /bin/sh
                - -c
                - date; echo sleeping for 5 secs....; sleep 5s; echo exiting...;
          restartPolicy: Never

cronjob-definicion

La definición anterior dice que el trabajo se creará cada 1 minuto y durará 5 segundos.

Utiliza los siguientes comandos para obtener una lista de trabajos y pods existentes y crear un cronjob.

kubectl get jobs
kubectl get pods
kubectl create -f cronjob-3.yml

crear-un-cronjob

Para ver que el nuevo trabajo se crea cada 1 minuto para completar la tarea definida, utiliza el siguiente comando.

kubectl  get jobs -w

observar-trabajos-de-cron corriendo-después-de-un-minuto

Ahora puedes comprobar los registros en los que puedes observar que el trabajo se inicia cada 1 minuto.

kubectl get pods
kubectl logs cronjob-3-1594359720-jfkcl

comprobar-registros-del-podo-individual

En la captura de pantalla anterior, puedes ver los registros de los diferentes pods que se crearon como parte del trabajo después de cada minuto.

Esto significa que el trabajo se ha activado cada minuto.

Cuando ya no necesites el trabajo, puedes eliminarlo con el siguiente comando.

kubectl delete -f cronjob-3.yml
kubectl get pods
kubectl get jobs

suprimir el trabajo del cronista

Conclusión

En este artículo hemos aprendido a crear un trabajo sencillo en Kubernetes. Hemos visto cómo podemos imponer el límite de tiempo al trabajo para asegurarnos de que éste no se ejecuta durante demasiado tiempo. Al final, vimos los pasos para crear un cronjob que se crea por sí mismo para realizar la tarea a la hora especificada. Este objeto Cronjob en Kubernetes es similar al trabajo Cronjob en Linux.

También te podría gustar...