Trabajos de Kubernetes y trabajos cron

Trabajos de Kubernetes y trabajos cron
La mayoría de las aplicaciones que se ejecutan en un sistema distribuido como Kubernetes siempre están en vivo como servidores web o bases de datos o servidores API. Pero hay una clase separada de objetos que están destinados a ejecutarse de una vez o solo despertarse de vez en cuando y seguir su curso. Los trabajos periódicos como las renovaciones de certificados TLS con agentes como CertBot son un ejemplo clásico de tales trabajos que se ejecutan en servidores tradicionales. Estos se realizan utilizando la utilidad cron en sistemas UNIX.

Kubernetes tiene una forma análoga de ejecutar procesos únicos Trabajos y procesos periódicos como trabajos cron.

Comenzaremos con un ejemplo típico de qué trabajos son y demostraremos un ejemplo estándar de los documentos oficiales. A partir de este ejemplo, será fácil entender lo que significa ejecutar un trabajo con éxito en el contexto de Kubernetes.

Para seguirlo, le recomendaría que use Kataconda Playground para Kubernetes que proporcionará un clúster de Kubernetes fuera de la caja sin que tenga que configurar manualmente uno o arriesgarse a un clúster de producción para experimentos.

Trabajos de Kubernetes

Los trabajos son abstracciones de Kubernetes de nivel superior, similares a los replicesets e implementaciones. Pero a diferencia de las cápsulas administradas por implementaciones y replicasets, las cápsulas que llevan a cabo un trabajo completan su trabajo y salida.

Cuando se completa un número específico de PODS, se dice que el trabajo ha completado con éxito. ¿Cuáles son los criterios que definen una terminación exitosa de una cápsula es algo que definiremos en el archivo YAML del trabajo?. Luego, el controlador de trabajo se asegurará de que una cierta cantidad de pods hayan terminado con éxito y se dice que el trabajo está completo.

Creemos un trabajo que imprima dígitos de PI hasta 2000 lugares en sus registros que examinaremos. Crear un archivo y llamarlo mi trabajo.yaml y guarde los siguientes contenidos en él;

APiversión: Batch/V1
tipo: trabajo
metadatos:
Nombre: Pi
Especificaciones:
plantilla:
Especificaciones:
contenedores:
- Nombre: Pi
Imagen: Perl
Comando: ["perl", "-mbignum = bpi", "-wle", "imprime bpi (2000)"]]
reiniciarpolicy: nunca
Backofflimit: 4

Crea el trabajo, usando este archivo:

$ kubectl create -f ./trabajo.yaml

Notarás que el trabajo tarda unos segundos hasta un par de minutos para funcionar y una vez que esté listo. Cuando intentas enumerar todas las vainas usando:

$ kubectl consigue vainas
Nombre Ready Status Reinicia la edad
PI-WG6ZP 0/1 completado 0 50s

Verá que el estado de la cápsula relacionada con PI es Terminado no correr ni terminar.También puede copiar el nombre de la cápsula para que podamos verificar que PI se haya calculado en 2000 dígitos. El nombre específico de la cápsula puede diferir en su caso.

$ Kubectl Logs PI-WG6ZP

Curiosamente, la cápsula no ha Terminado Todavía es muy activo, solo que no hay aplicaciones que se ejecutan dentro de él. Similar a simplemente encender su computadora y no usarla. Si se terminó la cápsula, no habríamos podido sacar los registros de él, en primer lugar.

Para limpiar el trabajo y todas las vainas que se crearon, ejecute el comando:

$ kubectl eliminar -f my -jubs.yaml

Puede obtener más información sobre las especificaciones del trabajo y cómo escribir su especificación en la documentación oficial.

Trabajos cron

Los trabajos cron son similares a la utilidad de Cron en Unix que se ejecuta periódicamente de acuerdo con un cronograma que deseamos. No es una cosa superestable en Kubernetes, al momento de escribir este escrito, por lo que es posible que desee tener cuidado con. Para citar los documentos oficiales:

"Un trabajo cron crea un objeto de trabajo acerca de Una vez por hora de ejecución de su horario. Decimos "sobre" porque hay ciertas circunstancias en las que se pueden crear dos trabajos, o no se puede crear ningún trabajo. Intentamos hacerlos raros, pero no los eviten por completo. Por lo tanto, los trabajos deben ser idempotente"

El término ideMpotent significa que el trabajo cron, ya sea realizado una o dos veces o cualquier número de tiempo, tendría el mismo efecto en el sistema. Verificar las actualizaciones, monitorear ese tipo de operaciones puede considerarse idempotente. Pero modificar datos o escribir en una base de datos no están entre estos.

Escribamos un trabajo cron que escribiría un "hola, mundo!"Mensaje en sus registros junto con una marca de tiempo de cuándo se escribió ese mensaje. Crear archivo llamado my-cronjob.Yaml y para que escriba los siguientes contenidos:

Apiversión: Batch/V1Beta1
tipo: Cronjob
metadatos:
Nombre: my-cronjob
Especificaciones:
Horario 1 * * * *"
Jobtemplate:
Especificaciones:
plantilla:
Especificaciones:
contenedores:
- Nombre: Hola
Imagen: Busybox
Args:
- /bin/sh
- -C
- fecha; Echo hola desde el clúster de Kubernetes
reinicpolicy: Onfailure

La parte del horario del trabajo es la más crucial. Sigue la Convención CRON estándar, hay una lista de números separados por espacios. Los cinco números representan,

  1. Minuto (0-59)
  2. Hora (0-23)
  3. Día del mes (1-31)
  4. Mes (1-12)
  5. Día de la semana (0-6) a partir del domingo

Usando Asterisk (*) para un campo significa que cualquier valor disponible de ese campo (como un comodín) y la primera entrada en nuestro horario " */1 * * * *" indicó que el trabajo debe ejecutarse cada minuto independientemente de la hora, el día o el mes de el año. Usar */5 imprimirá el mensaje cada 5 minutos.

Puede obtener más información sobre la especificación de Cronjob Yaml en los documentos oficiales. Veamos todas las vainas ejecutándose para el trabajo, que llamamos my-cronjob.

$ kubectl consigue vainas
Nombre Ready Status Reinicia la edad
my-cronjob-15344457100-hfhzf 0/1 completado 0 2m
my-cronjob-15344457160-gk85l 0/1 completado 0 1m
my-cronjob-15344457220-bj22x 0/1 completado 0 57s

Cavar en los registros de cada una de las cápsulas revelaría un solo mensaje con una marca de tiempo, ya que todos fueron creados en diferentes momentos, todos tendrán diferentes marcas de tiempo.

$ kubectl log my-cronjob-1534457100-hfhzf

Para eliminar el Cronjob simplemente ejecute:

$ kubectl delete -f my -cronjob.yaml

Esto también eliminará cualquier vaina que se haya creado en el debido proceso.

Referencias

Puede obtener más información sobre los trabajos de Kubernetes aquí y para los trabajos de Cron puede visitar esta sección de su documentación bien estructurada.