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ìapplicativovalues.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 templatideploymeny.yaml
- per il deploymenthpa.yaml
- per lo HorizontalPodAutoscaleringress.yaml
- per Ingressservice.yaml
- per il servizioserviceaccount.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 daCharts.yaml
--version
- cambia la versione del chart dal default descritto daCharts.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.