Der Helm Plugins Leitfaden
Ein Helm Plugin ist ein Werkzeug, das über die helm CLI aufgerufen werden kann,
aber nicht Teil des integrierten Helm-Quellcodes ist.
Bestehende Plugins finden Sie im Bereich Verwandte Projekte oder durch eine Suche auf GitHub.
Dieser Leitfaden erklärt, wie Sie Plugins verwenden und erstellen.
Überblick
Helm Plugins sind Erweiterungswerkzeuge, die sich nahtlos in Helm integrieren. Sie bieten eine Möglichkeit, die Kernfunktionalität von Helm zu erweitern, ohne dass jede neue Funktion in Go geschrieben und dem Kern-Tool hinzugefügt werden muss.
Helm Plugins haben folgende Eigenschaften:
- Sie können einer Helm-Installation hinzugefügt und daraus entfernt werden, ohne das Kern-Tool zu beeinflussen.
- Sie können in jeder Programmiersprache geschrieben werden.
- Sie integrieren sich in Helm und erscheinen in
helm helpund an anderen Stellen.
Helm Plugins befinden sich in $HELM_PLUGINS. Den aktuellen Wert dieses Pfads,
einschließlich des Standardwerts wenn er nicht in der Umgebung gesetzt ist, können
Sie mit dem Befehl helm env ermitteln.
Das Helm Plugin-Modell basiert teilweise auf dem Plugin-Modell von Git. Daher
wird helm manchmal als Porcelain-Schicht (Benutzeroberfläche) bezeichnet,
während Plugins die Plumbing-Schicht (Basiswerkzeuge) darstellen. Das bedeutet:
Helm stellt die Benutzererfahrung und die übergeordnete Verarbeitungslogik bereit,
während die Plugins die "Detailarbeit" zur Ausführung einer gewünschten Aktion
übernehmen.
Ein Plugin installieren
Plugins werden mit dem Befehl $ helm plugin install <pfad|url> installiert. Sie
können einen Pfad zu einem Plugin auf Ihrem lokalen Dateisystem oder eine URL
eines entfernten VCS-Repositories angeben. Der Befehl helm plugin install klont
oder kopiert das Plugin vom angegebenen Pfad/URL nach $HELM_PLUGINS. Wenn Sie
von einem VCS installieren, können Sie die Version mit dem Argument --version
angeben.
$ helm plugin install https://github.com/adamreese/helm-env
Wenn Sie eine Plugin-Tar-Distribution haben, entpacken Sie das Plugin einfach in
das Verzeichnis $HELM_PLUGINS. Sie können Tarball-Plugins auch direkt von einer
URL installieren mit helm plugin install https://domain/path/to/plugin.tar.gz
Die Plugin-Dateistruktur
Ein Plugin ähnelt in vieler Hinsicht einem Chart. Jedes Plugin hat ein
übergeordnetes Verzeichnis mit einer plugin.yaml-Datei. Weitere Dateien können
vorhanden sein, aber nur die plugin.yaml-Datei ist erforderlich.
$HELM_PLUGINS/
|- last/
|- plugin.yaml
Die plugin.yaml-Datei
Die plugin.yaml-Datei ist für ein Plugin erforderlich. Sie enthält folgende Felder:
name: The name of the plugin (REQUIRED)
version: A SemVer 2 version (REQUIRED)
usage: Single line usage text shown in help
description: Long description shown in places like helm help
ignoreFlags: Ignore flags passed in from Helm
platformCommand: # Configure command to run based on the platform
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin command to execute
args: Plugin command arguments
command: (DEPRECATED) Plugin command, use platformCommand instead
platformHooks: # Configure plugin lifecycle hooks based on the platform
install: # Install lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin install command to execute
args: Plugin install command arguments
update: # Update lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin update command to execute
args: Plugin update command arguments
delete: # Delete lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin delete command to execute
args: Plugin delete command arguments
hooks: # (Deprecated) Plugin lifecycle hooks, use platformHooks instead
install: Command to install plugin
update: Command to update plugin
delete: Command to delete plugin
downloaders: # Configure downloaders capability
- command: Command to invoke
protocols:
- Protocol schema supported
Das Feld name
Das name ist der Name des Plugins. Wenn Helm dieses Plugin ausführt, verwendet
es diesen Namen (z. B. wird helm NAME dieses Plugin aufrufen).
name sollte mit dem Verzeichnisnamen übereinstimmen. In unserem Beispiel oben
bedeutet das, dass das Plugin mit name: last in einem Verzeichnis namens last
enthalten sein sollte.
Einschränkungen für name:
namedarf keinen der bestehendenhelmTop-Level-Befehle duplizieren.namemuss auf die ASCII-Zeichen a-z, A-Z, 0-9,_und-beschränkt sein.
Das Feld version
Das version ist die SemVer 2-Version des Plugins. usage und description
werden beide zur Generierung des Hilfetextes eines Befehls verwendet.
Das Feld ignoreFlags
Der Schalter ignoreFlags weist Helm an, keine Flags an das Plugin zu übergeben.
Wenn also ein Plugin mit helm myplugin --foo aufgerufen wird und ignoreFlags: true gesetzt ist, wird --foo stillschweigend verworfen.
Das Feld platformCommand
Das platformCommand konfiguriert den Befehl, den das Plugin bei Aufruf ausführt.
Sie können nicht sowohl platformCommand als auch command setzen, da dies zu
einem Fehler führt. Die folgenden Regeln gelten für die Auswahl des auszuführenden
Befehls:
- Wenn
platformCommandvorhanden ist, wird es verwendet.- Wenn sowohl
osals aucharchmit der aktuellen Plattform übereinstimmen, wird die Suche beendet und der Befehl verwendet. - Wenn
osübereinstimmt undarchleer ist, wird der Befehl verwendet. - Wenn sowohl
osals aucharchleer sind, wird der Befehl verwendet. - Wenn keine Übereinstimmung vorliegt, beendet sich Helm mit einem Fehler.
- Wenn sowohl
- Wenn
platformCommandnicht vorhanden ist und das veraltetecommandvorhanden ist, wird es verwendet.- Wenn der Befehl leer ist, beendet sich Helm mit einem Fehler.
Das Feld platformHooks
Das platformHooks konfiguriert die Befehle, die das Plugin für Lifecycle-Events
ausführt. Sie können nicht sowohl platformHooks als auch hooks setzen, da dies
zu einem Fehler führt. Die folgenden Regeln gelten für die Auswahl des Hook-Befehls:
- Wenn
platformHooksvorhanden ist, wird es verwendet und die Befehle für das Lifecycle-Event werden verarbeitet.- Wenn sowohl
osals aucharchmit der aktuellen Plattform übereinstimmen, wird die Suche beendet und der Befehl verwendet. - Wenn
osübereinstimmt undarchleer ist, wird der Befehl verwendet. - Wenn sowohl
osals aucharchleer sind, wird der Befehl verwendet. - Wenn keine Übereinstimmung vorliegt, überspringt Helm das Event.
- Wenn sowohl
- Wenn
platformHooksnicht vorhanden ist und das veraltetehooksvorhanden ist, wird der Befehl für das Lifecycle-Event verwendet.- Wenn der Befehl leer ist, überspringt Helm das Event.
Ein Plugin erstellen
Hier ist das Plugin-YAML für ein einfaches Plugin, das den letzten Release-Namen abruft:
name: last
version: 0.1.0
usage: get the last release name
description: get the last release name
ignoreFlags: false
platformCommand:
- command: ${HELM_BIN}
args:
- list
- --short
- --max=1
- --date
- -r
Plugins können zusätzliche Skripte und ausführbare Dateien benötigen. Skripte können im Plugin-Verzeichnis enthalten sein und ausführbare Dateien können über einen Hook heruntergeladen werden. Das folgende Beispiel zeigt ein Plugin:
$HELM_PLUGINS/
|- myplugin/
|- scripts/
|- install.ps1
|- install.sh
|- plugin.yaml
name: myplugin
version: 0.1.0
usage: example plugin
description: example plugin
ignoreFlags: false
platformCommand:
- command: ${HELM_PLUGIN_DIR}/bin/myplugin
- os: windows
command: ${HELM_PLUGIN_DIR}\bin\myplugin.exe
platformHooks:
install:
- command: ${HELM_PLUGIN_DIR}/scripts/install.sh
- os: windows
command: pwsh
args:
- -c
- ${HELM_PLUGIN_DIR}\scripts\install.ps1
update:
- command: ${HELM_PLUGIN_DIR}/scripts/install.sh
args:
- -u
- os: windows
command: pwsh
args:
- -c
- ${HELM_PLUGIN_DIR}\scripts\install.ps1
- -Update
Umgebungsvariablen werden interpoliert, bevor das Plugin ausgeführt wird. Das obige Muster zeigt die bevorzugte Methode, um anzugeben, wo sich das Plugin-Programm befindet.
Plugin-Befehle
Es gibt einige Strategien für die Arbeit mit Plugin-Befehlen:
- Wenn ein Plugin eine ausführbare Datei enthält, sollte die ausführbare Datei für
einen
platformCommand:im Plugin-Verzeichnis verpackt oder über einen Hook installiert werden. - Die Zeile
platformCommand:odercommand:wird vor der Ausführung alle Umgebungsvariablen expandieren.$HELM_PLUGIN_DIRzeigt auf das Plugin-Verzeichnis. - Der Befehl selbst wird nicht in einer Shell ausgeführt. Sie können also kein Shell-Skript in einer Zeile schreiben.
- Helm injiziert viele Konfigurationen in Umgebungsvariablen. Schauen Sie in die Umgebung, um zu sehen, welche Informationen verfügbar sind.
- Helm macht keine Annahmen über die Sprache des Plugins. Sie können es in der Sprache Ihrer Wahl schreiben.
- Befehle sind dafür verantwortlich, spezifische Hilfetexte für
-hund--helpzu implementieren. Helm verwendetusageunddescriptionfürhelm helpundhelm help myplugin, behandelt aber nichthelm myplugin --help.
Ein lokales Plugin testen
Zuerst müssen Sie Ihren HELM_PLUGINS-Pfad finden. Führen Sie dazu den folgenden
Befehl aus:
helm env
Wechseln Sie in das Verzeichnis, auf das HELM_PLUGINS gesetzt ist.
Jetzt können Sie einen symbolischen Link zu Ihrer Build-Ausgabe Ihres Plugins
hinzufügen – in diesem Beispiel haben wir es für mapkubeapis gemacht.
ln -s ~/GitHub/helm-mapkubeapis ./helm-mapkubeapis
Downloader Plugins
Standardmäßig kann Helm Charts über HTTP/S herunterladen. Seit Helm 2.4.0 können Plugins eine spezielle Fähigkeit haben, Charts aus beliebigen Quellen herunterzuladen.
Plugins deklarieren diese spezielle Fähigkeit in der plugin.yaml-Datei (auf
oberster Ebene):
downloaders:
- command: "bin/mydownloader"
protocols:
- "myprotocol"
- "myprotocols"
Wenn ein solches Plugin installiert ist, kann Helm mit dem Repository über das
angegebene Protokollschema interagieren, indem es den command aufruft. Das
spezielle Repository wird ähnlich wie reguläre Repositories hinzugefügt:
helm repo add favorite myprotocol://example.com/ Die Regeln für spezielle
Repositories sind die gleichen wie für reguläre: Helm muss in der Lage sein,
die index.yaml-Datei herunterzuladen, um die Liste der verfügbaren Charts zu
ermitteln und zwischenzuspeichern.
Der definierte Befehl wird mit folgendem Schema aufgerufen: command certFile keyFile caFile full-URL. Die SSL-Anmeldeinformationen stammen aus der
Repository-Definition, die in $HELM_REPOSITORY_CONFIG gespeichert ist
(d. h. $HELM_CONFIG_HOME/repositories.yaml). Ein Downloader-Plugin soll den
Rohinhalt auf stdout ausgeben und Fehler auf stderr melden.
Der Downloader-Befehl unterstützt auch Unterbefehle oder Argumente, sodass Sie
beispielsweise bin/mydownloader subcommand -d in der plugin.yaml angeben
können. Dies ist nützlich, wenn Sie dieselbe ausführbare Datei für den
Haupt-Plugin-Befehl und den Downloader-Befehl verwenden möchten, aber mit einem
unterschiedlichen Unterbefehl für jeden.
Umgebungsvariablen
Wenn Helm ein Plugin ausführt, übergibt es die äußere Umgebung an das Plugin und injiziert auch einige zusätzliche Umgebungsvariablen.
Variablen wie KUBECONFIG werden für das Plugin gesetzt, wenn sie in der
äußeren Umgebung gesetzt sind.
Die folgenden Variablen sind garantiert gesetzt:
HELM_PLUGINS: Der Pfad zum Plugins-Verzeichnis.HELM_PLUGIN_NAME: Der Name des Plugins, wie vonhelmaufgerufen. So hathelm myplugden Kurznamenmyplug.HELM_PLUGIN_DIR: Das Verzeichnis, das das Plugin enthält.HELM_BIN: Der Pfad zumhelm-Befehl (wie vom Benutzer ausgeführt).HELM_DEBUG: Zeigt an, ob das Debug-Flag von Helm gesetzt wurde.HELM_REGISTRY_CONFIG: Der Speicherort für die Registry-Konfiguration (falls verwendet). Beachten Sie, dass die Verwendung von Helm mit Registries eine experimentelle Funktion ist.HELM_REPOSITORY_CACHE: Der Pfad zu den Repository-Cache-Dateien.HELM_REPOSITORY_CONFIG: Der Pfad zur Repository-Konfigurationsdatei.HELM_NAMESPACE: Der Namespace, der demhelm-Befehl übergeben wurde (üblicherweise mit dem Flag-n).HELM_KUBECONTEXT: Der Name des Kubernetes-Konfigurationskontexts, der demhelm-Befehl übergeben wurde.
Zusätzlich wird, wenn eine Kubernetes-Konfigurationsdatei explizit angegeben wurde,
diese als Variable KUBECONFIG gesetzt.
Hinweis zur Flag-Verarbeitung
Bei der Ausführung eines Plugins analysiert Helm globale Flags für den eigenen Gebrauch. Keines dieser Flags wird an das Plugin weitergegeben.
--burst-limit: Dies wird zu$HELM_BURST_LIMITkonvertiert--debug: Wenn dies angegeben ist, wird$HELM_DEBUGauf1gesetzt--kube-apiserver: Dies wird zu$HELM_KUBEAPISERVERkonvertiert--kube-as-group: Diese werden zu$HELM_KUBEASGROUPSkonvertiert--kube-as-user: Dies wird zu$HELM_KUBEASUSERkonvertiert--kube-ca-file: Dies wird zu$HELM_KUBECAFILEkonvertiert--kube-context: Dies wird zu$HELM_KUBECONTEXTkonvertiert--kube-insecure-skip-tls-verify: Dies wird zu$HELM_KUBEINSECURE_SKIP_TLS_VERIFYkonvertiert--kube-tls-server-name: Dies wird zu$HELM_KUBETLS_SERVER_NAMEkonvertiert--kube-token: Dies wird zu$HELM_KUBETOKENkonvertiert--kubeconfig: Dies wird zu$KUBECONFIGkonvertiert--namespaceund-n: Dies wird zu$HELM_NAMESPACEkonvertiert--qps: Dies wird zu$HELM_QPSkonvertiert--registry-config: Dies wird zu$HELM_REGISTRY_CONFIGkonvertiert--repository-cache: Dies wird zu$HELM_REPOSITORY_CACHEkonvertiert--repository-config: Dies wird zu$HELM_REPOSITORY_CONFIGkonvertiert
Plugins sollten Hilfetext anzeigen und dann beenden für -h und --help. In
allen anderen Fällen können Plugins Flags nach Bedarf verwenden.
Shell-Autovervollständigung bereitstellen
Seit Helm 3.2 kann ein Plugin optional Unterstützung für die Shell-Autovervollständigung als Teil des bestehenden Autovervollständigungsmechanismus von Helm bereitstellen.
Statische Autovervollständigung
Wenn ein Plugin eigene Flags und/oder Unterbefehle bereitstellt, kann es Helm
darüber informieren, indem eine completion.yaml-Datei im Stammverzeichnis des
Plugins vorhanden ist. Die completion.yaml-Datei hat folgende Form:
name: <pluginName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
name: <commandName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
<and so on, recursively>
Hinweise:
- Alle Abschnitte sind optional, sollten aber angegeben werden, wenn zutreffend.
- Flags sollten nicht das Präfix
-oder--enthalten. - Sowohl kurze als auch lange Flags können und sollten angegeben werden. Ein kurzes Flag muss nicht mit seiner entsprechenden Langform verknüpft sein, aber beide Formen sollten aufgelistet werden.
- Flags müssen nicht in einer bestimmten Reihenfolge sein, müssen aber an der richtigen Stelle in der Unterbefehl-Hierarchie der Datei aufgelistet werden.
- Die bestehenden globalen Flags von Helm werden bereits vom Autovervollständigungsmechanismus
von Helm behandelt, daher müssen Plugins die folgenden Flags nicht angeben:
--debug,--namespaceoder-n,--kube-contextund--kubeconfig, oder andere globale Flags. - Die
validArgs-Liste bietet eine statische Liste möglicher Vervollständigungen für den ersten Parameter nach einem Unterbefehl. Es ist nicht immer möglich, eine solche Liste im Voraus bereitzustellen (siehe Abschnitt Dynamische Vervollständigung unten), in diesem Fall kann dervalidArgs-Abschnitt weggelassen werden.
Die completion.yaml-Datei ist vollständig optional. Wenn sie nicht bereitgestellt
wird, bietet Helm einfach keine Shell-Autovervollständigung für das Plugin (es sei
denn, das Plugin unterstützt Dynamische Vervollständigung).
Das Hinzufügen einer completion.yaml-Datei ist abwärtskompatibel und beeinflusst
das Verhalten des Plugins bei Verwendung älterer Helm-Versionen nicht.
Als Beispiel hat das fullstatus Plugin, das keine Unterbefehle
hat, aber dieselben Flags wie der Befehl helm status akzeptiert, folgende
completion.yaml-Datei:
name: fullstatus
flags:
- o
- output
- revision
Ein komplexeres Beispiel für das 2to3 Plugin hat folgende completion.yaml-Datei:
name: 2to3
commands:
- name: cleanup
flags:
- config-cleanup
- dry-run
- l
- label
- release-cleanup
- s
- release-storage
- tiller-cleanup
- t
- tiller-ns
- tiller-out-cluster
- name: convert
flags:
- delete-v2-releases
- dry-run
- l
- label
- s
- release-storage
- release-versions-max
- t
- tiller-ns
- tiller-out-cluster
- name: move
commands:
- name: config
flags:
- dry-run
Dynamische Vervollständigung
Ebenfalls seit Helm 3.2 können Plugins ihre eigene dynamische Shell-Autovervollständigung bereitstellen. Dynamische Shell-Autovervollständigung ist die Vervollständigung von Parameter- oder Flag-Werten, die nicht im Voraus definiert werden können. Zum Beispiel die Vervollständigung der Namen von Helm Releases, die derzeit im Cluster verfügbar sind.
Damit das Plugin dynamische Autovervollständigung unterstützt, muss es eine
ausführbare Datei namens plugin.complete in seinem Stammverzeichnis
bereitstellen. Wenn das Helm-Vervollständigungsskript dynamische Vervollständigungen
für das Plugin benötigt, führt es die Datei plugin.complete aus und übergibt ihr
die Befehlszeile, die vervollständigt werden muss. Die ausführbare Datei
plugin.complete muss die Logik enthalten, um zu bestimmen, welche die korrekten
Vervollständigungsoptionen sind, und diese auf die Standardausgabe ausgeben, damit
sie vom Helm-Vervollständigungsskript verwendet werden können.
Die Datei plugin.complete ist vollständig optional. Wenn sie nicht bereitgestellt
wird, bietet Helm einfach keine dynamische Autovervollständigung für das Plugin.
Das Hinzufügen einer plugin.complete-Datei ist abwärtskompatibel und beeinflusst
das Verhalten des Plugins bei Verwendung älterer Helm-Versionen nicht.
Die Ausgabe des plugin.complete-Skripts sollte eine durch Zeilenumbrüche getrennte
Liste sein, wie:
rel1
rel2
rel3
Wenn plugin.complete aufgerufen wird, wird die Plugin-Umgebung genauso gesetzt
wie beim Aufruf des Haupt-Skripts des Plugins. Daher sind die Variablen
$HELM_NAMESPACE, $HELM_KUBECONTEXT und alle anderen Plugin-Variablen bereits
gesetzt, und ihre entsprechenden globalen Flags wurden entfernt.
Die Datei plugin.complete kann in jeder ausführbaren Form vorliegen; es kann ein
Shell-Skript, ein Go-Programm oder jede andere Art von Programm sein, das Helm
ausführen kann. Die Datei plugin.complete muss ausführbare Berechtigungen
für den Benutzer haben. Die Datei plugin.complete muss mit einem Erfolgscode
(Wert 0) beenden.
In einigen Fällen erfordert die dynamische Vervollständigung das Abrufen von
Informationen aus dem Kubernetes-Cluster. Zum Beispiel erfordert das Plugin
helm fullstatus einen Release-Namen als Eingabe. Im fullstatus-Plugin kann
sein plugin.complete-Skript, um Vervollständigungen für aktuelle Release-Namen
bereitzustellen, einfach helm list -q ausführen und das Ergebnis ausgeben.
Wenn es gewünscht ist, dieselbe ausführbare Datei für die Plugin-Ausführung und
für die Plugin-Vervollständigung zu verwenden, kann das plugin.complete-Skript
so gestaltet werden, dass es die ausführbare Hauptdatei des Plugins mit einem
speziellen Parameter oder Flag aufruft. Wenn die ausführbare Hauptdatei des Plugins
den speziellen Parameter oder das Flag erkennt, weiß sie, dass sie die Vervollständigung
ausführen soll. In unserem Beispiel könnte plugin.complete wie folgt implementiert
werden:
#!/usr/bin/env sh
# "$@" is the entire command-line that requires completion.
# It is important to double-quote the "$@" variable to preserve a possibly empty last parameter.
$HELM_PLUGIN_DIR/status.sh --complete "$@"
Das eigentliche Skript des fullstatus-Plugins (status.sh) muss dann nach dem
Flag --complete suchen und, wenn gefunden, die entsprechenden Vervollständigungen
ausgeben.
Tipps und Tricks
- Die Shell filtert automatisch Vervollständigungsoptionen heraus, die nicht mit
der Benutzereingabe übereinstimmen. Ein Plugin kann daher alle relevanten
Vervollständigungen zurückgeben, ohne diejenigen zu entfernen, die nicht mit
der Benutzereingabe übereinstimmen. Wenn die Befehlszeile beispielsweise
helm fullstatus ngin<TAB>ist, kann dasplugin.complete-Skript alle Release-Namen (desdefault-Namespace) ausgeben, nicht nur die, die mitnginbeginnen; die Shell behält nur diejenigen, die mitnginbeginnen. - Um die Unterstützung für dynamische Vervollständigung zu vereinfachen,
insbesondere bei einem komplexen Plugin, können Sie Ihr
plugin.complete-Skript Ihr Haupt-Plugin-Skript aufrufen lassen und Vervollständigungsoptionen anfordern. Siehe den Abschnitt Dynamische Vervollständigung oben für ein Beispiel. - Um die dynamische Vervollständigung und die
plugin.complete-Datei zu debuggen, können Sie Folgendes ausführen, um die Vervollständigungsergebnisse zu sehen:helm __complete <pluginName> <arguments to complete>. Zum Beispiel:helm __complete fullstatus --output js<ENTER>,helm __complete fullstatus -o json ""<ENTER>