CronJobs está disponible de forma general en Google Kubernetes Engine (GKE) 1.21 y versiones posteriores. En este documento se explica cómo ejecutar CronJobs en GKE. Los CronJobs son una función integrada de Kubernetes. Para obtener más información, consulta la documentación de Kubernetes sobre CronJobs.
Información general
Los CronJobs crean Jobs de Kubernetes según una programación periódica. Los CronJobs te permiten automatizar tareas periódicas, como crear copias de seguridad, generar informes, enviar correos o realizar tareas de limpieza.
Los CronJobs se crean, gestionan, escalan y eliminan de la misma forma que los Jobs. El número exacto de objetos Job creados depende de varios factores. Para obtener más información, consulta Limitaciones de CronJob.
Para obtener más información sobre los trabajos, consulta Ejecutar un trabajo.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
Crear una tarea cron
Puedes crear un CronJob con un archivo de manifiesto. Por ejemplo, el siguiente manifiesto YAML imprime la hora actual y una cadena una vez por minuto, al tiempo que conserva los valores predeterminados de los parámetros de CronJob:
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello, World!"
restartPolicy: OnFailure
Para crear este CronJob, guarda el manifiesto YAML en un archivo y aplícalo al clúster:
kubectl apply -f PATH_TO_FILE
Sustituye PATH_TO_FILE
por la ruta al manifiesto YAML.
Configurar un CronJob
Puede especificar los siguientes parámetros al crear un CronJob:
- Cuando se ejecuta CronJob
- Qué hace el CronJob
- Fecha límite para que se inicie la tarea cron
- Indica si se permiten trabajos simultáneos para CronJob
- Si los nuevos trabajos se suspenden
- Número de ejecuciones que CronJob guarda en su historial
Especificar cuándo se ejecuta el CronJob
El campo spec.schedule
define cuándo y con qué frecuencia se ejecuta CronJob. Para ello, se usa el formato crontab
estándar de Unix. Todas las horas de CronJob están en UTC. Hay cinco campos separados por espacios.
Estos campos representan lo siguiente:
- Minutos (entre 0 y 59)
- Horas (entre 0 y 23)
- Día del mes (entre 1 y 31)
- Mes (entre 1 y 12)
- Día de la semana (entre 0 y 6, empezando por el domingo)
Puedes usar los siguientes caracteres especiales en cualquiera de los campos spec.schedule
:
?
es un valor comodín que coincide con un solo carácter.*
es un valor comodín que coincide con cero o más caracteres./
permite especificar un intervalo para un campo. Por ejemplo, si el primer campo (el de los minutos) tiene el valor*/5
, significa "cada 5 minutos". Si el quinto campo (el campo del día de la semana) se define como0/5
, significa "cada quinto domingo".
Especificar lo que ejecuta CronJob
El spec.jobTemplate
describe lo que hace CronJob, incluidas sus imágenes de contenedor, los comandos que ejecutan los contenedores y la política de reinicio de CronJob. Para obtener más información sobre lo que debe incluir en spec.jobTemplate
, consulte la documentación de CronJob de Kubernetes.
Especificar un plazo límite
El campo opcional startingDeadlineSeconds
indica el número máximo de segundos que puede tardar en iniciarse el CronJob si no se inicia a la hora programada por cualquier motivo. Los CronJobs perdidos se consideran errores.
Para especificar una fecha límite, añade el valor startingDeadlineSeconds
al campo spec
de CronJob en el archivo de manifiesto. Por ejemplo, el siguiente archivo manifiesto especifica que la tarea cron tiene 100 segundos para comenzar:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
jobTemplate:
spec:
...
Especificar una política de simultaneidad
El campo opcional spec.concurrencyPolicy
especifica cómo tratar las ejecuciones simultáneas de un trabajo creado por el controlador CronJob. Si no defines ningún valor, se permitirán varios trabajos simultáneos de forma predeterminada.
concurrencyPolicy
acepta los siguientes valores:
Valor | Significado |
---|---|
Allow |
Se permiten las tareas simultáneas. Este es el valor predeterminado. |
Forbid |
No se permiten los trabajos simultáneos y no se pueden iniciar nuevos trabajos hasta que se hayan completado los anteriores o se haya agotado el tiempo de espera. |
Replace |
No se permiten tareas simultáneas y las tareas antiguas se cancelan en favor de las nuevas. |
Suspender ejecuciones posteriores
El campo spec.suspend
opcional, cuando se define como true
, impide que se ejecuten nuevos trabajos, pero permite que finalicen las ejecuciones actuales.
Especificar los límites del historial
Un CronJob crea un Pod cada vez que se ejecuta. En Ver el historial de CronJob se explica cómo ver el estado de finalización de las ejecuciones recientes de un CronJob, así como los registros de un Pod concreto.
Puedes configurar el número de ejecuciones correctas y fallidas de CronJob que se guardan especificando valores para spec.successfulJobsHistoryLimit
y spec.failedJobsHistoryLimit
. De forma predeterminada, successfulJobsHistoryLimit
tiene el valor 3 y failedJobsHistoryLimit
tiene el valor 1.
Por ejemplo, el siguiente manifiesto indica a GKE que guarde un máximo de cinco ejecuciones de CronJob correctas y un máximo de diez ejecuciones de CronJob fallidas:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
Para inhabilitar la conservación del historial de ejecuciones de CronJob correctas o fallidas, asigna el valor 0
a la opción correspondiente. Si inhabilitas la conservación del historial, puede que sea más difícil depurar los errores. Por ejemplo, el siguiente manifiesto indica a GKE que solo guarde las ejecuciones fallidas de CronJob:
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
Inspeccionar una tarea cron
Para comprobar la configuración de un CronJob, usa kubectl describe
:
kubectl describe cronjob CRONJOB_NAME
Sustituye CRONJOB_NAME
por el nombre del CronJob que quieras inspeccionar.
Ver el historial de CronJob
Una tarea cron se ejecuta en un pod. De forma predeterminada, Kubernetes conserva los registros de los pods finalizados que representan las tres últimas ejecuciones correctas de un CronJob y el Job fallido más reciente. Puedes cambiar o inhabilitar estos valores predeterminados modificando los límites del historial de CronJob.
Para ver el historial de un CronJob, primero debes enumerar todos los pods. Las tareas cron completadas se muestran con el estado Completed
, y las tareas fallidas tienen el estado RunContainerError
, CrashLoopBackOff
u otro que indique un fallo.
NAME READY STATUS RESTARTS AGE
hello-1556555640-9bc5r 0/1 Completed 0 3m6s
hello-1556555700-cm6wk 0/1 Completed 0 2m6s
hello-1556555760-62wf5 0/1 Completed 0 66s
hello-1556555820-rl8kl 0/1 Completed 0 5s
hello-failed-1556555820-wrvt2 0/1 RunContainerError 1 5s
Para ver los registros de un CronJob específico, ejecuta el siguiente comando:
kubectl logs POD_NAME
Sustituye POD_NAME
por el nombre del pod que quieras inspeccionar.
El resultado debería ser similar al siguiente:
container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"
Eliminar una tarea cron
Para eliminar una tarea cron, ejecuta el siguiente comando:
kubectl delete cronjob CRONJOB_NAME
Cuando eliminas un CronJob, el recolector de elementos no utilizados de Kubernetes elimina los Jobs asociados e impide que se inicien nuevos Jobs.
Siguientes pasos
- Consulta la documentación de Kubernetes sobre CronJobs.
- Consulta cómo ejecutar un trabajo único.