Autogeneracja sekretów w Helm

Autogeneracja sekretów w Helm

Zespół Kubernetes aaS od Mail.ru Przetłumaczyłem krótką notatkę o tym, jak automatycznie generować sekrety Helm podczas aktualizacji. Dalej tekst od autora artykułu — dyrektora technicznego Intoware, firmy tworzącej rozwiązania SaaS.

Kontenery to coś niesamowitego. Na początku byłem przeciwnikiem kontenerów (wstyd mi się przyznać), ale teraz całkowicie popieram wykorzystanie tej technologii. Jeżeli to czytasz, mam nadzieję, że odnosiłeś już sukcesy na morzach Dockera, dostrzegłeś zalety Kubernetes i znacznie ułatwiłeś sobie życie z Helmem.

Jednak niektóre rzeczy są wyraźnie trudniejsze, niż powinny być.

Jak automatycznie generować sekrety podczas aktualizacji?

Sekret Kubernetes to zasób, który zawiera pary klucz/wartość, które chcesz wykorzystać w swoim kodzie. Mogą to być dane połączenia z bazą danych, hasła do wiadomości e-mail i tak dalej. Używając sekretów, tworzysz wyraźne oddzielenie między kodem a ustawieniami, co pozwala łatwo konfigurować różne wdrożenia bez zmiany bazy kodu.

Często występująca sytuacja, w której dwa moduły muszą współdziałać za pomocą wspólnego klucza. Nikt poza klastrem nie powinien znać tego klucza, ponieważ jest on przeznaczony do komunikacji „od jednego do drugiego” wewnątrz klastra.

Tworzenie sekretów

Zazwyczaj, aby stworzyć sekret w Helm, należy:

  • opisać sekret w pliku wartości;
  • przedefiniować go podczas wdrożenia;
  • odwołać się do niego we wdrożeniu/podzie;
  • … zyski!

Zazwyczaj wygląda to mniej więcej tak:

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

Prosty sekret Kubernetes, wykorzystujący wartości z values.yml

Ale załóżmy, że nie chcesz podawać swojego sekretu w pliku wartości.

Istnieje wiele sytuacji, w których do wdrożenia potrzebny jest wspólny klucz, który musi być generowany podczas instalacji.

W powyższym przykładzie ze współpracą między modułami niepożądane jest dzielenie się sekretem poza wdrożeniem. Dlatego bardzo wskazane jest, aby Helm miał mechanizmy do automatycznego tworzenia sekretu bez konieczności jego bezpośredniego wskazywania.

Hooki

Haki pozwalają na uruchamianie kodu w określonych miejscach procesu instalacji. Może być zadanie konfiguracyjne, które należy uruchomić po pierwszej instalacji, lub może być konieczne przeprowadzenie czyszczenia przed wykonaniem jakiejkolwiek aktualizacji.

Do rozwiązania naszego problemu z dodawaniem klucza, generowanego podczas instalacji, idealnie nadają się haki wstępne. Ale jest jeden haczyk: nie można automatycznie wygenerować sekretny raz przy aktualizacji. Haki będą działać przy każdej aktualizacji.

Jeśli wygenerowałeś swój sekret, a twoja pierwsza instalacja jeszcze się nie odbyła, wtedy przestań czytać, hak wstępny będzie dla ciebie idealny.

Ale jeśli sekret jest częścią aktualizacji (być może nowej funkcji, której nie było podczas instalacji), to niestety niemożliwe jest stworzenie haka wstępnego, który zadziałałby tylko raz.

Funkcje

Funkcje Helm pozwalają na dodawanie różnych elementów skryptów do skryptów wdrożeniowych.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generuj nowy UUID i zakotwicz go

W tym przykładzie widać, że wartością sekretną apiKey będzie nowy UUID, wygenerowany podczas instalacji.

Helm zawiera naprawdę szeroką bibliotekę funkcji, która wykorzystuje niesamowite funkcje szablonów GO i bibliotekę funkcji Sprig do tworzenia dostosowanych wdrożeń.

Funkcja Lookup

W Helm 3.1 dodano funkcję Lookup, która pozwala na zapytanie istniejącego wdrożenia i:

  • sprawdzić istnienie zasobów;
  • zwrócić wartość istniejącego zasobu do dalszego wykorzystania.

Wykorzystując te dwie możliwości, możemy stworzyć jednorazowy, dynamicznie generowany sekret!

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

Za każdym razem, gdy nowe aktualizacje są stosowane do serwera, Helm będzie albo generować nową wartość sekretną (jeśli sekret jeszcze nie istnieje), albo ponownie wykorzystywać istniejącą wartość.

Powodzenia!

Co jeszcze przeczytać na ten temat:

  1. Trzy poziomy automatycznego skalowania w Kubernetes i jak je skutecznie wykorzystać.
  2. Kubernetes w duchu piratów z szablonem wdrożeniowym.
  3. Nasz kanał Wokół Kubernetes na Telegramie.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster