Automatické generovanie tajomstiev v Helme

Automatické generovanie tajomstiev v Helme

Tím Kubernetes aaS z Mail.ru preložil krátku poznámku o tom, ako automaticky generovať tajomstvá Helm pri aktualizácii. Nasleduje text od autora článku – technického riaditeľa spoločnosti Intoware, ktorá vyvíja SaaS riešenia.

Kontajnery sú v pohode. Najprv som bol antikontajner (hanbím sa to priznať), ale teraz plne podporujem používanie tejto technológie. Ak toto čítate, dúfajme, že ste úspešne preplávali moriami Dockeru, uvedomili ste si výhody Kubernetes a výrazne ste si uľahčili život s Helmom.

Niektoré veci sú však zjavne zložitejšie, ako 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ť reťazce pripojenia k databáze, e-mailové heslá atď. Použitím tajomstiev vytvoríte jasné oddelenie medzi kódom a nastaveniami, čo vám umožní jednoducho prispôsobiť rôzne nasadenia bez zmeny kódovej základne.

Bežná situácia je, keď dva moduly musia komunikovať pomocou spoločného kľúča. Nikto mimo klastra by tento kľúč nemal poznať, pretože je určený na individuálnu komunikáciu v rámci klastra.

Robiť tajomstvá

Na vytvorenie tajomstva v Helme zvyčajne potrebujete:

  • opíšte tajomstvo v súbore hodnôt;
  • predefinovať ho počas nasadenia;
  • pozrite si ho vo vnútri rozmiestnenia/podu;
  • ... zisk!

Zvyčajne to vyzerá nejako takto:

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

Jednoduché tajomstvo Kubernetes pomocou hodnôt z values.yml

Ale povedzme, že nechcete špecifikovať svoje tajomstvo v súbore hodnôt.

Existuje veľa možností, keď nasadenie vyžaduje zdieľaný kľúč, ktorý sa musí vygenerovať počas inštalácie.

Vo vyššie uvedenom príklade komunikácie medzi modulmi nie je žiaduce zdieľať tajomstvo mimo nasadenia. Preto je veľmi žiaduce, aby Helm mal mechanizmy na automatické generovanie tajomstva bez toho, aby ho musel priamo špecifikovať.

Háčiky

Háčiky vám umožňujú spustiť kód na konkrétnych miestach počas procesu inštalácie. Po prvej inštalácii môže byť potrebné spustiť konfiguračnú úlohu, alebo možno pred vykonaním akejkoľvek aktualizácie vykonať vyčistenie.

Na vyriešenie nášho problému s pridaním kľúča vygenerovaného počas inštalácie sú ideálne predinštalačné háčiky. Má to však háčik: tajomstvo nemôžete automaticky vygenerovať raz pri aktualizácii. Háčiky budú fungovať pri každej aktualizácii.

Ak ste vygenerovali svoje tajomstvo a vaša prvá inštalácia ešte neprebehla, potom prestaňte čítať, predinštalačný hák vám bude fungovať skvele.

Ale ak je tajomstvo súčasťou aktualizácie (možno novej funkcie, ktorá tam nebola počas inštalácie), potom je škoda, že nemôžete vytvoriť predinštalačný háčik, ktorý funguje iba raz.

Funkcia

Funkcie Helm vám umožňujú pridať rôzne skriptovacie prvky do vašich skriptov nasadenia.

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

Tento príklad ukazuje, že hodnotou tajného kľúča apiKey bude 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 vlastných nasadení.

Funkcia vyhľadávania

Pridané v Helm 3.1 Funkcia vyhľadávania, ktorá vám umožňuje požiadať o existujúce nasadenie a:

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

Pomocou oboch týchto možností môžeme vytvoriť jednorazové, dynamicky generované tajomstvo!

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

Vždy, keď sa na server použije nová aktualizácia, Helm buď vygeneruje novú tajnú hodnotu (ak ešte neexistuje), alebo znova použije existujúcu hodnotu.

Good Luck!

Čo si ešte prečítať k téme:

  1. Tri úrovne automatického škálovania v Kubernetes a ako ich efektívne používať.
  2. Kubernetes v duchu pirátstva so šablónou na implementáciu.
  3. Náš kanál Okolo Kubernetes v telegrame.

Zdroj: hab.com

Pridať komentár