Uso de Job y Cronjob
Aprendamos otro tipo de objeto de recurso hoy: Trabajo. En nuestro trabajo diario, a menudo encontramos algunos requisitos para el procesamiento y análisis de datos por lotes. Por supuesto, también habrá trabajo programado por tiempo. En nuestro grupo, para Proporcionamos Kubernetes
y Job
dos CronJob
recursos objetos para satisfacer nuestras necesidades.
Job
Responsable de las tareas de procesamiento, es decir, tareas que se ejecutan una sola vez, garantiza la Pod
finalización exitosa de una o más de las tareas por lotes. En su lugar CronJob
, Job
se le agrega programación de tiempo.
Trabajo
Usamos Job
este objeto de recurso para crear una tarea, configuramos una Job
para realizar una tarea de cuenta regresiva, definimos YAML
el archivo:
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
Tenga en cuenta Job
que RestartPolicy
solo soporte Never
y OnFailure
dos, no soporte Always
, sabemos Job
que es equivalente a ejecutar una tarea por lotes, y terminará después de la ejecución.Si es compatible, ¿ Always
caerá en un bucle infinito?
Luego, para crear esto Job
, guárdelo como job-demo.yaml
:
$ kubectl create -f ./job.yaml
job "job-demo" created
Entonces podemos ver el Job
objeto de recurso actual:
$ kubectl get jobs
Presta atención a comprobar nuestro Pod
estado, ya través de ella también podemos kubectl logs
comprobar los resultados de ejecución de la tarea actual.
CronJob
CronJob
De hecho, Job
la programación de tiempo se agrega sobre la base de que podemos: ejecutar una tarea en un momento dado, o ejecutarla periódicamente en un momento dado. Este es en realidad muy similar al Linux
que está entre nosotros.crontab
Un CronJob
objeto en realidad corresponde a crontab
una línea en el archivo, y se ejecuta periódicamente de acuerdo con el formato de tiempo configurado Job
, y el formato crontab
es el mismo.
crontab
El formato es el siguiente:
El comando que se ejecutará en el día, mes y semana de tiempo compartido.
La primera columna son los minutos 0~59, la segunda columna son las horas 0~
23), la tercera columna es el día 1~31 , la cuarta columna es el mes 1~12, y la quinta columna es 0~7 (0 y 7 representan el domingo) Comando de la columna 6 para ejecutar
Ahora, CronJob
usamos para administrar nuestra Job
tarea anterior,
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
Kind
Estamos aquí CronJob
. Cabe señalar que .spec.schedule
el campo debe ser llenado. Se utiliza para especificar el ciclo de operación de la tarea. El formato es el mismo que el de y crontab
. El otro campo se .spec.jobTemplate
utiliza para especificar la tarea que se debe realizar. ejecutar Por supuesto, el formato Job
es consistente con eso. Hay algunos campos más que merecen nuestra atención .spec.successfulJobsHistoryLimit
y .spec.failedJobsHistoryLimit
, que indica el límite del historial, es un campo opcional. Especifican cuántos completados y fallidos se pueden mantener Job
, no hay límite por defecto, todos los exitosos y fallidos Job
se mantendrán. Sin embargo, muchos pueden acumularse rápidamente cuando se ejecuta uno Cron Job
, por lo que generalmente se recomienda establecer los valores de estos dos campos. Job
Si establece un límite con un valor de 0, el tipo asociado Job
no se conservará después de la finalización.
A continuación creamos estocronjob
$ kubectl create -f cronjob-demo.yaml
cronjob "cronjob-demo" created
Por supuesto, también se puede kubectl run
utilizar para crear uno CronJob
:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>
$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1202039034 1 1 49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={
.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
$ kubectl delete cronjob hello
cronjob "hello" deleted
Una vez que ya no se necesita un trabajo cron, simplemente se puede eliminar con el comando kubectl:
$ kubectl delete cronjob hello
cronjob "hello" deleted
Esto terminará el trabajo que se está creando. Sin embargo, los trabajos en ejecución no se cancelarán y los trabajos o sus pods no se eliminarán. Para limpiar esos trabajos y pods, debe enumerar todos los trabajos creados por el trabajo cron y luego eliminarlos:
$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1201907962 1 1 11m
hello-1202039034 1 1 8m
...
$ kubectl delete jobs hello-1201907962 hello-1202039034 ...
job "hello-1201907962" deleted
job "hello-1202039034" deleted
...
Una vez que se elimine el Trabajo, los Pods creados por el Trabajo también se eliminarán. Tenga en cuenta que todos los trabajos creados por un trabajo cron llamado "hola" se nombrarán con la cadena de prefijo "hola-". Si desea eliminar todos los trabajos en el espacio de nombres actual, puede eliminarlos inmediatamente con el comando kubectl delete jobs --all.