
Der Befehl darüber, wie man Helm-Secrets automatisch bei Updates generiert. Im Folgenden der Text des Autors – des technischen Direktors von Intoware, einem SaaS-Lösungsanbieter.
Container sind großartig. Zunächst war ich ein Gegner von Containern (es schmerzt, das zuzugeben), aber jetzt unterstütze ich die Verwendung dieser Technologie voll und ganz. Wenn Sie dies lesen, hoffe ich, dass Sie erfolgreich durch die Docker-Meere gefahren sind, die Vorteile von Kubernetes erkannt und Ihr Leben mit Helm deutlich einfacher gemacht haben.
Dennoch sind einige Dinge offensichtlich komplizierter, als sie sein sollten.
Wie generiert man automatisch Secrets bei einem Update?
Ein Kubernetes-Secret ist eine Ressource, die Schlüssel-Wert-Paare enthält, die Sie in Ihrem Code verwenden möchten. Das können Datenbankverbindungszeichenfolgen, E-Mail-Passwörter und so weiter sein. Durch die Verwendung von Secrets schaffen Sie eine klare Trennung zwischen Code und Konfigurationen, was es einfach macht, verschiedene Deployments ohne Änderung des Codes anzupassen.
Eine häufige Situation, in der zwei Module über einen gemeinsamen Schlüssel kommunizieren müssen. Niemand außerhalb des Clusters sollte diesen Schlüssel kennen, da er für die Verbindung "von einem zum anderen" innerhalb des Clusters gedacht ist.
Erstellung von Geheimnissen
Um ein Geheimnis in Helm zu erstellen, müssen Sie normalerweise:
- das Geheimnis in der Werte-Datei beschreiben;
- es im Deploy-Prozess überschreiben;
- darauf innerhalb des Deployments/Pods verweisen;
- … Profit!
Normalerweise sieht das ungefähr so aus:
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ .Values.MyApiKeySecret | quote }}
Ein einfaches Kubernetes-Geheimnis, das Werte aus values.yml verwendet.
Angenommen, Sie möchten Ihr Geheimnis nicht in der Werte-Datei angeben.
Es gibt viele Szenarien, in denen ein gemeinsamer Schlüssel für das Deployment benötigt wird, der während der Installation generiert werden muss.
Im oben angeführten Beispiel der Kommunikation zwischen Modulen ist es unerwünscht, das Geheimnis außerhalb des Deployments zu teilen. Daher ist es sehr wünschenswert, dass Helm Mechanismen zur automatischen Erstellung des Geheimnisses hat, ohne dass es direkt angegeben werden muss.
Hooks
Hooks ermöglichen es, Code an bestimmten Stellen im Installationsprozess auszuführen. Möglicherweise gibt es eine Konfiguration, die nach der Erstinstallation ausgeführt werden muss, oder es ist erforderlich, vor einem Update eine Bereinigung vorzunehmen.
Um unser Problem mit dem Hinzufügen des bei der Installation generierten Schlüssels zu lösen, sind Pre-Install-Hooks ideal. Es gibt jedoch einen Haken: Sie können den geheimen Schlüssel nicht automatisch einmal bei einem Update generieren. Hooks werden bei jedem Update funktionieren.
Wenn Sie Ihren geheimen Schlüssel generiert haben und die erste Installation noch nicht erfolgt ist, hören Sie hier auf zu lesen; der Pre-Install-Hook ist ideal für Sie.
Aber wenn der Schlüssel Teil des Updates ist (möglicherweise eine neue Funktion, die während der Installation nicht vorhanden war), ist es bedauerlich, dass es nicht möglich ist, einen Pre-Install-Hook zu erstellen, der nur einmal funktioniert.
Funktionen
Die Helm-Funktionen ermöglichen das Hinzufügen verschiedener Script-Elemente in die Bereitstellungsskripte.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Generiert eine neue UUID und gibt sie aus
In diesem Beispiel zeigt der Wert des Secrets apiKey eine neue UUID, die während der Installation generiert wurde.
Helm enthält eine wirklich umfangreiche Bibliothek von Funktionen, die erstaunliche GO-Template-Funktionen und die Sprig-Bibliothek nutzen, um anpassbare Deployments zu erstellen.
Lookup-Funktion
In Helm 3.1 wurde die hinzugefügt, die es ermöglicht, ein vorhandenes Deployment abzufragen und:
- die Existenz von Ressourcen zu überprüfen;
- den Wert einer vorhandenen Ressource zur weiteren Verwendung zurückzugeben.
Mit diesen beiden Möglichkeiten können wir ein einmalig dynamisch generiertes Secret erstellen!
# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
name: some-awesome-secret
type: Opaque
# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
apiKey: {{ $secret.data.apiKey }}
# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
apiKey: {{ uuidv4 | quote }}
{{ end }}
Immer wenn ein neues Update auf den Server angewendet wird, generiert Helm entweder einen neuen Wert für das Secret (wenn das Secret noch nicht vorhanden ist) oder verwendet den vorhandenen Wert erneut.
Viel Erfolg!
Weitere Lesetipps zu diesem Thema:
- .
- .
- .
Quelle: habr.com
