Automatisk generering af hemmeligheder i Helm

Automatisk generering af hemmeligheder i Helm

Kommandoen Kubernetes aaS fra Mail.ru oversatte en kort bemærkning om hvordan man automatisk genererer Helm-hemmeligheder ved opdatering. Her er teksten fra forfatteren af artiklen — teknisk direktør hos Intoware, en virksomhed, der udvikler SaaS-løsninger.

Containere er fantastiske. I starten var jeg modstander af containere (det er pinligt at indrømme), men nu støtter jeg fuldt ud brugen af denne teknologi. Hvis du læser dette, så håber jeg, du har sejlet sikkert gennem Docker-havene, indset fordelene ved Kubernetes og gjort dit liv meget lettere med Helm.

Men nogle ting er tydeligvis sværere, end de bør være.

Hvordan automatisk generere hemmeligheder ved opdatering?

En Kubernetes-hemmelighed er en ressource, der indeholder nøgle/værdi-par, som du ønsker at bruge i din kode. Det kan være forbindelsesstrenge til databaser, e-mailadgangskoder og så videre. Ved at bruge hemmeligheder skaber du en klar adskillelse mellem kode og konfiguration, hvilket gør det nemt at konfigurere forskellige implementeringer uden at ændre kodebasen.

En almindelig situation, når to moduler skal interagere ved hjælp af en fælles nøgle. Ingen uden for klusteret skal kende denne nøgle, da den er beregnet til kommunikation "fra den ene til den anden" inden for klusteret.

Oprettelse af hemmeligheder

Normalt, for at oprette en hemmelighed i Helm, skal du:

  • beskrive hemmeligheden i en værdifil;
  • override den under implementeringen;
  • henvise til den inden for implementeringen/poden;
  • … profit!

Normalt ser det cirka således ud:

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

En enkel Kubernetes-hemmelighed, der bruger værdier fra values.yml

Men lad os sige, at du ikke ønsker at angive din hemmelighed i værdifilen.

Der er mange scenarier, hvor en fælles nøgle, der skal genereres under installationen, er nødvendig for implementeringen.

I det tidligere eksempel med interaktionen mellem modulerne er det uønsket at dele hemmeligheden uden for implementeringen. Derfor er det meget ønskeligt, at Helm har mekanismer til automatisk at oprette hemmeligheden uden at skulle angive den direkte.

Hooks

Hooks giver mulighed for at køre kode på bestemte tidspunkter under installationsprocessen. Måske er der en konfigurationsopgave, der skal køres efter den første installation, eller måske er det nødvendigt at udføre en oprydning før enhver opdatering.

For at løse vores problem med at tilføje en nøgle, der genereres ved installation, er pre-install hooks ideelle. Men der er et problem: Du kan ikke automatisk generere en hemmelighed én gang ved opdatering. Hooks vil fungere ved hver opdatering.

Men hvis du har genereret din hemmelighed, og din første installation endnu ikke har fundet sted, så stop med at læse, for en pre-install hook vil være perfekt for dig.

Men hvis hemmeligheden er en del af opdateringen (måske en ny funktion, der ikke fandtes under installationen), er det ærgerligt, at du ikke kan oprette en pre-install hook, der kun fungerer én gang.

Functions

Helm-funktioner giver mulighed for at tilføje forskellige script-elementer til deployments scripts.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generer et nyt UUID og sæt det i citationstegn

I dette eksempel vises det, at værdien af hemmeligheden apiKey vil være et nyt UUID, genereret under installationen.

Helm inkluderer et virkelig omfattende bibliotek af funktioner, der bruger de fantastiske GO-skabelonfunktioner og Sprig-funktionsbiblioteket til at skabe tilpassede deployment.

Lookup-funktion

Lookup-funktionen blev tilføjet i Helm 3.1 lookup-funktion, der giver mulighed for at forespørge eksisterende deploys og:

  • tjekke eksistensen af ressourcer;
  • returnere værdien af en eksisterende ressource til senere brug.

Ved at bruge begge disse funktioner kan vi oprette en engangs dynamisk genereret hemmelighed!

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

Hver gang en ny opdatering anvendes på serveren, vil Helm enten generere en ny værdi for hemmeligheden (hvis hemmeligheden endnu ikke eksisterer) eller genbruge den eksisterende værdi.

Held og lykke!

Andre artikler om emnet:

  1. Tre niveauer af automatisk skalering i Kubernetes, og hvordan man bruger dem effektivt.
  2. Kubernetes i piratånd med en implementeringsskabelon.
  3. Vores kanal Omkring Kubernetes på Telegram.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster