Авто-генерирање на тајни во Хелм

Авто-генерирање на тајни во Хелм

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

Контејнерите се кул. Отпрвин бев анти-контејнер (засрам ми е да признаам), но сега целосно ја поддржувам употребата на оваа технологија. Ако го читате ова, се надеваме дека успешно сте се движеле низ морињата на Докер, сте ги сфатиле придобивките од Кубернетес и многу си го олесниле животот со Хелм.

Сепак, некои работи се очигледно потешки отколку што треба.

Како автоматски да генерирате тајни при ажурирање?

Тајната на Kubernetes е ресурс што содржи парови клучеви/вредности што сакате да ги користите во вашиот код. Тоа може да бидат низи за поврзување со базата на податоци, лозинки за е-пошта и така натаму. Со користење на тајни, создавате јасна поделба помеѓу кодот и поставките, што ви овозможува лесно да ги приспособите различните распоредувања без да ја менувате базата на кодови.

Честа ситуација е кога два модула мора да комуницираат користејќи заеднички клуч. Никој надвор од кластерот не треба да го знае овој клуч, бидејќи е наменет за комуникација еден-на-еден во кластерот.

Правење тајни

Обично, за да создадете тајна во Хелм, треба:

  • опишете ја тајната во датотеката со вредности;
  • редефинирајте го за време на распоредувањето;
  • упатете се на него внатре во распоредот/под;
  • ... профит!

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

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

Едноставна тајна Kubernetes користејќи вредности од values.yml

Но, да речеме дека не сакате да ја наведете вашата тајна во датотеката со вредности.

Има многу опции кога распоредувањето бара споделен клуч, кој мора да се генерира за време на инсталацијата.

Во примерот за комуникација од модул до модул погоре, не е пожелно да се сподели тајната надвор од распоредувањето. Затоа, многу е пожелно Хелм да има механизми за автоматско генерирање на тајна без да мора директно да ја специфицира.

Куки

Куките ви дозволуваат да извршите код на одредени локации за време на процесот на инсталација. Можеби има задача за конфигурација што треба да се изврши по првата инсталација или можеби треба да се направи чистење пред да се изврши какво било ажурирање.

За да го решиме нашиот проблем со додавање клуч генериран за време на инсталацијата, идеални се куките за прединсталирање. Но, има нешто: не можете автоматски да ја генерирате тајната еднаш при ажурирање. Куките ќе работат на секое ажурирање.

Ако сте ја создале вашата тајна и вашата прва инсталација сè уште не е извршена, тогаш престанете да читате, куката за прединсталирање ќе работи одлично за вас.

Но, ако тајната е дел од ажурирање (можеби нова функција што ја немаше за време на инсталацијата), тогаш е штета што не можете да креирате кука за прединсталација што работи само еднаш.

Функции

Функциите на 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 или ќе генерира нова тајна вредност (ако сè уште нема тајна) или повторно ќе ја користи постоечката вредност.

Среќа!

Што друго да се прочита на темата:

  1. Три нивоа на автоматско скалирање во Kubernetes и како ефикасно да ги користите.
  2. Kubernetes во духот на пиратеријата со шаблон за имплементација.
  3. Нашиот канал околу Кубернетес во Телеграма.

Извор: www.habr.com

Додадете коментар