Gestione di Deployment e Rollout

Un Deployment, specificato da un manifest in Yaml, gestisce Pods e ReplicaSets in modo flessibile, ottenendo lo stato desiderato a partire dallo stato corrente.

NOTA: Non gestire manualmente i ReplicaSet che appartengono ad un Deployment.

Generazione di Deployment

Esempio. Un Deployment di nginx che gestisce un RepkicaSet con 3 pod.

vim ~/scripts/nginx-depl.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Creare il deployment:

kubectl apply -f ~/scripts/nginx-depl.yml

Visualizzare il deploymant:

kubectl get deployments

Ogni deploymant è un rollout. Visualizzarne lo status:

kubectl rollout status deployment/nginx-deployment

Visualizzare il replicaset:

kubectl get rs

Visualizzare i pod e le loro etichette:

kubectl get pods --show-labels

Ogni pod acquisisce automaticamente l'etichetta pod-template-hash, che lo collega al ReplicaSet.

Update di Deployment

Cambiare la versione di nginx usata:

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

Si può naturalmente modificare il file di specifiche ~/scripts/nginx-depl.yml e risottometterlo.

Si può inoltre editare direttamente con:

kubectl edit deployment/nginx-deployment

Verificare lo stato del rollout:

kubectl rollout status deployment/nginx-deployment

Solo un certo numero di pod sono disattivati durante il rollout. Default 25% - parametro maxUnavailable.

Solo un certo numero di pod nuovi sono creati durante il rollout. Default 25% - parametro maxSurge.

I dettagli sul deployment si ottengono con:

kubectl describe deployments

Ogni rollout che cambia i pod crea una revisione. La revisione non viene creata quando si cambia il numero di pod con un'operazione di scale.

Rollback di un Deployment

Utile quando la nuova versione è in un loop di crash.

Per esempio un update con un errore tipografico:

kubectl set image deployment/nginx-deployment nginx=nginx:1.161

Il sintomo di fallimento è l'output del comando:

kubectl rollout status deployment/nginx-deployment

che rimane piantato a lungo.

Altri sintomi si deducono dai comandi:

kubectl get rs
kubectl get pods
kubectl describe deployment

La storia delle revisioni si ottiene con:

kubectl rollout history deployment/nginx-deployment

Per avere dettagli di una specifica revisione:

kubectl rollout history deployment/nginx-deployment --revision=2

Per compiere il rollback alla revisione precedente:

kubectl rollout undo deployment/nginx-deployment

Per compiere il rollback ad una revisione specifica:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

Controllare il risultato con:

kubectl get deployment nginx-deployment

e con:

kubectl describe deployment nginx-deployment

Scalare un Deployment

Oltre che modificare il manifest, ~/scripts/nginx-depl.yml, e risottometterlo, si può modificare il Deployment col comando diretto:

kubectl scale deployment/nginx-deployment --replicas=10

Se è presente uno autoscaler, si può anche dare il comando:

kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80

Questo introduce in Kubernetes un oggetto HPA - Horizontal Pod Autoscaler. Questo avviene anche se lo autoscaler non è abilitato.

Si possono vedere gli oggetti HPA con:

kubectl get hpa
kubectl get hpa -w

L'oggetto si cancella con:

kubectl delete hpa nginx-deployment

Il cluster Kind non fornisce un autoscaler. Minikube si.

Terminare l'Esercizio

kubectl delete -f ~/scripts/nginx-depl.yml