Autogenerácia tajomstiev v Helme

Autogenerácia tajomstiev v Helme

Tím Kubernetes aaS od Mail.ru preložila krátku poznámku o tom, ako automaticky generovať tajomstvá Helm pri aktualizácii. Ďalej text od autora článku – technického riaditeľa spoločnosti Intoware, poskytovateľa SaaS riešení.

Kontajnery sú skvelé. Na začiatku som bol odporcom kontajnerov (je mi to trápne priznať), ale teraz plne podporujem používanie tejto technológie. Ak toto čítate, dúfam, že ste úspešne plávali po moriach Docker, uvedomili si výhody Kubernetes a urobili svoj život omnoho jednoduchším s Helm.

Napriek tomu sú niektoré veci zjavne zložitejšie, než by mali byť.

Ako automaticky generovať tajomstvá pri aktualizácii?

Tajomstvo Kubernetes je zdroj, ktorý obsahuje páry kľúč/hodnota, ktoré chcete použiť vo svojom kóde. Môžu to byť pripojenia k databáze, heslá k e-mailu a tak ďalej. Používaním tajomstiev vytvárate jasné rozdelenie medzi kódom a nastaveniami, čo umožňuje ľahko prispôsobovať rôzne nasadenia bez zmeny kódovej základne.

Často sa vyskytuje situácia, keď musí dva moduly komunikovať pomocou spoločného kľúča. Nikto mimo klastrov by nemal poznať tento kľúč, pretože je určený na komunikáciu "od jedného k druhému" vnútri klastrovia.

Vytváranie tajomstiev

Obvykle, aby ste vytvorili tajomstvo v Helme, potrebujete:

  • opísať tajomstvo v súbore hodnôt;
  • predefinovať ho počas nasadenia;
  • odkázat naň v rámci nasadenia/podľa;
  • … profit !

Obvykle to vyzerá asi takto:

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

Jednoduché tajomstvo Kubernetes, využívajúce hodnoty z values.yml

Ale povedzme, že nechcete uvádzať svoje tajomstvo v súbore hodnôt.

Existuje veľa scenárov, keď sa na nasadenie vyžaduje spoločný kľúč, ktorý musí byť generovaný počas inštalácie.

V uvedenom príklade o komunikácii medzi modulmi je nežiadúce zdieľať tajomstvo mimo nasadenia. Preto je veľmi žiaduce, aby Helm mal mechanizmy na automatické vytváranie tajomstva bez nutnosti jeho priameho uvedenia.

Hooky

Huky umožňujú spúšťať kód na určitých miestach počas inštalácie. Môže existovať úloha konfigurácie, ktorú je potrebné vykonať po prvotnej inštalácii, alebo možno bude potrebné vykonať čistenie pred vykonaním akéhokoľvek aktualizácie.

Na vyriešenie nášho problému s pridaním kľúča, ktorý je generovaný pri inštalácii, sa predinštalačné huky hodia perfektne. Ale je tu jedna nevýhoda: nemôžete automaticky vygenerovať tajný kľúč raz pri aktualizácii. Huky budú fungovať pri každej aktualizácii.

Ak ste vygenerovali svoj tajný kľúč a vaša prvotná inštalácia sa ešte neuskutočnila, potom prestante čítať, predinštalačný húk je pre vás ideálny.

Ale ak je tajný kľúč súčasťou aktualizácie (možno novej funkcie, ktorá neexistovala počas inštalácie), je frustrujúce, že nie je možné vytvoriť predinštalačný húk, ktorý by fungoval len raz.

Funkcie

Funkcie Helm umožňujú pridávať rôzne prvky skriptov do nasadzovacích skriptov.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generovať nový UUID a uviesť ho v úvodzovkách

V tomto príklade je hodnota tajného kľúča apiKey nový UUID, vygenerovaný počas inštalácie.

Helm obsahuje skutočne rozsiahlu knižnicu funkcií, ktorá využíva úžasné funkcie šablón GO a knižnicu funkcií Sprig na vytváranie prispôsobených nasadení.

Funkcia Lookup

V Helm 3.1 bola pridaná funkcia Lookup, ktorá umožňuje dotazovať sa na existujúce nasadenie a:

  • overiť existenciu zdrojov;
  • vrátiť hodnotu existujúceho zdroja na ďalšie použitie.

Pomocou týchto dvoch možností môžeme vytvoriť jednorazový dynamicky generovaný tajný kľúč!

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

Kedykoľvek sa na server aplikuje nové aktualizovanie, Helm buď vygeneruje novú hodnotu tajného kľúča (ak tajný kľúč ešte neexistuje), alebo znovu použije existujúcu hodnotu.

Veľa šťastia!

Čo ďalšie si prečítať na túto tému:

  1. Tri úrovne automatického škálovania v Kubernetes a ako ich efektívne využiť.
  2. Kubernetes v duchu pirátstva s šablónou na zavedenie.
  3. Náš kanál Okolo Kubernetes na Telegrame.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster