CronJobs


CronJobs è disponibile a livello generale (GA) in Google Kubernetes Engine (GKE) versione 1.21 e successive. Questo documento spiega come eseguire CronJob in GKE. I cron job sono una funzionalità integrata di Kubernetes. Per ulteriori dettagli, consulta la documentazione di Kubernetes sui CronJob.

Panoramica

I CronJob creano job Kubernetes in base a una pianificazione ripetuta. I CronJob ti consentono di automatizzare attività regolari come l'esecuzione di backup, la creazione di report, l'invio di email o le attività di pulizia.

I CronJob vengono creati, gestiti, scalati ed eliminati nello stesso modo dei job. Il numero esatto di oggetti Job creati dipende da diversi fattori. Per ulteriori informazioni, vedi Limitazioni di CronJob.

Per saperne di più sui job, vedi Esecuzione di un job.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Creazione di un CronJob

Puoi creare un CronJob utilizzando un file manifest. Ad esempio, il seguente manifest YAML stampa l'ora corrente e una stringa una volta al minuto, mantenendo i valori predefiniti per i parametri 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

Per creare questo CronJob, salva il manifest YAML in un file e applicalo al cluster:

kubectl apply -f PATH_TO_FILE

Sostituisci PATH_TO_FILE con il percorso del manifest YAML.

Configurazione di un CronJob

Quando crei un CronJob, puoi specificare i seguenti parametri:

Specificare quando viene eseguito il CronJob

Il campo spec.schedule definisce quando e con quale frequenza viene eseguito il CronJob, utilizzando il formato standard crontab di Unix. Tutti gli orari di CronJob sono in UTC. Sono presenti cinque campi, separati da spazi. Questi campi rappresentano quanto segue:

  1. Minuti (compresi tra 0 e 59)
  2. Ore (tra 0 e 23)
  3. Giorno del mese (tra 1 e 31)
  4. Mese (tra 1 e 12)
  5. Giorno della settimana (tra 0 e 6 a partire da domenica)

Puoi utilizzare i seguenti caratteri speciali in uno qualsiasi dei campi spec.schedule:

  • ? è un valore jolly che corrisponde a un singolo carattere.
  • * è un valore jolly che corrisponde a zero o più caratteri.
  • / ti consente di specificare un intervallo per un campo. Ad esempio, se il primo campo (il campo dei minuti) ha un valore di */5, significa "ogni 5 minuti". Se il quinto campo (il campo del giorno della settimana) è impostato su 0/5, significa "ogni quinta domenica".

Specificare cosa esegue il CronJob

Il file spec.jobTemplate descrive cosa fa CronJob, incluse le immagini dei container, i comandi eseguiti dai container e la norma di riavvio per CronJob. Per ulteriori dettagli su cosa includere in spec.jobTemplate, consulta la documentazione di Kubernetes CronJob.

Specifica di una scadenza

Il campo facoltativo startingDeadlineSeconds indica il numero massimo di secondi che CronJob può impiegare per avviarsi se non viene avviato all'ora pianificata per qualsiasi motivo. I CronJob non riusciti vengono considerati errori.

Per specificare una scadenza, aggiungi il valore startingDeadlineSeconds al campo spec di CronJob nel file manifest. Ad esempio, il seguente manifest specifica che il CronJob ha 100 secondi per iniziare:

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

Specificare una policy di concorrenza

Il campo facoltativo spec.concurrencyPolicy specifica come trattare le esecuzioni simultanee di un job creato dal controller CronJob. Se non imposti un valore, per impostazione predefinita sono consentiti più job simultanei.

concurrencyPolicy accetta i seguenti valori:

Valore Significato
Allow Sono consentiti job simultanei. Questa è l'impostazione predefinita.
Forbid I job simultanei sono vietati e i nuovi job non possono essere avviati finché quelli precedenti non sono stati completati o non è scaduto il relativo timeout.
Replace I job simultanei sono vietati e i job precedenti vengono annullati a favore di quelli nuovi.

Sospensione delle esecuzioni successive

Il campo facoltativo spec.suspend, se impostato su true, impedisce l'esecuzione di nuovi job, ma consente il completamento delle esecuzioni correnti.

Specificare i limiti della cronologia

Un CronJob crea un pod ogni volta che viene eseguito. La visualizzazione dello stato di terminazione delle esecuzioni recenti di un CronJob, nonché dei log di un singolo pod, è trattata in Visualizzare la cronologia di CronJob.

Puoi configurare il numero di esecuzioni di CronJob riuscite e non riuscite salvate specificando i valori per spec.successfulJobsHistoryLimit e spec.failedJobsHistoryLimit. Per impostazione predefinita, successfulJobsHistoryLimit è impostato su 3 e failedJobsHistoryLimit è impostato su 1.

Ad esempio, il seguente manifest indica a GKE di salvare un massimo di cinque esecuzioni di CronJob riuscite e un massimo di 10 esecuzioni di CronJob non riuscite:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

Puoi disattivare la conservazione della cronologia di esecuzione di CronJob riusciti o non riusciti impostando il valore corrispondente su 0. La disattivazione della conservazione della cronologia potrebbe rendere più difficile il debug degli errori. Ad esempio, il seguente manifest indica a GKE di salvare solo le esecuzioni di CronJob non riuscite:

kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

Ispezione di un CronJob

Per controllare la configurazione di un CronJob, utilizza kubectl describe:

kubectl describe cronjob CRONJOB_NAME

Sostituisci CRONJOB_NAME con il nome del CronJob da ispezionare.

Visualizzazione della cronologia di CronJob

Un CronJob viene eseguito all'interno di un pod. Per impostazione predefinita, Kubernetes conserva i log dei pod terminati che rappresentano le ultime tre esecuzioni riuscite di un CronJob e il Job non riuscito più recente. Puoi modificare o disattivare questi valori predefiniti modificando i limiti della cronologia di CronJob.

Per visualizzare la cronologia di un CronJob, elenca prima tutti i pod. I CronJob completati vengono visualizzati con lo stato Completed, mentre i job non riusciti hanno lo stato RunContainerError, CrashLoopBackOff o un altro stato che indica un errore.

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

Per visualizzare i log di un CronJob specifico, esegui questo comando:

kubectl logs POD_NAME

Sostituisci POD_NAME con il nome del pod che vuoi ispezionare.

L'output è simile al seguente:

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

Eliminazione di un CronJob

Per eliminare un CronJob, esegui questo comando:

kubectl delete cronjob CRONJOB_NAME

Quando elimini un CronJob, il garbage collector di Kubernetes elimina i Job associati e impedisce l'avvio di nuovi Job.

Passaggi successivi