Autogenerering af hemmeligheder i Helm

Autogenerering af hemmeligheder i Helm

Team Kubernetes aaS fra Mail.ru oversat en kort note om, hvordan man automatisk genererer Helm-hemmeligheder ved opdatering. Det følgende er en tekst fra artiklens forfatter - teknisk direktør for Intoware, en virksomhed, der udvikler SaaS-løsninger.

Beholdere er kølige. Først var jeg anti-container (jeg er flov over at indrømme det), men nu støtter jeg fuldt ud brugen af ​​denne teknologi. Hvis du læser dette, har du forhåbentlig med succes navigeret i Dockers hav, indset fordelene ved Kubernetes og gjort dit liv meget lettere med Helm.

Nogle ting er dog klart sværere, end de behøver at være.

Hvordan genererer man automatisk hemmeligheder, når man opdaterer?

En Kubernetes-hemmelighed er en ressource, der indeholder nøgle/værdi-par, som du vil bruge i din kode. Disse kunne være databaseforbindelsesstrenge, e-mail-adgangskoder og så videre. Ved at bruge hemmeligheder skaber du en klar adskillelse mellem kode og indstillinger, hvilket gør det nemt at tilpasse forskellige implementeringer uden at ændre kodebasen.

En almindelig situation er, når to moduler skal kommunikere ved hjælp af en fælles nøgle. Ingen uden for klyngen bør kende denne nøgle, da den er beregnet til en-til-en kommunikation inden for klyngen.

At lave hemmeligheder

For at skabe en hemmelighed i Helm skal du typisk:

  • beskriv hemmeligheden i værdifilen;
  • omdefiner det under udrulning;
  • henvise til det inde i implementeringen/poden;
  • ... overskud!

Det ser normalt sådan ud:

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

En simpel Kubernetes-hemmelighed ved hjælp af værdier fra values.yml

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

Der er mange muligheder, når implementeringen kræver en delt nøgle, som skal genereres under installationen.

I modul-til-modul kommunikationseksemplet ovenfor er det ikke ønskeligt at dele hemmeligheden uden for implementeringen. Derfor er det yderst ønskeligt, at Helm har mekanismer til automatisk at generere en hemmelighed uden at skulle angive den direkte.

Kroge

Hooks giver dig mulighed for at køre kode på bestemte steder under installationsprocessen. Der kan være et konfigurationsjob, der skal køres efter den første installation, eller måske skal der udføres en oprydning, før der udføres en opdatering.

For at løse vores problem med at tilføje en nøgle, der genereres under installationen, er pre-installation kroge ideelle. Men der er en hage: du kan ikke automatisk generere hemmeligheden én gang på en opdatering. Hooks fungerer på hver opdatering.

Hvis du har genereret din hemmelighed, og din første installation ikke er sket endnu, så stop med at læse, pre-install hook vil fungere godt for dig.

Men hvis hemmeligheden er en del af en opdatering (måske en ny funktion, der ikke var der under installationen), så er det en skam, at du ikke kan lave en pre-installation hook, der kun virker én gang.

Funktioner

Helm-funktioner giver dig mulighed for at tilføje forskellige script-elementer til dine implementeringsscripts.

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

Dette eksempel viser, at værdien af ​​apiKey-hemmeligheden vil være den nye UUID, der genereres under installationen.

Helm inkluderer et virkelig omfattende funktionsbibliotek, der udnytter de fantastiske GO-skabelonfunktioner og Sprigs funktionsbibliotek til at skabe brugerdefinerede implementeringer.

Opslagsfunktion

Tilføjet i Helm 3.1 Opslagsfunktion, som giver dig mulighed for at anmode om en eksisterende implementering og:

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

Ved at bruge begge disse muligheder kan vi skabe 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 }}

Når en ny opdatering anvendes på serveren, vil Helm enten generere en ny hemmelig værdi (hvis der ikke er nogen hemmelighed endnu) eller genbruge den eksisterende værdi.

Held og lykke!

Hvad skal man ellers læse om emnet:

  1. Tre niveauer af autoskalering i Kubernetes og hvordan man bruger dem effektivt.
  2. Kubernetes i pirateriets ånd med en skabelon til implementering.
  3. Vores kanal Around Kubernetes i Telegram.

Kilde: www.habr.com

Tilføj en kommentar