Autogenerering av hemligheter i Helm

Autogenerering av hemligheter i Helm

Team Kubernetes aaS från Mail.ru översatte en kort not om hur man automatiskt genererar Helm-hemligheter vid uppdatering. Följande är en text från artikelförfattaren - teknisk chef för Intoware, ett företag som utvecklar SaaS-lösningar.

Behållare är svala. Först var jag anti-container (jag skäms över att erkänna det), men nu stöder jag fullt ut användningen av denna teknik. Om du läser det här har du förhoppningsvis framgångsrikt navigerat i Dockers hav, insett fördelarna med Kubernetes och gjort ditt liv mycket enklare med Helm.

Vissa saker är dock klart svårare än de behöver vara.

Hur genererar man automatiskt hemligheter vid uppdatering?

En Kubernetes-hemlighet är en resurs som innehåller nyckel/värdepar som du vill använda i din kod. Dessa kan vara databasanslutningssträngar, e-postlösenord och så vidare. Genom att använda hemligheter skapar du en tydlig separation mellan kod och inställningar, vilket gör att du enkelt kan anpassa olika distributioner utan att ändra kodbasen.

En vanlig situation är när två moduler måste kommunicera med en gemensam nyckel. Ingen utanför klustret bör känna till denna nyckel, eftersom den är avsedd för en-till-en-kommunikation inom klustret.

Att göra hemligheter

Vanligtvis behöver du för att skapa en hemlighet i Helm:

  • beskriv hemligheten i värdefilen;
  • omdefiniera det under driftsättning;
  • hänvisa till det inuti distributionen/podden;
  • ... vinst!

Det brukar se ut ungefär så här:

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

En enkel Kubernetes-hemlighet med värden från values.yml

Men låt oss säga att du inte vill ange din hemlighet i värdefilen.

Det finns många alternativ när distributionen kräver en delad nyckel, som måste genereras under installationen.

I exemplet modul-till-modul kommunikation ovan är det inte önskvärt att dela hemligheten utanför distributionen. Därför är det mycket önskvärt att Helm har mekanismer för att automatiskt generera en hemlighet utan att behöva specificera den direkt.

Krokar

Hooks låter dig köra kod på specifika platser under installationsprocessen. Det kan finnas ett konfigurationsjobb som måste köras efter den första installationen, eller så måste en rensning göras innan någon uppdatering utförs.

För att lösa vårt problem med att lägga till en nyckel som genereras under installationen är förinstallationskrokar idealiska. Men det finns en hake: du kan inte automatiskt generera hemligheten en gång vid en uppdatering. Hooks kommer att fungera på varje uppdatering.

Om du har skapat din hemlighet och din första installation inte har hänt än, sluta läsa, förinstallationskroken kommer att fungera utmärkt för dig.

Men om hemligheten är en del av en uppdatering (kanske en ny funktion som inte fanns där under installationen), så är det synd att du inte kan skapa en förinstallationskrok som bara fungerar en gång.

funktioner

Med roderfunktioner kan du lägga till olika skriptelement till dina distributionsskript.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

Det här exemplet visar att värdet på apiKey-hemligheten kommer att vara det nya UUID som genereras under installationen.

Helm inkluderar ett verkligt omfattande funktionsbibliotek som utnyttjar de fantastiska GO-mallfunktionerna och Sprigs funktionsbibliotek för att skapa anpassade distributioner.

Uppslagsfunktion

Tillagd i Helm 3.1 Uppslagsfunktion, som låter dig begära en befintlig distribution och:

  • kontrollera förekomsten av resurser;
  • returnera värdet av en befintlig resurs för senare användning.

Genom att använda båda dessa funktioner kan vi skapa en engångs, dynamiskt genererad hemlighet!

# 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 }}

Närhelst en ny uppdatering appliceras på servern kommer Helm antingen att generera ett nytt hemligt värde (om det inte finns någon hemlighet ännu) eller återanvända det befintliga värdet.

Lycka!

Vad mer att läsa om ämnet:

  1. Tre nivåer av autoskalning i Kubernetes och hur man använder dem effektivt.
  2. Kubernetes i piratkopieringens anda med en mall för implementering.
  3. Vår kanal Around Kubernetes i Telegram.

Källa: will.com

Lägg en kommentar