Creare e installare un chart Helm

Completato

I chart Helm semplificano la distribuzione di applicazioni in qualsiasi cluster Kubernetes. È possibile usare Helm per creare un modello con le informazioni di distribuzione dell'applicazione sotto forma di chart Helm, che verrà quindi usato per distribuire l'applicazione.

Si supponga che il team di sviluppo abbia già distribuito il sito Web del negozio di animali dell'azienda nel cluster del servizio Azure Kubernetes. Il team crea tre file per distribuire il sito Web:

  • Un manifesto della distribuzione che descrive come installare ed eseguire l'applicazione nel cluster.
  • Un manifesto del servizio che descrive come esporre il sito Web nel cluster.
  • Un manifesto di ingresso che descrive il modo in cui il traffico esterno al cluster viene indirizzato all'app Web.

Il team distribuisce questi file in ognuno dei tre ambienti come parte del ciclo di vita dello sviluppo software. Ognuno dei tre file viene aggiornato con variabili e valori specifici dell'ambiente. Poiché ogni file è hardcoded, la manutenzione di questi file è soggetta a errori.

In che modo Helm elabora un chart?

Il client Helm implementa un motore di modelli basato sul linguaggio Go che analizza tutti i file disponibili nelle cartelle di un chart. Il motore di modelli crea file manifesto Kubernetes combinando i modelli nella cartella templates/ del chart con i valori dei file Chart.yaml e values.yaml.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

Quando i file manifesto sono disponibili, il client può installare, aggiornare ed eliminare l'applicazione definita nei file manifesto generati.

Come definire un file Chart.yaml

Chart.yaml è uno dei file necessari in una definizione di chart Helm e fornisce informazioni sul chart. Il contenuto del file è costituito da tre campi obbligatori e diversi campi facoltativi.

I tre campi obbligatori sono i seguenti:

  • apiVersion: Versione dell'API del chart da usare. Impostare la versione su v2 per i chart che usano Helm 3.
  • name: Nome del chart.
  • version: Il numero di versione del chart, che usa il controllo delle versioni semantico 2.0.0 e segue la notazione MAJOR.MINOR.PATCH per il numero di versione.

Nell'esempio seguente viene illustrato il contenuto di un file Chart.yaml di base:

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

Si noti l'uso del campo type nel file di esempio. È possibile creare chart per installare applicazioni o librerie. Il tipo di chart predefinito è application e può essere impostato su library per specificare che il chart installerà una libreria.

Sono disponibili molti campi facoltativi per personalizzare il processo di distribuzione di chart. È ad esempio possibile usare il campo dependencies per specificare requisiti aggiuntivi per il chart, ad esempio un'app Web che dipende da un database.

Nota

La descrizione dettagliata di tutti i campi facoltativi esula dall'ambito di questo modulo. Nella sezione Riepilogo del modulo è tuttavia disponibile un collegamento alla documentazione di Helm.

Come definire un modello di chart

Un modello di chart Helm è un file che descrive i diversi file manifesto del tipo di distribuzione. I modelli di chart sono scritti nel linguaggio del modello Go e forniscono funzioni dei modelli per automatizzare la creazione dei file manifesto degli oggetti Kubernetes.

I file modello vengono archiviati nella cartella templates/ di un chart. Il motore di modelli elabora questi file per creare il manifesto dell'oggetto finale.

Si supponga, ad esempio, che il team di sviluppo usi il file manifesto della distribuzione seguente per distribuire il componente vetrina del negozio di animali della soluzione:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

Si noti che la posizione dell'immagine del contenitore è hardcoded mediante la sintassi {{.Values.<property>}}. Questa sintassi consente di creare segnaposto per ogni valore personalizzato.

Il processo di creazione manuale di chart Helm è noioso. Un modo semplice per creare un nuovo chart Helm consiste nell'usare il comando helm create. I file generati automaticamente possono quindi essere personalizzati in base ai requisiti dell'applicazione.

Come definire un file values.yaml

I valori del chart consentono di personalizzare la configurazione di un chart Helm. I valori del chart possono essere predefiniti o forniti dall'utente al momento della distribuzione del chart.

Un valore predefinito è un valore con distinzione tra maiuscole/minuscole che è predefinito nel contesto di un chart Helm e che non può essere modificato da un utente. È ad esempio possibile usare Release.Name per fare riferimento al nome della versione o Release.IsInstall per controllare se l'operazione corrente è un'installazione.

È anche possibile usare i valori predefiniti per estrarre i dati dal contenuto di Chart.yaml. Se, ad esempio, si vuole controllare la versione del chart, è necessario fare riferimento a Chart.Version. Tenere presente che è possibile fare riferimento solo ai campi noti. È possibile paragonare i valori predefiniti a costanti da usare nei modelli creati.

La sintassi per includere i nomi dei valori in un file modello richiede di racchiudere il nome del valore tra parentesi graffe doppie, ad esempio {{.Release.Name}}. Si noti l'uso di un punto davanti al nome del valore. Quando si usa un punto in questo modo, il punto funge da operatore di ricerca e indica l'ambito corrente della variabile.

Il frammento di codice YAML seguente, ad esempio, contiene un dizionario definito in un file di valori:

object:
  key: value

Per accedere al valore in un modello, è possibile usare la sintassi seguente:

{{ .Values.object.key }}

Un valore fornito consente di elaborare valori arbitrari nel modello di chart. Il file values.yaml definisce questi valori.

Nell'esempio il team di sviluppo consente i valori configurabili seguenti:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

Ecco un esempio del file values.yaml:

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

Dopo che il motore di modelli ha applicato i valori, il risultato finale sarà simile a questo esempio:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Come usare un repository Helm

Un repository Helm è un server HTTP dedicato che archivia le informazioni nei chart Helm. Si configurano i repository Helm con il client Helm per consentire l'installazione di chart da un repository usando il comando helm repo add.

È ad esempio possibile aggiungere il repository Helm di Azure Marketplace al client Helm locale eseguendo il comando seguente:

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

Le informazioni sui chart disponibili in un repository vengono memorizzate nella cache dell'host client. È necessario eseguire periodicamente l'aggiornamento della cache per recuperare le informazioni più recenti del repository usando il comando helm repo update.

Il comando helm search repo consente di cercare i chart in tutti i repository Helm aggiunti localmente. È possibile eseguire il comando helm search repo da solo per ottenere un elenco di tutti i chart Helm noti per ogni repository aggiunto. Nel risultato vengono elencati il nome e la versione del chart, nonché la versione dell'app distribuita dal chart, come illustrato nell'output di esempio seguente:

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

È possibile cercare un chart specifico aggiungendo un termine di ricerca al comando helm search repo. Se, ad esempio, si sta cercando un chart basato su ASP.NET, è possibile usare il comando seguente:

helm search repo aspnet

In questo esempio il client locale ha due repository registrati e restituisce un risultato da ognuno, come illustrato nell'output di esempio seguente:

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Come testare un chart Helm

Helm consente di generare i file manifesto che il motore di modelli crea dal chart. Questa funzionalità consente di testare il chart prima di un rilascio combinando due parametri aggiuntivi: --dry-run e debug. Il parametro --dry-run assicura che l'installazione sia simulata, mentre il parametro --debug consente l'output dettagliato.

helm install --debug --dry-run my-release ./chart-name

Il comando elenca le informazioni sui valori usati e tutti i file generati. Potrebbe essere necessario scorrere per visualizzare tutto l'output generato.

Come installare un chart Helm

Per installare un chart, usare il comando helm install. È possibile installare un chart Helm da una delle posizioni seguenti:

  • Cartelle del chart
  • Chart di un archivio tar .tgz in pacchetto
  • Repository Helm

I parametri richiesti, tuttavia, variano a seconda della posizione del chart. In tutti i casi il comando install richiede il nome del chart da installare e un nome per la versione creata dall'installazione.

È possibile installare un chart locale usando una cartella di file del chart decompressa o un archivio tar .tgz compresso. Per installare un chart, il comando helm fa riferimento al file system locale per la posizione del chart. Di seguito è riportato un esempio del comando di installazione che distribuirà una versione di un chart decompresso:

helm install my-release ./chart-name

Nell'esempio precedente il parametro my-release è il nome della versione e il parametro ./chart-name è il nome del pacchetto del chart decompresso.

Un chart compresso viene installato facendo riferimento al nome file del chart compresso. L'esempio seguente mostra la sintassi per la stessa applicazione ora compressa come archivio tar:

helm install my-release ./chart-name.tgz

Quando si installa un chart da un repository Helm, si usa un riferimento al chart come nome del chart. Il riferimento al chart include due parametri, il nome del repository e il nome del chart, come illustrato nell'esempio seguente:

helm install my-release repository-name/chart-name

Nell'esempio il parametro repository-name/chart-name contiene il riferimento del repository repository-name e il nome del chart chart-name.