Գաղտնիքների ավտոմատ սերունդ 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-ի արժեքները

Բայց ենթադրենք, որ դուք չեք ցանկանում նշել ձեր գաղտնիքը արժեքների ֆայլում:

Կան բազմաթիվ տարբերակներ, երբ տեղակայումը պահանջում է ընդհանուր բանալի, որը պետք է ստեղծվի տեղադրման ժամանակ:

Մոդուլից մոդուլ հաղորդակցության վերևի օրինակում ցանկալի չէ գաղտնիքը կիսել տեղակայումից դուրս: Հետևաբար, շատ ցանկալի է, որ Հելմն ունենա գաղտնիք ավտոմատ կերպով ստեղծելու մեխանիզմներ՝ առանց այն ուղղակիորեն նշելու:

Կեռիկներ

Կեռիկներ թույլ են տալիս գործարկել կոդը կոնկրետ վայրերում տեղադրման գործընթացում: Կարող է լինել կազմաձևման աշխատանք, որը պետք է գործարկվի առաջին տեղադրումից հետո, կամ գուցե անհրաժեշտ է մաքրում կատարել նախքան որևէ թարմացում կատարելը:

Տեղադրման ընթացքում առաջացած բանալին ավելացնելու մեր խնդիրը լուծելու համար նախատեղադրման կեռիկներն իդեալական են: Բայց կա մի որսորդություն. դուք չեք կարող ավտոմատ կերպով ստեղծել գաղտնիքը մեկ անգամ թարմացման ժամանակ: Hooks-ը կաշխատի յուրաքանչյուր թարմացման վրա:

Եթե ​​դուք ստեղծել եք ձեր գաղտնիքը, և ձեր առաջին տեղադրումը դեռ չի կատարվել, ապա դադարեցրեք կարդալը, նախապես տեղադրվող կեռիկը հիանալի կաշխատի ձեզ համար:

Բայց եթե գաղտնիքը թարմացման մի մասն է (գուցե նոր գործառույթ, որը չկար տեղադրման ժամանակ), ապա ամոթ է, որ չես կարող ստեղծել նախատեղադրման կեռիկ, որն աշխատում է միայն մեկ անգամ:

Գործառույթներ

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. Մեր ալիքը Kubernetes-ի շուրջ Telegram-ում.

Source: www.habr.com

Добавить комментарий