A partire dalla versione 1.26, GKE su AWS abilita automaticamente l'arresto normale dei nodi. Questa funzionalità gestisce la terminazione normale dei pod durante gli arresti dei nodi. La terminazione normale consente ai pod di salvare il proprio stato e rilasciare le risorse prima dell'arresto del nodo. Questo metodo di terminazione dei pod riduce al minimo il rischio di perdita di dati. Inoltre, riduce al minimo il rischio di interruzioni di altri pod e servizi che si basano sui pod in fase di arresto o interagiscono con essi, migliorando così la resilienza dei cluster.
Come funziona
Un evento come la manutenzione pianificata, il ridimensionamento dei nodi o un problema hardware attiva l'arresto di un nodo. Il componente kubelet rileva l'evento e avvia il processo di terminazione normale del nodo istruendo systemd a ritardare l'arresto del sistema per una durata specificata. Questo ritardo consente al nodo di eseguire il drain e rimuovere i pod in esecuzione.
L'obiettivo della terminazione normale dei nodi è terminare normalmente sia i pod di sistema non critici sia quelli critici prima dell'arresto del nodo. Vengono utilizzate le seguenti impostazioni predefinite:
ShutdownGracePeriod: 30 secondiShutdownGracePeriodCriticalPods: 15 secondi
Queste impostazioni consentono ai pod non di sistema di terminare normalmente entro 15 secondi prima di essere arrestati forzatamente. I pod di sistema critici hanno 15 secondi di tempo per arrestarsi dopo la terminazione dei pod non di sistema. Tuttavia, poiché la funzionalità opera in base al principio del best effort, è possibile che un nodo non sia in grado di arrestarsi normalmente entro il periodo di 30 secondi designato.
Trigger e limitazioni
Gli eventi che attivano l'arresto normale dei nodi includono eventi pianificati come i seguenti:
- Arresti comandati dall'utente
- Terminazione delle istanze
- Manutenzione pianificata
- Ridimensionamento di un cluster
In questi scenari, kubelet rileva l'evento di arresto del nodo e avvia il processo di arresto normale del nodo.
Al contrario, l'arresto normale dei nodi non può essere attivato quando il comando di arresto non attiva il meccanismo di blocco dell'inibitore systemd su cui si basa il componente kubelet. Ecco alcuni esempi di questo tipo di situazioni:
- Disconnessioni di rete
- Malfunzionamenti hardware
- Risorse insufficienti, ad esempio memoria o CPU
- Interruzioni di corrente impreviste.
In questi casi, il nodo potrebbe arrestarsi bruscamente, causando potenzialmente interruzioni o perdita di dati.