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
E' il campo Status
bel rapporto di
kubectl describe pod
nomepod
.
- 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 fallimentoNever
- 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 runningPrestop
- 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