# CronJob in Kubernetes: automazione delle attività

Kubernetes è in grado di monitorare attivamente l’esecuzione dei CronJob e di eseguire azioni personalizzate dall’utente in caso di errori. La configurazione dei CronJob in Kubernetes è facile grazie ai file YAML.

## Che cos’è un CronJob?

Un CronJob è un modo per **automatizzare le attività**. È come una sveglia che suona a una certa ora: ad esempio, puoi configurare un CronJob per eseguire automaticamente attività specifiche a orari predefiniti. Un CronJob ti permette di automatizzare vari tipi di attività, come l’aggiornamento dei database, il backup dei file, l’esecuzione di script o l’invio di e-mail a intervalli regolari. Grazie alla sua integrazione in Kubernetes, è possibile monitorare le attività e controllarle nei container isolandole.

Consiglio [Managed Kubernetes](https://cloud.ionos.it/managed/kubernetes "Managed Kubernetes di IONOS") di IONOS mette a tua disposizione un’infrastruttura ad alte prestazioni in cui configurare i nodi di lavoro in base alle tue esigenze personali. Questa soluzione completa di gestione cloud di IONOS offre un funzionamento ottimale del tuo cluster Kubernetes.

## Kubernetes: configurazione del CronJob

La creazione di un CronJob è molto simile alla creazione di un normale job in Kubernetes. A tal fine devi creare un **file manifest YAML**. Questo file è una descrizione strutturata che contiene tutti i dettagli rilevanti per il CronJob. Nel file sono impostati parametri importanti come la pianificazione dei tempi di esecuzione del job, i container e i comandi esatti da eseguire in tali container.

### Creazione di un file YAML

Apri un editor di testo a tua scelta per creare il file di configurazione YAML per il CronJob. Assicurati di definire la pianificazione dei tempi nel **formato Cron**. Aggiungi la definizione del job, inclusa l’attività da eseguire. Quindi salva il file con l’estensione `.yaml`.

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0    **     ** "
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command: 
                     - /bin/sh
```

Se necessario, aggiungi i requisiti delle risorse e altre impostazioni alle **specifiche del pod**:

```yaml
spec:
    containers:
    - name: container
        resources:
            requests:
                memory: "64Mi"
                cpu: "250m"
            limits:
                memory: "128Mi"
                cpu: "500m"
```

### Attivazione del CronJob

Esegui questo comando in un terminale per creare il CronJob nel cluster Kubernetes:

```shell
kubectl apply -f [filename].yaml
```

### Monitoraggio del CronJob

Se esegui il comando seguente, ottieni un elenco dei CronJob di Kubernetes esistenti. La **modalità Watch** garantisce quindi l’aggiornamento automatico dell’output al cambiare dello stato dei CronJob.

```shell
kubectl get cronjob --watch
```

### Sintassi di schedulazione per CronJob

La **sintassi di schedulazione** per i CronJob in Kubernetes si basa sul classico formato cron con cinque campi disposti in quest’ordine: minuto, ora, giorno del mese, mese e giorno della settimana. Di seguito trovi una breve panoramica:

- Minuto (0–59)
- Ora (0–23)
- Giorno del mese (1–31)
- Mese (1–12 oppure Gen–Dic)
- Giorno della settimana (0–7 oppure Domenica–Sabato)

Caratteri speciali:

- `*`: ogni valore valido per il campo
- `,`: indicazione di più valori
- `/`: indicazione di passi

Esempi:

`0  **   **`: ogni ora `15 2  **  *`: ogni giorno alle ore 2:15 `0 0 1  **`: il primo giorno di ogni mese a mezzanotte `0 0  *3*`: tutti i giorni a mezzanotte nel mese di marzo `0 2  **  1`: ogni lunedì alle 2 del mattino

### Concurrency policy del CronJob

La “concurrency policy” nella configurazione di un CronJob influisce sul modo in cui vengono gestiti i job paralleli all’interno dello stesso CronJob di Kubernetes.

- **Allow (standard)**: se la concurrency policy è impostata su `__Allow__`, viene avviato un nuovo job anche se quello precedente non è stato ancora completato. In pratica è possibile eseguire contemporaneamente più istanze dello stesso job.
- **Forbid**: con questa impostazione, non viene avviato un nuovo job se quello precedente non è ancora stato completato. In questo modo si garantisce che venga eseguita una sola istanza del job per volta.
- **Replace**: i job non completati vengono interrotti per permettere a quelli nuovi di proseguire. Non è consentita l’esecuzione contemporanea di più istanze dello stesso job.

### Definizione del termine per l’esecuzione

Il campo `startingDeadlineSeconds` in un CronJob di Kubernetes specifica quanti secondi dopo l’orario di esecuzione pianificato è possibile avviare un job. Se il job non viene eseguito entro questo limite di tempo, viene considerato **non riuscito**.

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0    **     ** "
    startingDeadlineSeconds: 300 
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command:
                     - /bin/sh
```

In questo esempio, il job definito dal CronJob deve essere avviato entro 300 secondi (5 minuti) dopo l’orario pianificato, altrimenti viene considerato non riuscito.

### Limitazione della cronologia del job

Le impostazioni `spec.successfulJobsHistoryLimit` e `spec.failedJobsHistoryLimit` dei CronJob in Kubernetes permettono di limitare il numero di job conservati nella cronologia del CronJob. Il campo `spec.successfulJobsHistoryLimit` è facoltativo e specifica il numero di job completati con successo che devono essere salvati nella cronologia. Questa possibilità è utile per **controllare l’utilizzo delle risorse** ed evitare di sovraccaricare la cronologia con un numero eccessivo di job completati correttamente. Analogamente, il campo `spec.failedJobsHistoryLimit` consente di gestire il numero di job non riusciti.

```yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0    **     ** "
    successfulJobsHistoryLimit: 3    # Keep only the last 3 successfully completed jobs in history.
    failedJobsHistoryLimit: 1                    # Keep only the last failed job in history.
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command:
                     - /bin/sh
```

Con questo codice specifichiamo di conservare solo gli ultimi tre lavori completati correttamente e l’ultimo lavoro non riuscito nella cronologia del CronJob di Kubernetes `new_cronjob`.

## Errori e risoluzione dei problemi dei CronJob in Kubernetes

Nei CronJob in Kubernetes possono verificarsi diversi errori e quindi è consigliabile conoscere alcune efficaci **tecniche per la risoluzione dei problemi**. A seguire trovi alcune comuni fonti di errori e le possibili soluzioni.

### Il job non parte

Se un CronJob in Kubernetes non si avvia, le cause possono essere diverse. Il problema può essere un’immagine del container non disponibile o **non valida** oppure la mancanza di autorizzazioni sull’account di servizio del pod. Per diagnosticare il problema, esamina i log del container con `kubectl logs <nome-pod>`, gli eventi del CronJob con `kubectl describe cronjob <nome-cronjob>` e gli eventi del pod con `kubectl describe pod < nome-pod>`. Assicurati che l’account di servizio disponga delle autorizzazioni necessarie verificandone il ruolo e l’associazione del ruolo.

### Configurazione CronJob errata

Un’errata configurazione del CronJob può essere dovuta a **errori nella sintassi del file YAML** oppure a impostazioni di schedulazione e RestartPolicy non valide. Per individuare problemi di questo tipo, controlla che la sintassi e le impostazioni nel file YAML siano corrette. Puoi utilizzare `kubectl describe cronjob <nome-cronjob>` per ottenere informazioni dettagliate sulla configurazione e identificare eventuali errori o imprecisioni.

### Superamento dei limiti delle risorse

Il superamento dei limiti delle risorse può causare un funzionamento non corretto dei CronJob. Per risolvere il problema, controlla i limiti delle risorse nel CronJob e nei suoi pod utilizzando `kubectl describe cronjob <nome-cronjob>` e `kubectl describe pod <nome-pod>`. Anche il **monitoraggio dell’utilizzo delle risorse del cluster** con `kubectl top nodes` e `kubectl top pods` può fornire informazioni preziose. Se necessario, modifica i limiti delle risorse nel file YAML.

Per iniziare a lavorare con la gestione dei cluster in Kubernetes ti consigliamo di seguire il [tutorial di Kubernetes](https://www.ionos.it/digitalguide/server/configurazione/tutorial-kubernetes/) nella nostra Digital Guide.


This is a markdown version of: [https://www.ionos.it/digitalguide/server/configurazione/kubernetes-cronjob/](https://www.ionos.it/digitalguide/server/configurazione/kubernetes-cronjob/) for AI/LLM consumption.