Een Helm-release beheren
Functies gebruiken in een Helm-sjabloon
De taal van de Helm-sjabloon definieert functies die u gebruikt om waarden uit het values.yaml
-bestand te transformeren. De syntaxis voor een functie volgt de {{ functionName arg1 arg2 ... }} structuur. Laten we eens kijken naar de functie quote
als voorbeeld om deze syntaxis in gebruik te zien.
De functie quote
verpakt een waarde tussen aanhalingstekens om het gebruik van een string
aan te geven. Stel dat u het volgende values.yaml
-bestand definieert:
apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes
ingress:
enabled: true
U besluit dat u de ingress.enabled
-waarde wilt gebruiken als een booleaanse waarde bij het bepalen of een ingangsmanifest moet worden gegenereerd. Als u de enabled
-waarde als een Booleaanse waarde wilt gebruiken, verwijst u naar de waarde met behulp van {{ .Values.ingress.enabled }}
.
Later besluit u het veld weer te geven als een tekenreeks in het templates/Notes.txt
bestand. Omdat YAML-regels voor type-dwang kunnen leiden tot moeilijk te vinden fouten in sjablonen, besluit u richtlijnen te volgen en expliciet te zijn bij het opnemen van tekenreeksen in uw sjablonen.
enabled: false
is bijvoorbeeld niet gelijk aan enabled: "false"
.
Als u de waarde als een tekenreeks wilt weergeven, gebruikt u {{ quote .Values.ingress.enabled }}
om te verwijzen naar de Booleaanse waarde als een tekenreeks.
Pijplijnen gebruiken in een Helm-sjabloon
U gebruikt pijplijnen wanneer meer dan één functie op een waarde moet reageren. Met een pijplijn kunt u een waarde of het resultaat van een functie verzenden naar een andere functie. U kunt de bovenstaande quote
bijvoorbeeld opnieuw schrijven als {{ .Values.ingress.enabled | quote }}
. Let op hoe de |
aangeeft dat de waarde naar de functie quote
wordt verzonden.
Hier volgt nog een voorbeeld. Stel dat u een waarde wilt omzetten naar hoofdletters en deze tussen aanhalingstekens wilt plaatsen. U kunt de verklaring schrijven als {{ .Values.ingress.enabled | upper | quote }}
. U ziet hoe de waarde wordt verwerkt door de upper
functie en vervolgens de quote
functie.
De sjabloontaal bevat meer dan 60 functies waarmee u waarden en objecten in sjablonen kunt weergeven, opzoeken en transformeren.
Conditionele stroomcontrole in een Helmsjabloon gebruiken
Met stroombeheer op basis van voorwaarden kunt u bepalen welke structuur of gegevens zijn opgenomen in het gegenereerde manifestbestand. U kunt bijvoorbeeld verschillende waarden opnemen op basis van het implementatiedoel of besturingselement als er een manifestbestand wordt gegenereerd.
Het if / else
blok is een dergelijke controlestroomstructuur en voldoet aan de volgende indeling:
{{ if | pipeline | }}
# Do something
{{ else if | other pipeline | }}
# Do something else
{{ else }}
# Default case
{{ end }}
Stel dat u besluit dat het ingress-manifestbestand voor een chart alleen in specifieke gevallen wordt aangemaakt. In het volgende voorbeeld ziet u hoe u dit kunt doen met behulp van een if
-instructie:
{{ if .Values.ingress.enabled }}
apiVersion: extensions/v1
kind: Ingress
metadata:
name: ...
labels:
...
annotations:
...
spec:
rules:
...
{{ end }}
Houd er rekening mee dat u tijdelijke aanduidingen kunt gebruiken om metagegevens in de sjabloon in te vullen. Sjabloonbestanden worden sequentieel geparseerd en geëvalueerd door de sjabloontaal van boven naar beneden. In het vorige voorbeeld genereert de sjabloonengine alleen de inhoud van het manifestbestand als de waarde .Values.ingress.enabled
is true
.
Wanneer de sjabloonengine de instructie verwerkt, wordt de inhoud verwijderd die in de {{ }}
syntaxis is gedeclareerd en blijft de resterende witruimte behouden. Deze syntaxis zorgt ervoor dat de sjabloonengine een nieuwe regel voor de if
instructieregel bevat. Als u de inhoud van het voorgaande bestand as-islaat, ziet u lege regels in uw YAML en wordt het manifestbestand voor inkomend verkeer gegenereerd.
YAML geeft betekenis aan witruimte. Daarom worden tabs, spatiesen regeltekens als belangrijk beschouwd. U kunt het bestand als volgt herschrijven om het probleem van ongewenste witruimte op te lossen:
{{- if .Values.ingress.enabled -}}
apiVersion: extensions/v1
kind: Ingress
metadata:
name: ...
labels:
...
annotations:
...
spec:
rules:
...
{{- end }}
Let op het gebruik van het -
teken als onderdeel van het begin {{-
en de eindvolgorde van de instructie -}}
. Met het -
teken wordt de parser geïnstrueerd om spaties te verwijderen.
{{-
verwijdert witruimte aan het begin van een regel en -}}
aan het einde van een regel, inclusief het nieuwe regelteken.
Hoe je een verzameling waarden doorloopt in een Helm-sjabloon
MET YAML kunt u verzamelingen items definiëren en afzonderlijke items gebruiken als waarden in uw sjablonen. Het openen van items in een verzameling is mogelijk met behulp van een indexeerfunctie. De Helm-sjabloontaal ondersteunt echter de iteratie van een verzameling waarden met behulp van de operator range
.
Stel dat u in uw values.yaml
-bestand een lijst met waarden definieert om extra ingangshosts aan te geven. Hier volgt een voorbeeld van de waarden:
ingress:
enabled: true
extraHosts:
- name: host1.local
path: /
- name: host2.local
path: /
- name: host3.local
path: /
U gebruikt de bereikoperator om de sjabloonengine iteraties door te laten voeren over de .Values.ingress.extraHosts
. In het volgende codefragment ziet u een verkort voorbeeld met behulp van de operator 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 }}
Het bereik van waarden in een Helm-sjabloon beheren
Wanneer u waarden hebt gedefinieerd die verschillende lagen diep zijn gedefinieerd, kan uw syntaxis lang en lastig worden wanneer u deze waarden in een sjabloon op wilt opnemen. Met de actie with
kunt u het bereik van variabelen in een sjabloon beperken.
Houd er rekening mee dat de .
die in een Helm-sjabloon wordt gebruikt, verwijst naar de huidige scope. De .Values
geeft bijvoorbeeld de sjabloonengine de opdracht om het Values-object in de huidige scope te vinden. Stel dat u het values.yaml
-bestand van eerder gebruikt om een manifestbestand voor een configuratietoewijzing te maken:
ingress:
enabled: true
extraHosts:
- name: host1.local
path: /
- name: host2.local
path: /
- name: host3.local
path: /
In plaats van de padwaarde van elk item te benaderen met behulp van {{ .Values.ingress.extraHosts.path }}
, kunt u de actie with
gebruiken. In het volgende codefragment ziet u een voorbeeld met behulp van de operator range
voor het genereren van een manifestbestand voor een configuratietoewijzing:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- with .Values.ingress.extraHosts }}
hostname: {{ .name }}
path: {{ .path }}
{{ end }}
De {{- with .Values.ingress.extraHosts }}
beperkt het bereik van waarden tot de .Values.ingress.extraHosts
matrix.
De actie with
beperkt het bereik. U hebt geen toegang tot andere objecten vanuit de bovenliggende scope. Stel dat u ook toegang wilt krijgen tot de {{ .Release.Name }}
van de grafiek in het codeblok with
. Als u toegang wilt krijgen tot bovenliggende objecten, moet u het hoofdbereik aangeven met behulp van het $
teken of de code opnieuw schrijven. Hier ziet u de bijgewerkte code om weer te geven hoe u bovenliggende objecten kunt opnemen met behulp van het $
teken:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- with .Values.ingress.extraHosts }}
hostname: {{ .name }}
path: {{ .path }}
release: {{ $.Release.Name}}
{{ end }}
Notitie
Er zijn verschillende constructies beschikbaar in de Helm-sjabloontaal om de stroom te beheren. De samenvattingseenheid van deze module bevat een sectie met koppelingen naar de Helm-documentatie voor meer informatie.
Hoe afhankelijkheden van grafieken in Helm te definiëren
Met een grafiek kan de declaratie van afhankelijkheden de hoofdtoepassing ondersteunen en deel uitmaken van de geïnstalleerde release.
U kunt een subgrafiek maken met behulp van de opdracht helm create
, de locatie van de nieuwe grafiek opgeven in de map /charts
of de opdracht helm dependency
gebruiken. Houd er rekening mee dat de map /charts
subgrafieken kan bevatten die zijn geïmplementeerd als onderdeel van de release van de hoofdgrafiek.
Met de opdracht helm dependency
kunt u afhankelijkheden beheren die zijn opgenomen in een Helm-opslagplaats. De opdracht maakt gebruik van metagegevens die zijn gedefinieerd in de sectie dependencies
van het waardenbestand van uw grafiek. U geeft de naam, het versienummer en de opslagplaats op van waaruit u het subdiagram wilt installeren. Hier volgt een extract van een values.yaml
-bestand met een MongoDB-grafiek die wordt vermeld als een afhankelijkheid:
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
Zodra de metagegevens van de afhankelijkheid zijn gedefinieerd, voert u de opdracht helm dependency build
uit om de in tar verpakte grafiek op te halen. Met de chart build-opdracht wordt de grafiek gedownload in de map charts/
.
helm dependency build ./app-chart
Subgrafieken worden afzonderlijk van de hoofdgrafiek beheerd en hebben mogelijk updates nodig wanneer er nieuwe releases beschikbaar komen. De opdracht voor het bijwerken van subgrafieken is helm dependency update
. Met deze opdracht worden nieuwe versies van het subdiagram opgehaald tijdens het verwijderen van verouderde pakketten.
helm dependency update ./app-chart
Houd er rekening mee dat een grafiekafhankelijkheid niet beperkt is tot andere toepassingen. U kunt besluiten sjabloonlogica opnieuw te gebruiken in uw grafieken en een afhankelijkheid te maken die specifiek is bedoeld voor het beheren van deze logica als grafiekafhankelijkheid. In de volgende oefening krijgt u een voorbeeld van deze strategie.
Een Helm-release upgraden
Met Helm kunnen bestaande releases worden bijgewerkt als een delta van alle wijzigingen die van toepassing zijn op de grafiek en de bijbehorende afhankelijkheden.
Stel dat het ontwikkelteam van het voorbeeld webapp
in deze les codewijzigingen aanbrengt die alleen van invloed zijn op de functionaliteit van de website. Het team voert de volgende updates uit voor het Chart.yaml
-bestand om de nieuwe versie van de toepassing weer te geven:
- Werkt het containerbeeld van de web-app bij en tagt het als
webapp: linux-v2
bij verzending naar het containerregister. - Hiermee werkt u de
dockerTag
waarde bij naarlinux-v2
en de waarde van de grafiekversie naar0.2.0
in het waardenbestand van de grafiek.
Hier volgt een voorbeeld van het bijgewerkte values.yaml
-bestand:
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"
In plaats van een huidige release te verwijderen, gebruikt u de opdracht helm upgrade
om de bestaande Helm-release bij te werken.
helm upgrade my-app ./app-chart
Houd er rekening mee dat Helm een delta genereert van de wijzigingen die zijn aangebracht in de Helm-grafiek wanneer u een release bijwerkt. Als zodanig wordt met een Helm-upgrade alleen de onderdelen bijgewerkt die zijn geïdentificeerd in de delta. In het voorbeeld wordt alleen de website opnieuw geïmplementeerd.
Zodra de upgrade is voltooid, kunt u de implementatiegeschiedenis van de release bekijken met behulp van de opdracht helm history
met de releasenaam.
helm history my-app
De geschiedenisopdracht retourneert verschillende velden die de release beschrijven, zoals wordt weergegeven in de volgende voorbeelduitvoer:
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
Let op het revision
veld in het resultaat. Helm houdt release-informatie bij van alle releases die zijn uitgevoerd voor een Helm-chart. Wanneer u een nieuwe versie van een Helm-grafiek installeert, neemt het aantal revisies met één toe en wordt de nieuwe release-informatie vergeleken met die revisie.
Hier volgt een voorbeeld van dezelfde geschiedenisopdracht die wordt uitgevoerd na een nieuwe versie-installatie van de web-app:
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
Hoe een Helm-release terugdraaien
Helm maakt het mogelijk om een bestaande Helm-release terug te draaien naar een eerder geïnstalleerde release. Vergeet niet dat Helm de informatie over releases van alle releases van een Helm-chart bijhoudt.
U gebruikt de opdracht helm rollback
om terug te keren naar een specifieke Helm-releaserevisie. Deze opdracht maakt gebruik van twee parameters. De eerste parameter identificeert de naam van de release en de tweede identificeert het revisienummer van de release.
helm rollback my-app 2
Met de opdracht helm rollback
wordt de releaseversie van de app teruggedraaid naar de opgegeven revisie en wordt de releasegeschiedenis van de app bijgewerkt. In een vervolguitvoering van de opdracht helm history
wordt het meest recente actieve revisienummer weergegeven als de meest recente releasevermelding.
Stel dat het ontwikkelteam van het voorbeeld webapp
in deze les een bug ontdekt in de webtoepassing voor het traceren van drones en moet terugkeren naar een vorige release. In plaats van de huidige release te verwijderen en een eerdere versie te installeren, worden ze teruggedraaid naar de werkende release.
helm rollback my-app 1
Zodra het terugdraaien is voltooid, kunt u de implementatiegeschiedenis bekijken met behulp van de opdracht helm history
.
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
U ziet in het beschrijvingsveld het revisienummer van de terugdraaiactie, zodat u gemakkelijker wijzigingen kunt bijhouden.