Тим Kubernetes aaS од Mail.ruпреведе кратка белешка за тоа како автоматски да се генерираат тајните на Helm при ажурирање. Во продолжение следува текст од авторот на статијата - технички директор на Intoware, компанија која развива SaaS решенија.
Контејнерите се кул. Отпрвин бев анти-контејнер (засрам ми е да признаам), но сега целосно ја поддржувам употребата на оваа технологија. Ако го читате ова, се надеваме дека успешно сте се движеле низ морињата на Докер, сте ги сфатиле придобивките од Кубернетес и многу си го олесниле животот со Хелм.
Сепак, некои работи се очигледно потешки отколку што треба.
Како автоматски да генерирате тајни при ажурирање?
Тајната на Kubernetes е ресурс што содржи парови клучеви/вредности што сакате да ги користите во вашиот код. Тоа може да бидат низи за поврзување со базата на податоци, лозинки за е-пошта и така натаму. Со користење на тајни, создавате јасна поделба помеѓу кодот и поставките, што ви овозможува лесно да ги приспособите различните распоредувања без да ја менувате базата на кодови.
Честа ситуација е кога два модула мора да комуницираат користејќи заеднички клуч. Никој надвор од кластерот не треба да го знае овој клуч, бидејќи е наменет за комуникација еден-на-еден во кластерот.
Едноставна тајна 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 или ќе генерира нова тајна вредност (ако сè уште нема тајна) или повторно ќе ја користи постоечката вредност.