Een Helm-grafiek maken en installeren

Voltooid

Met Helm-grafieken kunt u eenvoudig toepassingen implementeren in een Kubernetes-cluster. U gebruikt Helm om de implementatiegegevens van uw toepassing te sjabloonen als een Helm-grafiek, die u vervolgens gebruikt om uw toepassing te implementeren.

Stel dat uw ontwikkelteam de pet store-website van uw bedrijf al heeft geïmplementeerd in uw AKS-cluster. Het team maakt drie bestanden om de website te implementeren:

  • Een implementatiemanifest waarin wordt beschreven hoe u de toepassing op het cluster installeert en uitvoert,
  • Een servicemanifest waarin wordt beschreven hoe u de website beschikbaar maakt op het cluster en
  • Een ingress-manifest dat beschrijft hoe verkeer van buiten het cluster naar de webapp wordt gerouteerd.

Het team implementeert deze bestanden in elk van de drie omgevingen als onderdeel van de levenscyclus van softwareontwikkeling. Elk van de drie bestanden wordt bijgewerkt met variabelen en waarden die specifiek zijn voor de omgeving. Omdat elk bestand in code is vastgelegd, is het onderhoud van deze bestanden foutgevoelig.

Hoe verwerkt Helm een grafiek?

De Helm-client implementeert een sjabloonengine op basis van een Go-taal waarmee alle beschikbare bestanden in de mappen van een grafiek worden geparseerd. De sjabloonengine maakt Kubernetes-manifestbestanden door de sjablonen in de map templates/ van de grafiek te combineren met de waarden uit de Chart.yaml- en values.yaml-bestanden.

Een diagram toont een proces dat een Helm-sjabloonbestand en -waardenbestand parseert om een toepassing te maken en te implementeren in een Kubernetes-cluster met behulp van manifestbestanden.

Zodra de manifestbestanden beschikbaar zijn, kan de client de toepassing installeren, upgraden en verwijderen die is gedefinieerd in de gegenereerde manifestbestanden.

Een Chart.yaml-bestand definiëren

De Chart.yaml is een van de vereiste bestanden in een Helm-grafiekdefinitie en bevat informatie over de grafiek. De inhoud van het bestand bestaat uit drie vereiste velden en verschillende optionele velden.

De drie vereiste velden zijn:

  • apiVersion: de api-versie van de grafiek die moet worden gebruikt. U stelt de versie in op v2 voor grafieken die Gebruikmaken van Helm 3.
  • name: de naam van de grafiek.
  • version: het versienummer van de grafiek, dat gebruikmaakt van semantische versiebeheer 2.0.0 en volgt de MAJOR.MINOR.PATCH versienummernotatie.

In het volgende voorbeeld ziet u de inhoud van een basisbestand Chart.yaml:

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

Let op het gebruik van het veld type in het voorbeeldbestand. U kunt grafieken maken om toepassingen of bibliotheken te installeren. Het standaardgrafiektype is application en kan worden ingesteld op library om op te geven dat de grafiek een bibliotheek installeert.

Er zijn veel optionele velden beschikbaar om het implementatieproces voor grafieken aan te passen. U kunt bijvoorbeeld het veld dependencies gebruiken om extra vereisten voor de grafiek op te geven, zoals een web-app die afhankelijk is van een database.

Notitie

Gedetailleerde dekking van alle optionele velden valt buiten het bereik van deze module. Er is echter een koppeling naar de Helm-documentatie beschikbaar in de overzichtssectie van de module.

Een grafieksjabloon definiëren

Een Helm-grafieksjabloon is een bestand waarin verschillende manifestbestanden van het implementatietype worden beschreven. Grafieksjablonen worden geschreven in de go-sjabloontaal en bieden sjabloonfuncties om het maken van Manifestbestanden van Kubernetes-objecten te automatiseren.

Sjabloonbestanden worden opgeslagen in de map templates/ van een grafiek. De sjabloonengine verwerkt deze bestanden om het uiteindelijke objectmanifest te maken.

Stel dat uw ontwikkelteam het volgende manifestbestand voor de implementatie gebruikt om het front-onderdeel van de oplossing voor dierenopslag te implementeren:

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

Merk op hoe de locatie van de containerimage is gehardcodeerd met behulp van de {{.Values.<property>}}-syntaxis. Met de syntaxis kunt u tijdelijke aanduidingen maken voor elke aangepaste waarde.

Het proces voor het maken van Helm-grafieken met de hand is tijdrovend. Een eenvoudige manier om een Helm-grafiek te maken, is door de opdracht helm create te gebruiken om een nieuwe Helm-grafiek te maken. Vervolgens past u de automatisch gegenereerde bestanden aan zodat deze overeenkomen met de vereisten van uw toepassing.

Een values.yaml-bestand definiëren

U gebruikt grafiekwaarden om de configuratie van een Helm-grafiek aan te passen. Grafiekwaarden kunnen vooraf worden gedefinieerd of door de gebruiker worden opgegeven op het moment dat de grafiek wordt geïmplementeerd.

Een vooraf gedefinieerde waarde is een hoofdlettergevoelige waarde die vooraf is gedefinieerd binnen de context van een Helm-chart en die niet kan worden gewijzigd door een gebruiker. U kunt bijvoorbeeld Release.Name gebruiken om te verwijzen naar de naam van de release of Release.IsInstall om te controleren of de huidige bewerking een installatie is.

U kunt ook vooraf gedefinieerde waarden gebruiken om gegevens uit de inhoud van de Chart.yamlte extraheren. Als u bijvoorbeeld de versie van de grafiek wilt controleren, verwijst u naar Chart.Version. Houd er rekening mee dat u alleen naar bekende velden kunt verwijzen. U kunt vooraf gedefinieerde waarden beschouwen als constanten die u kunt gebruiken in de sjablonen die u maakt.

De syntaxis voor het opnemen van waardenamen in een sjabloonbestand omvat het plaatsen van de waardenaam in dubbele accolades, bijvoorbeeld {{.Release.Name}}. Let erop dat er een punt vóór de naam van de waarde gebruikt wordt. Wanneer u een punt op deze manier gebruikt, functioneert de punt als opzoekoperator en geeft het het huidige bereik van de variabele aan.

Het volgende YAML-fragment bevat bijvoorbeeld een woordenlijst die is gedefinieerd in een waardenbestand:

object:
  key: value

Voor toegang tot de waarde in een sjabloon kunt u de volgende syntaxis gebruiken:

{{ .Values.object.key }}

Met een opgegeven waarde kunt u willekeurige waarden in de grafieksjabloon verwerken. Het bestand values.yaml definieert deze waarden.

In het voorbeeld maakt het ontwikkelteam de volgende configureerbare waarden mogelijk:

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 }}
  ...

Hier volgt een voorbeeld van het values.yaml-bestand:

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

Zodra de sjabloonengine de waarden toepast, ziet het uiteindelijke resultaat eruit als in dit voorbeeld:

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
  ...

Een Helm-repository gebruiken

Een Helm-opslagplaats is een toegewezen HTTP-server waarin informatie in Helm-grafieken wordt opgeslagen. U configureert Helm-opslagplaatsen met de Helm-client om grafieken uit een opslagplaats te installeren met behulp van de opdracht helm repo add.

U kunt bijvoorbeeld de Azure Marketplace Helm-opslagplaats toevoegen aan uw lokale Helm-client door de volgende opdracht uit te voeren:

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

Informatie over grafieken die beschikbaar zijn in een opslagplaats, wordt in de cache opgeslagen op de clienthost. U moet de cache periodiek bijwerken om de meest recente informatie van de opslagplaats op te halen met behulp van de opdracht helm repo update.

Met de opdracht helm search repo kunt u zoeken naar grafieken in alle lokaal toegevoegde Helm-opslagplaatsen. U kunt de opdracht helm search repo zelf uitvoeren om een lijst met alle bekende Helm-grafieken voor elke toegevoegde opslagplaats te retourneren. Het resultaat bevat de naam, versie en app-versie van de grafiek die door de grafiek is geïmplementeerd, zoals wordt weergegeven in de volgende voorbeelduitvoer:

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...

U kunt een specifieke grafiek zoeken door een zoekterm toe te voegen aan de opdracht helm search repo. Als u bijvoorbeeld zoekt naar een grafiek op basis van ASP.NET, kunt u de volgende opdracht gebruiken:

helm search repo aspnet

In dit voorbeeld heeft de lokale client twee opslagplaatsen geregistreerd en retourneert een resultaat van elke opslagplaats, zoals wordt weergegeven in de volgende voorbeelduitvoer:

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...

Een Helm-grafiek testen

Helm biedt een optie voor het genereren van de manifestbestanden die de sjabloonengine maakt op basis van de grafiek. Met deze functie kunt u de grafiek testen vóór een release door twee extra parameters te combineren: --dry-run en debug. De parameter --dry-run zorgt ervoor dat de installatie gesimuleerd wordt, en de parameter --debug schakelt uitgebreide uitvoer in.

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

De opdracht bevat informatie over de gebruikte waarden en alle gegenereerde bestanden. Mogelijk moet u schuiven om alle gegenereerde uitvoer weer te geven.

Een Helm-grafiek installeren

U gebruikt de opdracht helm install om een grafiek te installeren. U kunt een Helm-grafiek installeren vanaf een van de volgende locaties:

  • Grafiekmappen
  • Verpakte .tgz tar-archiefgrafieken
  • Helm-opslagplaatsen

De vereiste parameters verschillen echter, afhankelijk van de locatie van de grafiek. In alle gevallen vereist de opdracht install de naam van de grafiek die u wilt installeren en een naam voor de release die de installatie maakt.

U kunt een lokale grafiek installeren met behulp van een uitgepakte grafiekmap met bestanden of een verpakt .tgz tar-archief. Als u een grafiek wilt installeren, verwijst de opdracht helm naar het lokale bestandssysteem voor de locatie van de grafiek. Hier volgt een voorbeeld van de installatieopdracht waarmee een release van een uitgepakte grafiek wordt geïmplementeerd:

helm install my-release ./chart-name

In het vorige voorbeeld is de parameter my-release de naam van de release en is de parameter ./chart-name de naam van het uitgepakte grafiekpakket.

Er wordt een verpakte grafiek geïnstalleerd door te verwijzen naar de bestandsnaam van de verpakte grafiek. In het volgende voorbeeld ziet u de syntaxis voor dezelfde toepassing die nu is verpakt als een tar-archief:

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

Wanneer u een grafiek installeert vanuit een Helm-opslagplaats, gebruikt u een grafiekreferentie als de naam van de grafiek. De grafiekreferentie bevat twee parameters, de naam van de opslagplaats en de naam van de grafiek, zoals wordt weergegeven in het volgende voorbeeld:

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

In het voorbeeld bevat de parameter repository-name/chart-name de verwijzing van de opslagplaats, repository-nameen de naam van de grafiek, chart-name.