Altri Comandi Helm

Fasi di Esecuzione

Fasi di esecuzione di una installazione (o di un upgrade) di un chart di Helm:

  1. Caricamento del chart e delle sue dipendenze
  2. Attualizzazione dei parametri e dei valori
  3. Esecuzione dei templati e generazione dei file di specifiche Yaml
  4. Verifica dei dati di generazione di oggetti Kubernetes
  5. Invio al cluster Kubernetes

Ciascuna di queste fasi può generare errori.

Se nella fase 5 il server Kubernetes accetta i files Yaml, Helm dichiara il successo dell'operazione.

Questo non vuol dire che l'applicativo sia pronto, poichè i pod possono impiegare tempo considerevole a scaricare le immagini.

Alcune opzioni di installazione aiutano:

helm install mysite bitnami/drupal \
  --wait --timeout 120

Helm compie allora ripetute queries a Kubernetes e attende che tutti i pod dell'applicativo installato siano running.

E' buona prassi includere una opzione --timeout espressa in secondi, per non attendere rventualmente per sempre. Al termine del periodo di timeout lo stato dell'installazione è failed. Questo può dare delle inconsistenze se il periodo non è abbastanza lungo.

Un'alternativa è:

helm install mysite bitnami/drupal \
  --atomic --timeout 120

E'simile a --wait ma in caso di fallimento Helm compie un rollback automatico all'ultima versione di successo.

Dry Run

helm install mysite bitnami/drupal \
  --values ~/scripts/drupal/values.yml \
  --set drupalEmail=foo@example.com \
  --dry-run

Non genera l'applicativo descritto nel chart. Non invia le specifiche al cluster Kubernetes.

Produce molte informazioni di debugging.

  • identificativi della release
  • lista di tutti i file di specifiche Yaml generati
  • note e istruzioni per l'utente

Anche se non viene generato l'applicativo sul cluster, un dry run può contattare il cluster più volte durante le sue fasi, e generare files di specifiche legati al particolare cluster.

Helm Template

Il comando helm template genera solo l'identificativo della release e la lista dei file di specifiche Yaml. Non contatta mai il server Kubernetes.

helm template mysite bitnami/drupal \
  --values ~/scripts/drupal/values.yml \
  --set drupalEmail=foo@example.com

Non compie validazione dei file Yaml generati.

Ha praticamente le stesse opzioni di helm install.

Release

Partendo da una situazione pulita, installiamo la prima release di drupal:

helm install mysite bitnami/drupal \
  --values ~/scripts/drupal/values.yml \
  --set drupalEmail=foo@example.com

Vengono generati dei Secrets:

kubectl get secret
NAME                           TYPE                 DATA   AGE
mysite-drupal                  Opaque               1      13s
mysite-mariadb                 Opaque               2      13s
sh.helm.release.v1.mysite.v1   helm.sh/release.v1   1      13s

Helm mantiene le informazioni di release nel secret sh.helm.release.v1.mysite.v1.

L'ultimo è il numero di versione di upgrade. Ad ogni nuovo upgrade compare un nuovo secret con versione v2, v2, ecc. Vengono mantenute al massimo 10 versioni, le più vecchie sono rimosse.

Si può ispezionare il secret di versione con:

kubectl get secret sh.helm.release.v1.mysite.v1 -o json

La sezione maggiore, data, contiene informazioni per ricreare la release, compresse e trascodificate con Base64.

Si possono estrarre queste informazioni con dei comandi.

helm get notes

Note finali per l'utente:

helm get notes mysite

helm get values

Valori parametrici della release.

Valori forniti nel comando di unstallazione o upgrade:

helm get values mysite

Tutti i valori:

helm get values mysite --all

helm get manifest

Tutti i file di specifiche Yaml:

helm get manifest mysite

Helm Upgrade e History

Upgrade

Compiamo un upgrade alla release.

Prepariamo le variabili d'ambiente necessarie:

export DRUPAL_PASSWORD=$(kubectl get secret \
  --namespace "default" mysite-drupal \
  -o jsonpath="{.data.drupal-password}" | base64 -d)
export MARIADB_ROOT_PASSWORD=$(kubectl get secret \
  --namespace "default" mysite-mariadb \
  -o jsonpath="{.data.mariadb-root-password}" | base64 -d)
export MARIADB_PASSWORD=$(kubectl get secret \
  --namespace "default" mysite-mariadb \
  -o jsonpath="{.data.mariadb-password}" | base64 -d)

Compiamo l'upgrade:

helm upgrade mysite bitnami/drupal --set ingress.enabled=true \
  --set drupalPassword=$DRUPAL_PASSWORD \
  --set mariadb.auth.rootPassword=$MARIADB_ROOT_PASSWORD \
  --set mariadb.auth.password=$MARIADB_PASSWORD

History

Ispezioniamo ora la storia delle release:

helm history mysite
REVISION  UPDATED                  STATUS     CHART         APP VERSION  DESCRIPTION     
1         Sun Feb 11 09:37:53 2024  superseded  drupal-17.3.4 10.2.3      Install complete
2         Sun Feb 11 10:20:18 2024  deployed    drupal-17.3.4 10.2.3      Upgrade complete

Lo status può essere:

  • pending-install
  • deployed
  • pending-upgrade
  • superseded
  • pending-rollback
  • uninstalling
  • uninstalled
  • failed

Verifichiamo i valori della release:

helm get values mysite -o json
{"drupalPassword":"dcC54IVRFH","ingress":{"enabled":true},"mariadb":{"auth":{"password":"RzY3j10Azv","rootPassword":"3CVLN2SHFV"}}}

Restart dei Pod

Un upgrade è il meno invasivo possibile: Helm richiede il restart di pods solo se ve n'è bisogno. Si può forzare il restart di tutti i pod con l'opzione --force.

Cleanup

Un'installazione o upgrade fallita può lasciare lo stato di Kubernetes inconsistente. Per esempio possono essere stati creati dei Secrets prima del fallimento.

Questo è più probabile se è stata usata l'opzione --wait o --atomic.

Con l'opzione --cleanup-on-fail viene richiesta la rimozione di tutti gli oggetti della release in caso di fallimento.

Questo però non aiuta nell'eventuale debugging.

Rollback

Compiamo un rollback alla versione 1:

helm rollback mysite 1

Verifichiamo che i valori sono ora quelli della versione 1:

helm get values mysite -o json
{"drupalEmail":"foo@example.com","drupalUsername":"admin","mariadb":{"db":{"name":"my-database"}}}

Ispezioniamo la storia:

helm history mysite
REVISION  UPDATED                   STATUS      CHART         APP VERSION DESCRIPTION     
1         Sun Feb 11 09:37:53 2024  superseded  drupal-17.3.4 10.2.3       Install complete
2         Sun Feb 11 10:20:18 2024  superseded  drupal-17.3.4 10.2.3      Upgrade complete
3         Sun Feb 11 10:37:54 2024  deployed    drupal-17.3.4 10.2.3      Rollback to 1

Si possono compiere queries di un'altra revisione della storia, per esempio:

helm get values mysite --revision 2

E in modo simile per notes e manifest.

Mantenere la Storia

Si può disinstallare una release, ma mantenere la sua storia:

helm uninstall mysite --keep-history

La storia è ora:

helm history mysite
REVISION  UPDATED                   STATUS      CHART         APP VERSION DESCRIPTION            
1         Sun Feb 11 09:37:53 2024  superseded  drupal-17.3.4 10.2.3      Install complete       
2         Sun Feb 11 10:20:18 2024 superseded  drupal-17.3.4 10.2.3      Upgrade complete       
3        Sun Feb 11 10:37:54 2024 uninstalled drupal-17.3.4 10.2.3      Uninstallation complete

Con la storia presente, si può compiere un rollback ad una previa versione anche se quella corrente non è installata.