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

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de haber habilitado la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de haber instalado el SDK de Cloud.
  • 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

Si deseas crear este CronJob, puedes guardar el manifiesto YAML en un archivo y aplicarlo al clúster mediante 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 información 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)

Puedes usar los caracteres especiales siguientes 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.

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 valores siguientes:

Valor Significado
Allow Se permiten trabajos simultáneos. Esta es la opción predeterminada.
Forbid No se permiten trabajos simultáneos, y los 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, y los 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 [CRON_JOB]

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 visualizar los registros de un CronJob específico, usa kubectl get logs con el nombre del pod:

kubectl get 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 [CRON_JOB]

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

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine