Quando muore un Pod

Immagine di copertina

Quando un container fallisce e un Pod muore, possono esserci diverse ragioni, e queste sono sempre descritte all’interno dei termination messages.

Questo tipo di dato è fondamentale per comprendere quali siano gli eventi che hanno portato all’arresto dell’applicazione e quindi per permettere ai team di indagare sull’origine della causa.

Di default, questi messaggi risiedono nella cartella /dev/termination-log: questo vuol dire che, quando il Pod termina, il campo relativo al suo status viene aggiornato con le informazioni che riguardano le cause di arresto, come mostrato di seguito.

Creando un Pod come il seguente, facciamo sì che il container attenda 30 secondi prima di stampare in output il messaggio “Good night!”, riportandone il contenuto nel path di default:

apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  containers:
  - name: demo
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "sleep 30 && echo Good night! > /dev/termination-log"]

Questo messaggio è recuperabile sfruttando il campo status del template del Pod, in questo modo: utilizzando il comando kubectl get pod e recuperando l’output in formato yaml, dovremmo ottenere un risultato simile al seguente, dove il campo status contiene al suo interno una serie di dettagli sullo stato dei container e della causa del loro arresto:

kubectl get pod demo --output=yaml

>>>
apiVersion: v1
kind: Pod
...
    lastState:
      terminated:
        containerID: ...
        exitCode: 0
        finishedAt: ...
        message: | #################
          Good night! ################
        ...

Si è già detto che Kubernetes recupera i messaggi di arresto dal file /dev/termination-log; qualora volessimo però specificare un path diverso, potremmo utilizzare il campo terminateMessagePath all’interno delle specifiche del container.

Kubernetes utilizzerà il contenuto del file specificato per popolare il messaggio di stato del container sia in caso di successo che di errore.

Il messaggio di terminazione deve essere un breve stato finale, ad esempio un messaggio di errore rispetto a dei test o delle asserzioni che controllano lo stato di integrità del pod; dev’essere breve perché kubelet tronca i messaggi più lunghi di 4096 byte.

Un’altra nota interessante è che non è possibile impostare il percorso del messaggio di terminazione dopo l’avvio di un pod: questo deve essere impostato prima del suo avvio, altrimenti verrà utilizzato quello di default.

apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  containers:
  - name: demo
    image: centos
    terminationMessagePath: "/tmp/my-custom-log-file"

Risorse utili


🔗 Leggi anche:

Conosci meglio chi ha scritto questo articolo

Serena Sensini

Ciao! Mi chiamo Serena Sensini e sono la creatrice di @ TheRedCode.it. Ho aperto questo blog nel 2021 per raccontare il mio lavoro e il mondo dell’informatica a parole semplici, in piccole pillole e alla portata di tutte le persone.

Sono un’ingegnera informatica specializzata in ambito AI & NLP. Di giorno lavoro come CTO @ Welyk e come Innovation & Emerging Technologies Leader @ Dedalus, mentre di notte scrivo e sono autrice di 5 libri -per ora-. 🖊️

Foto di Serena Sensini

Partners

Community, aziende e persone che supportano attivamente il blog

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea