Správa verze Helm

Dokončeno

Jak používat funkce v šabloně Helm

Jazyk šablony Helm definuje funkce, které slouží k transformaci hodnot ze souboru values.yaml. Syntaxe funkce se řídí strukturou {{ názevFunkce arg1 arg2 ... }}. Pojďme se podívat na funkci quote, která nám bude sloužit jako příklad použití této syntaxe.

Funkce quote uzavře hodnotu do uvozovek, aby určila použití string. Řekněme, že definujete následující values.yaml soubor:

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes
ingress:
  enabled: true

Rozhodnete se, že při určování toho, jestli se má vygenerovat manifest příchozího přenosu dat, chcete použít hodnotu ingress.enabled jako logickou hodnotu. Pokud chcete použít hodnotu enabled jako logickou hodnotu, budete na ni odkazovat pomocí {{ .Values.ingress.enabled }}.

Později se rozhodnete zobrazit pole jako řetězec v souboru templates/Notes.txt. Vzhledem k tomu, že pravidla převodu typů YAML můžou vést k těžko najít chybám v šablonách, rozhodnete se postupovat podle pokynů a být explicitní při zahrnutí řetězců do šablon. Například enabled: false se nerovná enabled: "false".

Pokud chcete zobrazit hodnotu jako řetězec, použijte pro odkazování na logickou hodnotu jako řetězec {{ quote .Values.ingress.enabled }}.

Jak používat kanály v šabloně Helm

Kanály použijete, když s hodnotou potřebuje pracovat více funkcí. Kanál umožňuje odeslat hodnotu nebo výsledek funkce do jiné funkce. Můžete například přepsat výše uvedenou funkci quote jako {{ .Values.ingress.enabled | quote }}. Všimněte si, jak | indikuje, že je hodnota odeslána do funkce quote.

Tady je další příklad. Řekněme, že chcete převést hodnotu na velká písmena a zabalit ji do uvozovek. Příkaz můžete napsat jako {{ .Values.ingress.enabled | upper | quote }}. Všimněte si, jak hodnotu zpracuje funkce upper a potom funkce quote.

Jazyk šablony zahrnuje více než 60 funkcí, které umožňují vystavovat, vyhledávat a transformovat hodnoty a objekty v šablonách.

Jak používat řízení podmíněného toku v šabloně Helm

Řízení podmíněného toku umožňuje zvolit strukturu nebo data zahrnutá ve vygenerovaném souboru manifestu. Můžete například chtít zahrnout různé hodnoty na základě cíle nasazení nebo ovládacího prvku, pokud se vygeneruje soubor manifestu.

Blok if / else je taková struktura toku řízení a odpovídá následujícímu rozložení:

{{ if | pipeline | }}
  # Do something
{{ else if | other pipeline | }}
  # Do something else
{{ else }}
  # Default case
{{ end }}

Řekněme, že se rozhodnete, že se soubor manifestu příchozího přenosu dat pro graf vytvoří jenom v konkrétních případech. Následující příklad ukazuje, jak toho dosáhnout pomocí if příkazu:

{{ if .Values.ingress.enabled }}
apiVersion: extensions/v1
kind: Ingress
metadata:
  name: ...
  labels:
    ...
  annotations:
    ...
spec:
  rules:
    ...
{{ end }}

Nezapomeňte, že k naplnění metadat v šabloně můžete použít zástupné symboly. Soubory šablony se analyzují a následně vyhodnocují shora dolů jazykem šablony. V předchozím příkladu modul šablony generuje pouze obsah souboru manifestu, pokud .Values.ingress.enabled je truehodnota .

Když modul šablony zpracuje příkaz, odebere obsah deklarovaný uvnitř {{ }} syntaxe a ponechá zbývající prázdné znaky. Tato syntaxe způsobí, že modul šablony zahrne nový řádek pro řádek příkazu if. Pokud ponecháte obsah předchozího souboru tak, jak je, všimnete si prázdných řádků v YAML a vygeneruje se soubor manifestu příchozího přenosu dat.

YAML dává prázdnému znaku význam. Proto jsou tabulátory, mezery a znaky nového řádku považovány za důležité. Pokud chcete odstranit problém nechtěného prázdného znaku, můžete soubor přepsat následovně:

{{- if .Values.ingress.enabled -}}
apiVersion: extensions/v1
kind: Ingress
metadata:
  name: ...
  labels:
    ...
  annotations:
    ...
spec:
  rules:
    ...
{{- end }}

Všimněte si použití znaku - jako součásti spouštěcí {{- a koncové -}} sekvence příkazu. Znak - dává pokyn analyzátoru, aby odebral prázdné znaky. {{- odstraní prázdné znaky na začátku řádku a -}} na konci řádku, včetně znaku nového řádku.

Postup iterace kolekcí hodnot v šabloně Helm

YAML umožňuje definovat kolekce položek a použít jednotlivé položky jako hodnoty v šablonách. Přístup k položkám v kolekci je možný pomocí indexeru. Jazyk šablony Helm ale podporuje iteraci kolekce hodnot pomocí operátoru range.

Řekněme, že definujete seznam hodnot v values.yaml souboru, který indikuje další hostitele příchozího přenosu dat. Tady je příklad hodnot:

ingress:
  enabled: true
  extraHosts:
    - name: host1.local
      path: /
    - name: host2.local
      path: /
    - name: host3.local
      path: /

Pomocí operátoru rozsahu umožníte, aby modul šablony provedl iteraci v .Values.ingress.extraHosts. Následující fragment kódu ukazuje zhuštěný příklad pomocí operátoru range :

{{- if .Values.ingress.enabled -}}
apiVersion: extensions/v1
kind: Ingress
metadata:
  ...
spec:
  rules:
    ...
    {{- range .Values.ingress.extraHosts }}
    - host: {{ .name }}
      http:
        paths:
          - path: {{ .path }}
            ...
    {{- end }}
  ...
{{- end }}

Řízení rozsahu hodnot v šabloně Helm

Pokud máte definované hodnoty v několika vrstvách hluboko, může být syntaxe zdlouhavá a těžkopádná, když tyto hodnoty zahrnete do šablony. Akce with vám umožňuje rozsah proměnných v šabloně omezit.

Nezapomeňte, že . použitý v šabloně Helm odkazuje na aktuální obor. Například .Values dává modulu šablony pokyn, aby vyhledal objekt hodnot v aktuálním rozsahu. Řekněme, že k vytvoření souboru manifestu values.yaml mapy konfigurace používáte soubor z předchozích verzí:

ingress:
  enabled: true
  extraHosts:
    - name: host1.local
      path: /
    - name: host2.local
      path: /
    - name: host3.local
      path: /

K hodnotám cesty jednotlivých položek nemusíte přistupovat pomocí {{ .Values.ingress.extraHosts.path }}, můžete použít akci with. Následující fragment kódu ukazuje příklad použití operátoru range k vygenerování souboru manifestu mapování konfigurace:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- with .Values.ingress.extraHosts }}
  hostname: {{ .name }}
  path: {{ .path }}
  {{ end }}

{{- with .Values.ingress.extraHosts }} omezuje rozsah hodnot na pole .Values.ingress.extraHosts.

Akce with omezuje rozsah. Z nadřazeného rozsahu nemůžete přistupovat k ostatním objektům. Řekněme, že chcete také získat přístup k {{ .Release.Name }} grafu v with bloku kódu. Pokud chcete získat přístup k nadřazeným objektům, musíte určit kořenový rozsah pomocí znaku $ nebo přepsat kód. Tady je aktualizovaný kód, který ukazuje, jak pomocí znaku $ zahrnout nadřazené objekty:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- with .Values.ingress.extraHosts }}
  hostname: {{ .name }}
  path: {{ .path }}
  release: {{ $.Release.Name}}
  {{ end }}

Poznámka:

Jazyk šablony Helm obsahuje několik konstruktorů pro řízení toku. Souhrnná lekce tohoto modulu obsahuje oddíl s odkazy na dokumentaci k nástroji Helm, ve které se dozvíte další informaci.

Jak helm definovat závislosti grafu

Chart umožňuje deklaraci závislostí pro podporu hlavní aplikace a tvoří součást nainstalované verze.

A diagram shows how Helm deploys all subcharts as dependencies of the main chart to a Kubernetes cluster.

Můžete buď vytvořit dílčí chart pomocí příkazu helm create a určit umístění nového chartu ve složce /charts, nebo použít příkaz helm dependency. Nezapomeňte, že /charts složka může obsahovat dílčí grafy nasazené v rámci vydání hlavního grafu.

Příkaz helm dependency umožňuje spravovat závislosti zahrnuté z úložiště Helm. Příkaz používá metadata definovaná v části dependencies souboru hodnot chartu. Zadáte název, číslo verze a úložiště, ze kterého se má dílčí graf nainstalovat. Tady je extrakce values.yaml souboru, který obsahuje graf MongoDB uvedený jako závislost:

apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
...
dependencies:
  - name: mongodb
    version: 10.27.2
    repository: https://marketplace.azurecr.io/helm/v1/repo

Po definování metadat závislosti spustíte příkaz helm dependency build, který načte chart zabalený v souboru TAR. Příkaz pro sestavení chartu stáhne chart do složky charts/.

helm dependency build ./app-chart

Dílčí grafy se spravují odděleně od hlavního grafu a můžou potřebovat aktualizace, jakmile budou k dispozici nové verze. Příkaz pro aktualizaci dílčích chartů je helm dependency update. Tento příkaz načte nové verze dílčího grafu při odstraňování zastaralých balíčků.

helm dependency update ./app-chart

Mějte na paměti, že závislost grafu není omezena na jiné aplikace. Můžete se rozhodnout znovu použít logiku šablony v grafech a vytvořit závislost speciálně pro správu této logiky jako závislost grafu. Příklad této strategie získáte v dalším cvičení.

Postup upgradu verze Helm

Helm umožňuje upgradovat existující verze jako rozdíl všech změn, které platí pro chart a jeho závislosti.

A diagram shows how the Helm upgrade command creates a delta of all changed items in a Helm chart to upgrade a release and create a new release revision on a Kubernetes cluster.

Řekněme například, že vývojový tým příkladu webapp v této lekci provádí změny kódu, které mají vliv jenom na funkčnost webu. Tým provede následující aktualizace Chart.yaml souboru tak, aby odrážel novou verzi aplikace:

  • Aktualizace image kontejneru webové aplikace a označí image jako webapp: linux-v2 při nahrání image do registru kontejneru.
  • dockerTag Aktualizace hodnotu do linux-v2 souboru hodnot grafu a hodnotu 0.2.0 verze grafu.

Tady je příklad aktualizovaného values.yaml souboru:

apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes

type: application

version: 0.2.0
appVersion: 1.0.0

registry: "my-acr-registry.azurecr.io"
dockerTag: "linux-v2"
pullPolicy: "Always"

Místo odinstalace aktuální verze použijete helm upgrade příkaz k upgradu stávající verze Helm.

helm upgrade my-app ./app-chart

Mějte na paměti, že Helm při upgradu verze vygeneruje rozdíl změn provedených v chartu Helm. Upgrade Helm proto upgraduje pouze komponenty zjištěné v rozdílu. V příkladu se znovu nasadí pouze web.

Po dokončení upgradu můžete pomocí příkazu s názvem vydané verze helm history zkontrolovat historii nasazení verze.

helm history my-app

Příkaz historie vrátí několik polí, která popisují vydání, jak je znázorněno v následujícím příkladu výstupu:

REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Mon Oct 11 17:25:33 2021        deployed        aspnet-core-1.3.18      3.1.19          Install complete

Ve výsledku si všimněte pole revision. Helm sleduje informace o verzi všech verzí vytvořených pro chart Helm. Když nainstalujete novou verzi chartu Helm, počet revizí se zvýší o jednu a informace o nové verzi odpovídají této revizi.

Tady je příklad stejného příkazu historie, který spustí po instalaci nové verze webové aplikace:

REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Mon Oct 11 17:25:33 2021        superseded      aspnet-core-1.3.18      3.1.19          Install complete
2               Mon Oct 11 17:35:13 2021        deployed        aspnet-core-1.3.18      3.1.19          Upgrade complete

Postup vrácení verze Helm zpět

Helm umožňuje vrácení existující verze Helm zpět na dříve nainstalovanou verzi. Vzpomeňte si, že Helm sleduje informace o vydání všech verzí chartu Helm.

Pomocí příkazu helm rollback se vrátíte zpět ke konkrétní revizi verze Helm. Tento příkaz používá dva parametry. První parametr určuje název verze a druhý označuje číslo revize verze.

helm rollback my-app 2

Příkaz helm rollback vrátí zpět verzi aplikace na zadanou revizi a aktualizuje historii verzí aplikace. Následné spuštění helm history příkazu zobrazuje nejnovější číslo aktivní revize jako položku nejnovější verze.

Řekněme například, že vývojový tým příkladu webapp v této lekci zjistí chybu ve webové aplikaci pro sledování dronů a musí se vrátit k předchozí verzi. Místo odinstalace aktuální verze a instalace předchozí verze se vrátí k pracovní verzi.

helm rollback my-app 1

Po dokončení vrácení zpět můžete pomocí příkazu zkontrolovat historii helm history nasazení.

REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Mon Oct 11 17:25:33 2021        superseded      aspnet-core-1.3.18      3.1.19          Install complete
2               Mon Oct 11 17:35:13 2021        superseded      aspnet-core-1.3.18      3.1.19          Rolled back to 1
3               Mon Oct 11 17:38:13 2021        deployed        aspnet-core-1.3.18      3.1.19          Upgrade complete

Všimněte si, že pole popisu zobrazuje číslo revize vrácení zpět, aby pro vás bylo jednodušší sledovat změny.

Kontrola znalostí

1.

Řekněme, že máte softwarové řešení se dvěma důležitými komponentami: webovou aplikací a službou, která zpracovává online objednávky. Obě komponenty jsou součástí kanálu online zpracování objednávek, ale nemají na sobě závislost. Která strategie by nejlépe vyhovovala nasazení těchto dvou aplikací pomocí Nástroje Helm?

2.

Řekněme, že máte softwarové řešení, které má web jako jednu z jeho důležitých komponent. Web je jedinou součástí, která závisí na službě pro ukládání do mezipaměti. Která strategie by nejlépe vyhovovala nasazení těchto dvou aplikací pomocí Nástroje Helm?