Автогенерация на тайни в 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 }} #Генерирайте нов UUID и го цитирайте

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

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

Функция Lookup

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

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

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

# 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 ще генерира нова стойност за секрет (ако секретът все още не съществува), или ще повторно използва съществуващата стойност.

Успех!

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

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

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster