CronJobs

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:

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:

  1. Minutos (entre 0 y 59)
  2. Horas (entre 0 y 23)
  3. Día del mes (entre 1 y 31)
  4. Mes (entre 1 y 12)
  5. 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 como 0/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