
Каманда аб тым, як аўтаматычна генераваць сакрэты 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 для стварэння наладжвальных разгортванняў.
Функцыя Lookup
У 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 будзе альбо генераваць новае значэнне сакрэту (калі сакрэту яшчэ няма), альбо паўторна выкарыстоўваць існуючае значэнне.
Поспехаў!
Што яшчэ пачытаць па тэме:
- .
- .
- .
Крыніца: habr.com
