Come installare il software sui cluster Kubernetes con il gestore di pacchetti Helm 3

Introduzione

Helm è un gestore di pacchetti per Kubernetes che consente agli sviluppatori e agli operatori di configurare e distribuire più facilmente le applicazioni sui cluster Kubernetes.

I pacchetti Helm sono chiamati chart, e contengono modelli di definizioni di risorse che distribuiscono e configurano le app indicate con un minimo sforzo richiesto dall’utente. Con il templating, è possibile gestire il chart, le sue impostazioni e il comportamento passando definizioni di variabili senza modificare effettivamente il chart. Helm gestisce automaticamente anche le definizioni di risorse personalizzate e le modifiche alle definizioni già distribuite. Un chart distribuito, con eventuali personalizzazioni, è chiamato release.

In questo tutorial, configurerai Helm 3 e imparerai come installare, aggiornare, eseguire il rollback e gestire chart e release. Imparerai anche a creare e impacchettare i tuoi chart, oltre a configurare i repository di chart, che ospitano chart che puoi installare immediatamente.

Prerequisiti

  • Un cluster Kubernetes con controllo degli accessi basato sui ruoli (RBAC) abilitato. Per ulteriori informazioni sulle release, puoi consultare la pagina delle release di Helm.

  • Lo strumento da riga di comando kubectl installato sul tuo computer locale, configurato per connettersi al tuo cluster. Puoi leggere di più sull’installazione di kubectl nella documentazione ufficiale.

    Puoi testare la tua connettività con il seguente comando:

    1. kubectl cluster-info

    Se non ricevi errori, sei connesso al cluster. Se accedi a più cluster con kubectl, assicurati di verificare di aver selezionato il contesto del cluster corretto eseguendo:

    1. kubectl config get-contexts

    L’output elencherà le configurazioni disponibili:

    Output
    CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    Qui, l’asterisco (*) indica che siamo connessi al cluster do-fra1-helm3-example. Per passare a un altro cluster, esegui:

    1. kubectl config use-context nome-contesto

Quando sei connesso al cluster corretto, continua con il Passaggio 1 per iniziare l’installazione di Helm.

Passaggio 1 — Installazione di Helm 3

In questa sezione, installerai Helm 3 utilizzando lo script shell fornito ufficialmente.

Inizia navigando in /tmp, dove salverai lo script di installazione eseguendo:

  1. cd /tmp

Scarica lo script con il seguente comando:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

Puoi esaminare get_helm.sh nel tuo editor di testo per assicurarti che sia sicuro.

Rendilo eseguibile impostando i suoi permessi come segue:

  1. chmod u+x get_helm.sh

Infine, eseguilo per installare Helm 3:

  1. ./get_helm.sh

Riceverai un output simile al seguente:

Output
Downloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz Verifying checksum... Done. Preparing to install helm into /usr/local/bin helm installed into /usr/local/bin/helm

Hai Helm 3 installato sul tuo computer. Ora imparerai sui repository dei chart e come utilizzarli.

Passaggio 2 — Configurazione dei Repository dei Chart

I chart di Helm sono memorizzati nei repository dei chart che possono essere ospitati da chiunque. Per impostazione predefinita, Helm 3 non viene preconfigurato con alcun repository. Le versioni precedenti di Helm includevano un repository di chart curati centralmente; tuttavia, il design di Helm 3 è deliberatamente evoluto per consentire ai sviluppatori di chart di gestire il proprio repository, consentendo una maggiore libertà e rilasci più rapidi. Ciò significa che per ogni chart che desideri utilizzare, è necessario assicurarsi di aggiungere il repository di hosting alla tua installazione di Helm.

Per aiutarti a trovare il repository giusto, puoi utilizzare ArtifactHub.io, un sito web open source gestito dal CNCF che cataloga i chart di Helm e i relativi repository. Traccia anche i chart popolari e utili che utilizzano altri progetti CNCF, quindi differisce dal repository stable da cui hanno lavorato le versioni precedenti di Helm. Per progetti comuni, come ingressi Nginx o strumenti di monitoraggio, è una grande fonte.

Puoi cercare un chart che desideri installare tramite la homepage. La ricerca di nginx mostrerà tutti i chart indicizzati ad esso correlati.

Installerai la versione community gestita dal team Kubernetes. Cerca ingress-nginx nei risultati. Selezionalo per accedere alla sua pagina.

Ogni chart dovrebbe avere una descrizione dettagliata di ciò che fa, accompagnata da comandi per aggiungere il suo repository all’installazione e installare il chart. Se non lo ha, puoi comunque ottenere i comandi necessari premendo sul pulsante INSTALL sulla destra della pagina.

Puoi fare clic sul pulsante blu accanto a un comando per copiarlo. Fallo per il primo comando e eseguilo:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

Per aggiungere un repository a Helm, esegui helm repo add. I parametri che accetta sono il nome del repo e la sua posizione.

L’output sarà:

Output
"ingress-nginx" has been added to your repositories

Quando aggiungi un nuovo repo, devi far sapere a Helm cosa contiene eseguendo:

  1. helm repo update

Riceverai l’output seguente, che mostra che l’aggiornamento è stato eseguito con successo:

Output
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "ingress-nginx" chart repository Update Complete. ⎈Happy Helming!⎈

In questo passaggio, hai appreso di ArtifactHub e cosa offre. Hai anche aggiunto un nuovo repo alla tua installazione di Helm. Nel prossimo passaggio, installerai un chart di Helm.

Passaggio 3 — Installazione di un Chart di Helm

Nella sezione precedente, hai aggiunto il repo per il chart ingress-nginx. Ora lo installerai nel tuo cluster.

Ogni grafico ha delle variabili di configurazione che è possibile impostare per modificarne il comportamento. Queste variabili sono memorizzate in un file chiamato values.yaml che fa parte del grafico. A meno che tu non abbia scaricato il grafico sul tuo computer, dovrai eseguire il seguente comando per visualizzarlo:

  1. helm show values chart_name

Per mostrare le variabili disponibili per ingress-nginx, sostituisci nome_grafico:

  1. helm show values ingress-nginx/ingress-nginx

Il risultato sarà lungo e mostrerà il contenuto di values.yaml per ingress-nginx.

Per installare un grafico, puoi utilizzare helm install:

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

Questo comando installerà il grafico nel tuo cluster con i valori predefiniti delle variabili. Se desideri modificare alcuni di essi, puoi passare i nuovi valori delle variabili utilizzando --set:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

Puoi ripetere --set per quante variabili ne hai bisogno. Poiché non le personalizzeremo ora, installalo così com’è eseguendo:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

Il risultato sarà simile al seguente:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 10:12:37 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller' ...

Nota che il NOME corrisponde al nome del rilascio che hai specificato. Helm elenca anche informazioni comuni, come lo stato del rilascio e lo spazio dei nomi in cui è distribuito. La sezione NOTES varia tra i grafici e di solito contiene una guida di avvio rapido o avverte di alcuni problemi comuni nell’uso delle risorse del grafico. Qui, si nota che il bilanciamento del carico sta venendo creato e che potrebbe richiedere del tempo per completarlo.

Per controllare i grafici distribuiti, utilizza helm list:

  1. helm list

Troverai che ingress-nginx è l’unico grafico distribuito al momento:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

Puoi trovare i servizi che ha nel tuo cluster eseguendo:

  1. kubectl get services

L’output sarà simile a questo:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m

Ora che hai distribuito un rilascio nel tuo cluster, modificherai la sua configurazione mentre è distribuito.

Passaggio 4 — Aggiornamento di un Rilascio

Una volta che un rilascio è stato distribuito, non è necessario abbatterlo e ridistribuirlo completamente quando è necessario modificare la sua configurazione. Puoi utilizzare il comando helm upgrade per aggiornare il rilascio con una nuova versione della tabella, o per impostare nuove impostazioni.

La tabella ingress-nginx espone la variabile controller.replicaCount che controlla il numero di pod del controller distribuiti. Per impostazione predefinita, è impostato su uno, che puoi verificare elencando i pod disponibili:

  1. kubectl get pods

Scoprirai che ce n’è solo uno:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

Se vuoi che ne vengano distribuiti di più per la ridondanza (ad esempio, tre), puoi aggiornare il rilascio e impostare la variabile su 3 eseguendo:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

Passi anche --reuse-values, che istruisce Helm a basare le tue modifiche sul rilascio distribuito, preservando la configurazione precedente.

Nell’output, Helm aggiornerà la revisione per indicare che il rilascio è stato aggiornato:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

Puoi elencare i pod disponibili eseguendo:

  1. kubectl get pods

Troverai elencati tre pod, invece di uno:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s

Successivamente annullerai le modifiche e eliminerai completamente le versioni rilasciate.

Passaggio 5 — Annullare e Eliminare un Rilascio

Quando aggiorni un rilascio, il suo numero di revisione viene incrementato. Internamente, Helm memorizza tutte le revisioni di un rilascio, consentendoti di tornare a una revisione precedente se necessario.

Per ripristinare il numero di pod a uno solo, potresti eseguire di nuovo helm upgrade e impostare manualmente il numero perché è un cambiamento minore. Tuttavia, quando si lavora con grafici più grandi con molte variabili, il ripristino manuale non è fattibile e dovrebbe essere automatizzato.

Per annullare un rilascio, usa helm rollback:

  1. helm rollback release_name release_revision

Puoi usarlo per annullare le modifiche apportate a ingress-nginx tornando alla revisione 1:

  1. helm rollback ingress-nginx 1

Riceverai l’output seguente, che indica che l’azione è stata eseguita con successo:

Output
Rollback was a success! Happy Helming!

Puoi verificare la revisione attuale elencando i rilasci:

  1. helm list

Scoprirai che la revisione è ora 3, e non 1:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

Helm considera ogni modifica, compresi gli annullamenti, come una nuova revisione di un rilascio. Puoi verificare che la revisione 3 sia uguale alla prima controllando il numero di pod distribuiti eseguendo:

  1. kubectl get pods

Scoprirai che ce n’è solo uno:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

Per eliminare un rilascio e tutte le sue revisioni, puoi usare helm delete:

  1. helm delete release_name

Dato che non ne avrai più bisogno, elimina ingress-nginx eseguendo il seguente comando:

  1. helm delete ingress-nginx

L’output sarà:

Output
release "ingress-nginx" uninstalled

Puoi elencare i rilasci per verificare che non ce ne siano:

  1. helm list

La tabella di output non avrà righe:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

Ora che il rilascio è stato eliminato, puoi riutilizzare il suo nome per futuri dispiegamenti.

Passaggio 6 — (Opzionale) Creazione di Grafici Personalizzati

In questo passaggio opzionale, imparerai come creare un grafico personalizzato, dove inserire le definizioni delle risorse e come confezionarlo per una distribuzione ulteriore.

Creerai un nuovo grafico chiamato example-chart. Esegui il seguente comando per crearlo:

  1. helm create example-chart

Questo creerà una nuova directory chiamata example-chart con i seguenti file e struttura:

example-chart/
charts/
templates/
├─ tests/
│  ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml

Le definizioni delle risorse che il tuo grafico installerà sui cluster di destinazione si trovano nella directory templates. Quelle predefinite create da Helm come punto di partenza installano un controller di ingresso Nginx. Anche se l’estensione del file è YAML, utilizzano la sintassi del templating di Go per rimanere personalizzabili tramite variabili esposte che puoi passare. Puoi verificare mostrando il contenuto di service.yaml eseguendo:

  1. cat example-chart/templates/service.yaml

Troverai direttive di templating per generare valori circondati da doppi graffe:

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

Le variabili referenziate sono esposte all’utente e definite in values.yaml. Il testo NOTES che Helm mostra dopo il rilascio è memorizzato in NOTES.txt, ed è anche modellato tramite template. I metadati della chart, come nome, versione e versione del software in fase di distribuzione, sono specificati in Chart.yaml:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Per verificare cosa Helm distribuirebbe, è possibile passare --dry-run e --debug a helm install puntando alla directory della chart:

  1. helm install example-chart --dry-run --debug ./example-chart

L’output sarà lungo e conterrà tutte le definizioni finali delle risorse che verrebbero applicate al cluster. Mentre lavori sulla tua chart, puoi usare helm upgrade per inviare nuove versioni a Kubernetes.

Quando è il momento di condividere la tua chart finita, puoi impacchettarla per la distribuzione eseguendo:

  1. helm package ./example-chart

L’output sarà:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

La chart impacchettata può essere installata proprio come quelle aggiunte dai repository:

  1. helm install example-chart example-chart-0.1.0.tgz

In questo passaggio hai creato una chart personalizzata e l’hai distribuita. L’hai anche impacchettata e appreso la sua struttura.

Conclusione

Ora sai come usare Helm per installare e aggiornare il software distribuito nel tuo cluster Kubernetes. Hai aggiunto repository di chart e appreso perché sono importanti e come ArtifactHub può aiutarti a trovarli. Hai anche creato una nuova chart personalizzata e appreso riguardo alle revisioni del rilascio e come eseguire un rollback se necessario.

Per ulteriori informazioni sulla creazione di grafici personalizzati, visita la guida ufficiale.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager