Best practice di Kubernetes. Corretta disattivazione del Terminate

Le migliori pratiche di Kubernetes. Creazione di piccoli contenitori
Le migliori pratiche di Kubernetes. Organizzazione di Kubernetes con gli spazi dei nomi
Le migliori pratiche di Kubernetes. Verifica della vitalità di Kubernetes tramite test di Readiness e Liveness
Le migliori pratiche di Kubernetes. Configurazione delle richieste e dei limiti delle risorse

Best practice di Kubernetes. Corretta disattivazione del Terminate

Un aspetto fondamentale nel funzionamento dei sistemi distribuiti è la gestione dei guasti. Kubernetes aiuta in questo, utilizzando controller che monitorano lo stato del tuo sistema e riavviano i servizi che hanno smesso di funzionare. Tuttavia, Kubernetes può forzare l'arresto delle tue applicazioni per garantire la sostenibilità complessiva del sistema. In questa serie esamineremo come aiutare Kubernetes a svolgere il suo lavoro in modo più efficace e ridurre i tempi di inattività delle applicazioni.

Prima dell'adozione dei contenitori, la maggior parte delle applicazioni funzionava su macchine virtuali o fisiche. Se un'applicazione si bloccava o andava in crash, ci voleva molto tempo per interrompere il compito in esecuzione e ricaricare il programma. Nel peggiore dei casi, qualcuno doveva affrontare questo problema manualmente di notte, nel momento meno opportuno. Se un compito critico era svolto da sole 1-2 macchine operative, un simile guasto era del tutto inaccettabile.
Pertanto, anziché effettuare riavvii manuali, si è iniziato a utilizzare un monitoraggio a livello di processo per riavviare automaticamente l'applicazione in caso di arresto anomalo. Se il programma si blocca, il processo di monitoraggio cattura il codice di uscita e riavvia il server. Con l'emergere di sistemi come Kubernetes, questo tipo di risposta ai guasti di sistema è stato semplicemente integrato nell'infrastruttura.

Kubernetes utilizza un ciclo di eventi "osservazione - registrazione delle differenze - azione" per garantire che le risorse mantengano la loro operatività lungo il percorso dai container ai nodi stessi.

Best practice di Kubernetes. Corretta disattivazione del Terminate

Questo significa che non è più necessario avviare manualmente il monitoraggio dei processi. Se una risorsa non supera il controllo di integrità, Kubernetes provvede automaticamente a fornirle una sostituzione. Allo stesso tempo, Kubernetes fa molto più che monitorare i guasti delle tue applicazioni. Può creare copie aggiuntive dell'applicazione per essere eseguite su più macchine, aggiornare l'applicazione oppure eseguire contemporaneamente più versioni della tua applicazione.
Ci sono molte ragioni per cui Kubernetes può interrompere un contenitore perfettamente sano. Ad esempio, quando si aggiorna il proprio deployment, Kubernetes fermerà lentamente i vecchi pod mentre avvia nuovi pod. Se si disattiva un nodo, Kubernetes interromperà tutti i pod in quel nodo. Infine, se un nodo esaurisce le risorse, Kubernetes disabiliterà tutti i pod per liberare tali risorse.

È quindi fondamentale che la tua applicazione si spenga con un impatto minimo sugli utenti finali e con un tempo di recupero ridotto. Ciò significa che prima di spegnersi deve salvare tutti i dati necessari, chiudere tutte le connessioni di rete, completare il lavoro rimanente e gestire eventuali altre attività urgenti.

In pratica, ciò significa che la tua applicazione deve essere in grado di gestire il messaggio SIGTERM – il segnale di terminazione del processo che è il segnale predefinito per il comando kill nei sistemi operativi Unix. Una volta ricevuto questo messaggio, l'applicazione deve spegnersi.

Dopo che Kubernetes ha deciso di terminare un pod, si innesca una serie di eventi. Esaminiamo ogni passaggio che Kubernetes esegue durante la chiusura di un contenitore o di un pod.

Immaginiamo di voler terminare uno dei pod. A questo punto, smetterà di ricevere nuovo traffico: i contenitori attivi nel pod non saranno interessati, ma tutto il nuovo traffico verrà bloccato.

Best practice di Kubernetes. Corretta disattivazione del Terminate

Analizziamo il hook preStop: si tratta di un comando speciale o di una richiesta HTTP inviata ai contenitori nel pod. Se la tua applicazione non si spegne correttamente alla ricezione di SIGTERM, puoi utilizzare preStop per gestire correttamente la chiusura.

Best practice di Kubernetes. Corretta disattivazione del Terminate

La maggior parte dei programmi termina correttamente alla ricezione del segnale SIGTERM, ma se stai usando codice di terze parti o un sistema che non puoi controllare completamente, il hook preStop è un ottimo modo per innescare una chiusura elegante senza modificare l'applicazione.

Dopo l'esecuzione di questo hook, Kubernetes invierà ai contenitori nel pod un segnale SIGTERM, il quale li avviserà che saranno disattivati a breve. Ricevendo questo segnale, il tuo codice passerà alla fase di spegnimento. Questo processo può includere la chiusura di eventuali connessioni a lungo termine, come connessioni al database o flussi WebSocket, il salvataggio dello stato attuale e simili.

Anche se utilizzi l'hook preStop, è molto importante verificare cosa succede alla tua applicazione quando le invii il segnale SIGTERM, come si comporta, in modo che eventi o cambiamenti nel funzionamento del sistema causati dalla disattivazione del pod non ti colgano di sorpresa.

A questo punto, prima di intraprendere ulteriori azioni, Kubernetes attenderà per il tempo specificato, chiamato terminationGracePeriodSecond, ovvero il periodo di rilascio per una disattivazione corretta alla ricezione del segnale SIGTERM.

Best practice di Kubernetes. Corretta disattivazione del Terminate

Per impostazione predefinita, questo periodo è di 30 secondi. È importante notare che dura parallelamente al preStop hook e al segnale SIGTERM. Kubernetes non aspetterà che il preStop hook e SIGTERM siano completati: se la tua applicazione si arresta prima della fine del periodo di TerminationGracePeriod, Kubernetes passerà immediatamente al passaggio successivo. Assicurati quindi che il valore di questo periodo in secondi sia almeno pari al tempo necessario per arrestare correttamente il pod e, se supera i 30 secondi, aumenta il periodo all’entità necessaria nel YAML. Nell'esempio fornito, è di 60 secondi.

E infine, l'ultimo passaggio: se i container continuano a funzionare dopo il termine del terminationGracePeriod, verrà inviato il segnale SIGKILL e verranno forzatamente rimossi. In questo momento, Kubernetes pulirà anche tutti gli altri oggetti del pod.

Best practice di Kubernetes. Corretta disattivazione del Terminate

Kubernetes interrompe i pod per molti motivi, quindi assicurati che la tua applicazione venga sempre arrestata correttamente per garantire un funzionamento stabile del servizio.

Best practice di Kubernetes. Mappatura dei servizi esterni

Riproduci video

Un po' di pubblicità 🙂

Grazie per essere con noi. Ti piacciono i nostri articoli? Vuoi vedere più contenuti interessanti? Supportaci effettuando un ordine o raccomandandoci ai tuoi conoscenti, VPS cloud per sviluppatori a partire da $4,99, un'alternativa unica ai server entry-level, che abbiamo creato per te: Tutta la verità su VPS (KVM) E5-2697 v3 (6 Core) 10GB DDR4 480GB SSD 1Gbps a partire da $19. Come dividere il server correttamente? (disponibili opzioni con RAID1 e RAID10, fino a 24 core e fino a 40GB DDR4).

Dell R730xd a metà prezzo nel data center Equinix Tier IV ad Amsterdam? Solo da noi 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB a partire da $199 nei Paesi Bassi! Dell R420 — 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — a partire da $99! Scopri di più su Come costruire un'infrastruttura di classe enterprise con server Dell R730xd E5-2650 v4 dal costo di 9000 euro a prezzi stracciati?

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster