Generazione di un Chart

Creazione di un Chart

Helm fornisce un chart di default basato sull'applicativo Nginx.

Questo si chiama uno Starting Point.

Nginx è un buon starting point per applicativi stateless.

Helm fornisce degli starter packs per la creazione di altri modelli di applicativi.

La generazione di un chart di default è:

helm create anvil

Viene creata una sottodirectory anvil con la struttura:

tree anvil
anvil
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

Nella directory anvil:

  • Chart.yaml - semplicemente descrive i numeri di versione del chart e dellìapplicativo
  • values.yaml - fornisce valori di default per la configurazione dell'applicativo. E' qui che viene configurato di default l'applicativo nginx.

Nella sottodirectory templates vi sono templati per la generazione di file Yaml dell'applicativo:

  • NOTES.txt - le note per l'utente
  • _helpers.tpl - spezzoni di templati che vengono inclusi in altri templati
  • deploymeny.yaml - per il deployment
  • hpa.yaml - per lo HorizontalPodAutoscaler
  • ingress.yaml - per Ingress
  • service.yaml - per il servizio
  • serviceaccount.yaml - per il ServiceAccount

La sintassi dei Templates è quella del linguaggio Go, quando con tale linguaggio si preparano applicativi web.

La sottodirectory tests contiene il file test-connection.yaml, che genera un pod per il test di connessione a Nginx.

Tutti questi files sono editabili, per indicare e personalizzare il nostro applicativo al posto di Nginx.

Installazione del Chart

Il chart prototipo è direttamente installabile. Posizionarsi della directory a monte di anvil e dare il comando:

helm install myapp anvil
NAME: myapp
LAST DEPLOYED: Sun Feb 11 12:53:52 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=anvil,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

Il servizio installato nell'applicativo myapp è di tipo ClusterIP:

kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   41h
myapp-anvil   ClusterIP   10.96.253.188   <none>        80/TCP    4m53s

Ciò vuol dire che il servizio non è direttamente accessibile dall'esterno. Le Note forniscono un workaround, per il testing, con i comandi:

export POD_NAME=$(kubectl get pods --namespace default \
  -l "app.kubernetes.io/name=anvil,app.kubernetes.io/instance=myapp" \
  -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default \
  $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default \
  port-forward $POD_NAME 8080:$CONTAINER_PORT

L'ultimo comando è bloccante. Aprire un'altro terminale collegato al contenitore kub e dare il comando di test:

curl http://127.0.0.1:8080

Vi sono quattro tipi di servizio previsti:

  • ClusterIP - default in questo applicativo
  • NodePort
  • LoadBalancer
  • Ingress

Disinstallare al termine l'applicativo con il comando:

helm delete myapp

Files del Chart

Chart.yaml

Si possono aggiungere numerose altre proprietà oltre a quelle presenti.

Per esempio modificarla in:

apiVersion: v2
name: anvil
description: A surprise to catch something speedy.
version: 0.1.0
appVersion: 9.17.49
icon: https://wile.example.com/anvil.svg
keywords:
  - road runner
  - anvil
home: https://wile.example.com/
sources:
  - https://github.com/Masterminds/learning-helm/tree/main/chapter4/anvil
maintainers:
  - name: ACME Corp
    email: maintainers@example.com
  - name: Wile E. Coyote
    email: wile@example.com

La proprietà type: application può essere omessa poichè è il default. L'alternativa è type: library.

Package di Chart

La struttura gerarchica di un package viene trasformata in un archivio tar compresso col comando:

helm package anvil

In luogo di anvil si può dare il percorso, assoluto o relativo, della directory di testa del chart gerarchico.

Il risultato viene posto nella directory corrente ove si da il comando, e in questo caso è anvil-0.1.0.tgz.

La versione numerica è quella del chart, descritta nel file Chart.yaml.

Sono previste delle opzioni:

  • --dependency-update (-u) - compie un update dei chart dipendenti
  • --destination (-d) - setta la locazione dell'archivio se diversa dalla directory corrente
  • --app-version - cambia la versione dell'applicativo dal default descritto da Charts.yaml
  • --version - cambia la versione del chart dal default descritto da Charts.yaml

Vi sono anche delle opzioni per la firma crittografica del chart, usando PGP (Pretty Good Privacy). I comandi Helm install e upgrade hanno corrispondenti opzioni per la verifica della firma.

Il file eventiale ,helmignore nella directory corrente specifica files e directories da non inserire nell'archivio del chart. La sua struttura è uguala a quella di .gitignore.

Lint di Chart

Lint è uno strumento di analisi statica del chart, ed è utile eseguirlo prima della generazione del pacchetto, per trovare errori ed inconsistenze.

helm lint anvil

Si può anche eseguire su un chart raccolto in archivio:

helm lint anvil-0.1.0.tgz

Lint può generare notifiche di livello INFO, WARNING o ERROR.

Il livello ERROR fa si che il comando lint generi un codice di ritorno diverso da zero, utile quando inserito in una procedura shell.

Con l'opzione --strict anche WARNIBG genera un codice di ritorno diverso da zero.