Автоматично генериране на тайни в Helm

Автоматично генериране на тайни в Helm

Отбор Kubernetes aaS от Mail.ru преведе кратка бележка за това как автоматично да генерирате Helm тайни при актуализиране. Следва текст от автора на статията - технически директор на Intoware, компания, която разработва SaaS решения.

Контейнерите са готини. Първоначално бях против контейнера (срам ме е да го призная), но сега напълно подкрепям използването на тази технология. Ако четете това, надяваме се успешно да навигирате в моретата на Docker, осъзнахте предимствата на Kubernetes и сте направили живота си много по-лесен с Helm.

Някои неща обаче очевидно са по-трудни, отколкото трябва.

Как автоматично да генерирам тайни при актуализиране?

Тайната на Kubernetes е ресурс, който съдържа двойки ключ/стойност, които искате да използвате във вашия код. Това могат да бъдат низове за връзка с базата данни, пароли за имейли и т.н. Използвайки тайни, вие създавате ясно разделение между кода и настройките, което ви позволява лесно да персонализирате различни внедрявания, без да променяте кодовата база.

Често срещана ситуация е, когато два модула трябва да комуникират с помощта на общ ключ. Никой извън клъстера не трябва да знае този ключ, тъй като той е предназначен за комуникация един към един в рамките на клъстера.

Създаване на тайни

Обикновено, за да създадете тайна в Helm, трябва да:

  • опишете тайната във файла със стойности;
  • предефинирайте го по време на внедряването;
  • обърнете се към него в разгръщането/под;
  • ... печалба!

Обикновено изглежда така:

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

Проста тайна на Kubernetes, използваща стойности от values.yml

Но да кажем, че не искате да посочите вашата тайна във файла със стойности.

Има много опции, когато внедряването изисква споделен ключ, който трябва да се генерира по време на инсталацията.

В примера за комуникация между модули по-горе не е желателно да споделяте тайната извън внедряването. Следователно е много желателно Helm да има механизми за автоматично генериране на тайна, без да се налага да я указва директно.

Кукички

Куките ви позволяват да изпълнявате код на определени места по време на инсталационния процес. Възможно е да има задание за конфигуриране, което трябва да се изпълни след първата инсталация, или може би трябва да се извърши почистване, преди да се извърши актуализация.

За да разрешим нашия проблем с добавянето на ключ, генериран по време на инсталацията, куките за предварително инсталиране са идеални. Но има една уловка: не можете автоматично да генерирате тайната веднъж при актуализация. Куките ще работят при всяка актуализация.

Ако сте генерирали вашата тайна и първата ви инсталация все още не се е случила, тогава спрете да четете, куката за предварително инсталиране ще работи чудесно за вас.

Но ако тайната е част от актуализация (може би нова функция, която не е била там по време на инсталацията), тогава е жалко, че не можете да създадете кука за предварително инсталиране, която да работи само веднъж.

функции

Функциите на Helm ви позволяват да добавяте различни скриптови елементи към вашите скриптове за внедряване.

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

Този пример показва, че стойността на тайната на apiKey ще бъде новият UUID, генериран по време на инсталацията.

Helm включва наистина обширна библиотека с функции, която използва удивителните функции на GO шаблон и библиотеката с функции на Sprig за създаване на персонализирани внедрявания.

Функция за търсене

Добавен в Helm 3.1 Функция за търсене, което ви позволява да поискате съществуващо внедряване и:

  • проверка на наличието на ресурси;
  • връща стойността на съществуващ ресурс за по-късна употреба.

Използвайки и двете възможности, можем да създадем еднократна, динамично генерирана тайна!

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

Всеки път, когато се приложи нова актуализация към сървъра, Helm или ще генерира нова секретна стойност (ако все още няма тайна), или ще използва повторно съществуващата стойност.

Good Luck!

Какво още да прочетете по темата:

  1. Три нива на автоматично мащабиране в Kubernetes и как да ги използвате ефективно.
  2. Kubernetes в духа на пиратството с шаблон за внедряване.
  3. Нашият канал Около Kubernetes в Telegram.

Източник: www.habr.com

Добавяне на нов коментар