Automatische Generierung von Geheimnissen in Helm

Automatische Generierung von Geheimnissen in Helm

Team Kubernetes aaS von Mail.ru Eine kurze Notiz, wie man automatisch Helm-Secrets bei einem Update generiert. Im Folgenden der Text des Autors des Artikels — CTO von Intoware, einem Unternehmen für SaaS-Lösungen.

Container sind großartig. Zunächst war ich ein Gegner von Containern (es ist peinlich, das zuzugeben), aber jetzt unterstütze ich die Verwendung dieser Technologie vollkommen. Wenn Sie dies lesen, hoffe ich, dass Sie erfolgreich durch die Docker-Meere gesegelt sind, die Vorteile von Kubernetes erkannt haben und Ihr Leben mit Helm wesentlich einfacher gemacht haben.

Dennoch sind einige Dinge offensichtlich komplizierter, als sie sein sollten.

Wie generiert man Secrets automatisch bei einem Update?

Ein Kubernetes-Secret ist eine Ressource, die Schlüssel-Wert-Paare enthält, die Sie in Ihrem Code verwenden möchten. Dies können Verbindungszeichenfolgen zur Datenbank, E-Mail-Passwörter usw. sein. Durch die Verwendung von Secrets schaffen Sie eine klare Trennung zwischen Code und Konfigurationen, die es ermöglicht, unterschiedliche Deployments leicht anzupassen, ohne die Codebasis zu ändern.

Eine häufige Situation ist, dass 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 bestimmt ist.

Secrets erstellen

Normalerweise müssen Sie, um ein Secret in Helm zu erstellen:

  • das Secret in der Werte-Datei beschreiben;
  • es im Deploy-Prozess überschreiben;
  • darauf innerhalb des Deployments/Pods verweisen;
  • … Profit!

Normalerweise sieht das etwa so aus:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

Ein einfaches Kubernetes-Secret, das Werte aus values.yml verwendet.

Aber nehmen wir an, Sie möchten Ihr Secret nicht in der Werte-Datei angeben.

Es gibt viele Szenarien, in denen ein gemeinsamer Schlüssel, der zur Installationszeit generiert werden muss, für das Deployment erforderlich ist.

Im obigen Beispiel mit der Kommunikation zwischen Modulen ist es unerwünscht, das Secret außerhalb des Deployments zu teilen. Daher ist es sehr wünschenswert, dass Helm Mechanismen zur automatischen Erstellung des Secrets hat, ohne dass es direkt angegeben werden muss.

Hooks

Hooks ermöglichen das Ausführen von Code an bestimmten Stellen während des Installationsprozesses. Möglicherweise gibt es eine Einrichtung, die nach der ersten Installation ausgeführt werden muss, oder vielleicht muss eine Bereinigung vor der Durchführung eines Updates erfolgen.

Um unser Problem mit dem Hinzufügen des beim Setup generierten Schlüssels zu lösen, sind vorinstallierte Hooks ideal. Aber es gibt einen Haken: Sie können ein Geheimnis nicht automatisch einmal bei einem Update generieren. Hooks funktionieren bei jedem Update.

Wenn Sie Ihr Geheimnis generiert haben und Ihre erste Installation noch nicht stattgefunden hat, dann lesen Sie nicht weiter, vorinstallierte Hooks sind perfekt für Sie.

Aber wenn das Geheimnis Teil des Updates ist (vielleicht einer neuen Funktion, die während der Installation noch nicht vorhanden war), ist es ärgerlich, dass man keinen vorinstallierten Hook erstellen kann, der nur einmal aktiviert wird.

Funktionen

Die Helm-Funktionen ermöglichen das Hinzufügen verschiedener Skripte in die Bereitstellungsszenarien.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Erzeugen Sie eine neue UUID und setzen Sie sie in Anführungszeichen

In diesem Beispiel zeigt sich, dass der Wert des Secrets apiKey eine neue UUID ist, die während der Installation generiert wird.

Helm enthält eine wirklich umfangreiche Funktionsbibliothek, die erstaunliche Funktionen der GO-Templates und die Sprig-Funktionsbibliothek nutzt, um anpassbare Bereitstellungen zu erstellen.

Lookup-Funktion

In Helm 3.1 hinzugefügt Lookup-Funktion, die es ermöglicht, eine vorhandene Bereitstellung anzufordern und:

  • die Existenz von Ressourcen zu überprüfen;
  • den Wert einer bestehenden Ressource zur späteren Verwendung zurückzugeben.

Mit diesen beiden Möglichkeiten können wir ein einmaliges dynamisch generiertes Geheimnis 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 }}

Jedes Mal, wenn ein neues Update auf den Server angewendet wird, wird Helm entweder einen neuen Wert für das Geheimnis generieren (wenn das Geheimnis noch nicht existiert) oder den bestehenden Wert wiederverwenden.

Viel Erfolg!

Was gibt es noch zu lesen:

  1. Drei Ebenen der automatischen Skalierung in Kubernetes und wie man sie effektiv nutzt.
  2. Kubernetes im Piratenstil mit einer Implementierungsvorlage.
  3. Unser Kanal Rund um Kubernetes auf Telegram.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster