Automatická generace tajemství v Helmu

Automatická generace tajemství v Helmu

Tým Kubernetes aaS od Mail.ru přeložila krátkou poznámku o tom, jak automaticky generovat tajné klíče Helm při aktualizaci. Níže je text od autora článku — technického ředitele Intoware, společnosti vyvíjející SaaS řešení.

Kontejnery jsou skvělé. Zpočátku jsem byl proti nim (hanba přiznat), ale teď plně podporuji používání této technologie. Pokud to čtete, doufám, že jste úspěšně pluli po mořích Docker, uvědomili si výhody Kubernetes a výrazně si usnadnili život s Helm.

Nicméně některé věci jsou jasně složitější, než by měly být.

Jak automaticky generovat tajné klíče při aktualizaci?

Tajný klíč Kubernetes je zdroj, který obsahuje páry klíč/hodnota, které chcete použít ve svém kódu. Může to být připojení k databázi, e-mailové hesla atd. Použitím tajných klíčů vytváříte jasné oddělení mezi kódem a nastaveními, což umožňuje snadno konfigurovat různá nasazení bez změny kódové základny.

Často se setkáváme se situací, kdy dva moduly musí komunikovat pomocí společného klíče. Nikdo mimo cluster by neměl tento klíč znát, protože je určen pro spojení "z jednoho na druhý" uvnitř clustera.

Vytváření tajných klíčů

Obvykle, abyste vytvořili tajný klíč v Helmu, musíte:

  • popisovat tajný klíč v souboru hodnot;
  • přepsat ho během procesu nasazení;
  • odkazovat na něj uvnitř nasazení/podu;
  • … profit!

Obvykle to vypadá přibližně takto:

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

Jednoduchý tajný klíč Kubernetes, který používá hodnoty z values.yml

Ale řekněme, že nechcete zadávat svůj tajný klíč v souboru hodnot.

Existuje mnoho variant, kdy pro nasazení potřebujete společný klíč, který by měl být vygenerován během instalace.

V uvedeném výše příkladu se sdílením mezi moduly není žádoucí sdílet tajný klíč mimo nasazení. Proto je velmi žádoucí, aby Helm měl mechanismy pro automatické vytvoření tajného klíče bez nutnosti jej přímo zadávat.

Huky

Hooky umožňují spouštět kód na určitých místech během procesu instalace. Může být úkol pro nastavení, který je třeba spustit po prvním instalaci, nebo může být potřeba provést čištění před jakoukoliv aktualizací.

Pro naši potřebu přidání klíče, který je generován během instalace, jsou předinstalační hooky ideální. Ale je tu jeden háček: nemůžete automaticky vygenerovat tajemství jednou při aktualizaci. Hooky budou fungovat při každé aktualizaci.

Pokud jste vygenerovali své tajemství a vaše první instalace ještě neproběhla, přestaňte číst, předinstalační hook je pro vás ideální.

Ale pokud je tajemství součástí aktualizace (možná nové funkce, která nebyla k dispozici během instalace), je nepříjemné, že není možné vytvořit předinstalační hook, který by se spustil pouze jednou.

Funkce

Funkce Helm umožňuje přidávat různé prvky skriptů do nasazovacích scénářů.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Vygenerujte nový UUID a citujte jej

V tomto příkladu je hodnotou tajemství apiKey nový UUID generovaný během instalace.

Helm obsahuje opravdu rozsáhlou knihovnu funkcí, která využívá úžasné šablonovací funkce GO a knihovnu funkcí Sprig pro vytváření přizpůsobitelných nasazení.

Funkce Lookup

Ve verzi Helm 3.1 byla přidána funkce Lookup, která umožňuje dotázat se na existující nasazení a:

  • ověřit existenci zdrojů;
  • vrátit hodnotu existujícího zdroje pro další použití.

Použitím obou těchto možností můžeme vytvořit jednorázové dynamicky generované tajemství!

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

Kdykoliv se na serveru použije nová aktualizace, Helm buď vygeneruje novou hodnotu tajemství (pokud tajemství ještě neexistuje), nebo znovu použije existující hodnotu.

Hodně štěstí!

Co dalšího si přečíst na toto téma:

  1. Tři úrovně automatického škálování v Kubernetes a jak je efektivně využívat.
  2. Kubernetes v pirátském duchu s šablonou pro nasazení.
  3. Náš kanál Kolem Kubernetes na Telegramu.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster