CronJobs

En esta página, se explica cómo ejecutar CronJobs en Google Kubernetes Engine. CronJobs es una característica nativa de Kubernetes. Para obtener más detalles, consulta la documentación de Kubernetes sobre CronJobs.

Descripción general

Puedes usar CronJobs para ejecutar tareas en un momento o intervalo específico. CronJobs es una buena opción para tareas automáticas, como copias de seguridad, informes, envío de correos electrónicos o tareas de limpieza.

CronJobs usa objetos trabajo para completar sus tareas. Un CronJob crea un objeto trabajo cada vez que se ejecuta. Los CronJobs se crean, administran, escalan y borran de la misma manera que los trabajos. Para obtener más información sobre estos objetos, consulta Ejecuta un trabajo.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

Establece la configuración de gcloud predeterminada mediante uno de los siguientes métodos:

  • Usa gcloud init si deseas ver una explicación sobre cómo configurar parámetros predeterminados.
  • Usa gcloud config para establecer el ID, la zona y la región del proyecto de manera individual.

Usa gcloud init

  1. Ejecuta gcloud init y sigue las instrucciones:

    gcloud init

    Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

    gcloud init --console-only
  2. Sigue las instrucciones a fin de autorizar a gcloud para que use tu cuenta de Google Cloud.
  3. Crea una configuración nueva o selecciona una existente.
  4. Elige un proyecto de Google Cloud.
  5. Elige una zona predeterminada de Compute Engine.

Usa gcloud config

  • Establece tu ID del proyecto predeterminado:
    gcloud config set project project-id
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone compute-zone
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada:
    gcloud config set compute/region compute-region
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Crea un CronJob

Este CronJob imprime la hora actual y una string una vez por minuto:

# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

Para crear este CronJob, puedes guardar el manifiesto YAML en un archivo y aplicarlo al clúster con el siguiente comando:

kubectl apply -f filename

Las secciones siguientes proporcionan más detalles sobre cómo especificar cuándo se ejecuta CronJob y lo que se ejecuta en realidad.

Especifica cuándo se ejecuta CronJob

El campo spec.schedule define cuándo y con qué frecuencia se ejecuta CronJob, mediante el formato crontab estándar de Unix. Todos los horarios de CronJob están en UTC. Existen 5 campos, que están separados por espacios. Estos campos representan la siguiente información:

  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)

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.
  • / te permite especificar un intervalo para un campo. Por ejemplo, si el primer campo (el campo minutos) tiene un valor de */5, significa “cada 5 minutos”. Si el quinto campo (el campo día de la semana) se establece en 0/5, significa “cada quinto domingo”.

Especifica qué ejecuta CronJob

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 detalles sobre qué incluir en spec.jobTemplate, consulta la documentación de CronJob de Kubernetes.

Especifica una fecha límite

El campo startingDeadlineSeconds opcional indica la cantidad máxima de segundos que CronJob puede tardar en iniciarse en caso de que no cumpla con su hora programada por alguna razón. Los CronJobs que no se cumplen se consideran errores.

Para especificar una fecha límite, debes agregar el valor startingDeadlineSeconds al campo spec de CronJob en el archivo de manifiesto. Por ejemplo, en el manifiesto siguiente, se especifica que el CronJob tiene 100 segundos para comenzar:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

Si no especificas un valor startingDeadlineSeconds, CronJob nunca agotará el tiempo de espera. Esto podría generar que el mismo CronJob se ejecute varias veces de manera simultánea. Para evitar este tipo de problema, consulta la sección sobre cómo especificar una política de simultaneidad.

Especifica una política de simultaneidad

En el campo opcional spec.concurrencyPolicy, se especifica cómo tratar las ejecuciones simultáneas de un trabajo creado mediante el controlador de CronJob. Si no estableces un valor, se permiten múltiples trabajos simultáneos de forma predeterminada.

concurrencyPolicy acepta los siguientes valores:

Valor Significado
Allow Se permiten trabajos simultáneos. Esta es la opción predeterminada.
Forbid No se permiten trabajos simultáneos; los trabajos nuevos no pueden comenzar hasta que los anteriores se hayan completado o se haya agotado el tiempo de espera.
Replace No se permiten trabajos simultáneos; los trabajos anteriores se cancelan en favor de los nuevos.

Suspende las ejecuciones posteriores

En el campo opcional spec.suspend, cuando se establece en true, evita que se ejecuten trabajos nuevos, pero permite que finalicen las ejecuciones actuales.

Especifica los límites del historial

Un CronJob crea un pod cada vez que se ejecuta. Si deseas ver el estado de rescisión de las ejecuciones recientes de CronJob, así como los registros de un pod individual, puedes consultar la sección ver el historial de CronJob.

Puedes configurar la cantidad de ejecuciones de CronJob fallidas y correctas que se guardan si especificas los valores para spec.successfulJobsHistoryLimit y spec.failedJobsHistoryLimit. Según la configuración predeterminada, se establece successfulJobsHistoryLimit en 3 y failedJobsHistoryLimit en 1.

Si quieres inhabilitar la retención de datos sobre trabajos correctos o fallidos, debes establecer el valor correspondiente en 0. Sin embargo, los errores de depuración pueden ser más difíciles.

Inspecciona un CronJob

Para verificar la configuración de un CronJob, usa kubectl describe:

kubectl describe cronjob cronjob-name

Visualiza el historial de CronJob

Un CronJob se ejecuta dentro de un pod. Según la configuración predeterminada, Kubernetes conserva los registros de pods terminados que representan las últimas tres ejecuciones correctas de un CronJob y el último trabajos con errores. Puedes cambiar o inhabilitar estos valores predeterminados.

Primero, debes enumerar todos los pods para ver el historial de un CronJob. Los CronJobs completados se muestran con un estado Completed y los trabajos con errores tienen un estado RunContainerError, CrashLoopBackOff o, además, otro estado que indica un error.

kubectl get pods

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, usa kubectl logs pod-name:

kubectl logs hello-failed-1556555820-wrvt2

container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"

Borra un CronJob

Para borrar un CronJob, usa kubectl delete:

kubectl delete cronjob cronjob-name

Cuando borras un CronJob, el recolector de elementos no utilizados de Kubernetes borra los trabajos asociados y evita que se inicien nuevos.

Próximos pasos