Architettura dei Pod

Ciclo di Vita dei Pod

Stati del Ciclo di Vita

Un contenitore ha tre stati del ciclo di vita:

  • waiting - sta ancora compiendo dei passi necessari alla creazione del container
  • running - in piena funzione
  • terminated - il contenitore ha completato con successo o è fallito per qualche motivo

Gli stati indicati si susseguono nel ciclo di vita.

Fasi del Ciclo di Vita

Podphases

E' il campo Status bel rapporto di
kubectl describe podnomepod.

  • Pending - accettato, ma non tutti i contenitori sono pronti
  • Running - in funzione o in ripartenza
  • Succeeded - container terminati con successo, non ripartiranno
  • Failed - uno o più contenitori sono falliti
  • Unknown - stato non determinato, perchè il nodo non è raggiungibile

Condizioni del Pod

  • PodScheduled - schedulato su un nodo
  • ContainersReady - i contenitori del pod sono attivi
  • Initialized - tutte le attività di inizializzazione sono terminate
  • Ready - proto ad accettare collegamenti

Restart di un Pod

In caso di fallimento di un pod, ne può venire creato un altro uguale, a seconda del settaggio restartPolicy delle spec:

  • Always - sempre, anche se lo stato di uscita del contenitore è zero, che indica successo (default)
  • OnFailure - solo se lo stato di uscita del container è diverso da zero, indicante fallimento
  • Never - mai

Il restart di un pod non avviene quando quel pod è creato standalone, ma solo se fa parte di un workload come ReplicaSet, Seployment, StatefulSet, DaemonSet, Job e CronJob.


Hooks del Ciclo di Vita

Ve ne sono due:

  • PostStart - eseguito prima dello stato running
  • Prestop - eseguito prima dello stato terminated

Il seguente esempio ne illustra l'uso.

Preparare il file di specifiche:

mkdir -p ~/pod
cd ~/pod
vim prepost.yml
apiVersion: v1
kind: Pod
metadata:
  name: ha-nginx-pod-hooks
  labels:
    app: ha-nginx-p-h
spec:
  containers:
  - name: ha-nginx-c-1
    image: nginx:1.10.1
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo postStart is executing > /tmp/msg"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo preStop is executing > /tmp/msg"]

Creare il pod:

kubectl apply -f prepost.yml

Attendere lo stato di Running.

Connettersi al pod:

kubectl exec -it ha-nginx-pod-hooks -- bash

Verificare che postStart è stato eseguito:

cat /tmp/msg

Uscire e cancellare il pod:

exit
kubectl delete -f prepost.yml

preStop è stato eseguito. Purtroppo il file /tmp/msg è stato perso col pod. E' pensabile però che il pod scriva ad un volume persistente.

postStart e preStop non generano logging.

Contenitori Init

In un pod multicontainer, uno o più possono essere indicati come contenitori Init.

Questi eseguiranno prima del pod principale, che non andrà nello stato Running finchè tutti gli InitContainers non avranno terminato.

Il seguente esempio ne illustra il funzionamento.

Preparare il file di specifiche:

mkdir -p ~/pod
cd ~/pod
vim init.yml
apiVersion: v1
kind: Pod
metadata:
  name: ha-nginx-pod-init
  labels:
    app: ha-nginx-p-i
spec:
  containers:
  - name: ha-nginx-c-1
    image: nginx:1.10.1
    ports:
    - containerPort: 80
  initContainers:
  - name: ha-init-c-1
    image: busybox:1.28
    command: ['sh', '-c', 'echo ha-init-c-1 initContainers is running!']

Creare il pod:

kubectl apply -f init.yml

Notare la situazione in veloce evoluzione:

jenny@fray:~/pod$ kubectl apply -f init.yml 
pod/ha-nginx-pod-init created
jenny@fray:~/pod$ kubectl get pod
NAME                READY   STATUS     RESTARTS   AGE
ha-nginx-pod-init   0/1     Init:0/1   0          10s
jenny@fray:~/pod$ kubectl get pod
NAME                READY   STATUS     RESTARTS   AGE
ha-nginx-pod-init   0/1     Init:0/1   0          18s
jenny@fray:~/pod$ kubectl get pod
NAME                READY   STATUS            RESTARTS   AGE
ha-nginx-pod-init   0/1     PodInitializing   0          28s
jenny@fray:~/pod$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
ha-nginx-pod-init   1/1     Running   0          32s

Dapprima lo InitContainer per due volte non è pronto, poi è in esecuzione nello stato PodInitializing. Quindi lo InitContainer termina e il contenitore principale va nello stato Running.

Si può ispezionare il log dello InitContainer:

kubectl logs ha-nginx-pod-init -c ha-init-c-1

Al termine, eliminare il pod:

kubectl delete -f init.yml