Թիմ Kubernetes aaS Mail.ru-իցթարգմանել է կարճ գրություն այն մասին, թե ինչպես ինքնաբերաբար առաջացնել Helm գաղտնիքները թարմացման ժամանակ: Ստորև ներկայացված է հոդվածի հեղինակի՝ Intoware-ի տեխնիկական տնօրենի տեքստը, որը մշակում է SaaS լուծումներ:
Տարաները թույն են: Սկզբում ես հակակոնտեյներ էի (ամաչում եմ դա խոստովանել), բայց հիմա լիովին աջակցում եմ այս տեխնոլոգիայի կիրառմանը: Եթե դուք կարդում եք սա, հուսով ենք, որ հաջողությամբ նավարկել եք Docker-ի ծովերում, հասկացել եք Kubernetes-ի առավելությունները և շատ ավելի հեշտացրել եք ձեր կյանքը Helm-ի հետ:
Այնուամենայնիվ, որոշ բաներ ակնհայտորեն ավելի բարդ են, քան պետք է:
Ինչպե՞ս ավտոմատ կերպով գաղտնիքներ ստեղծել թարմացման ժամանակ:
Kubernetes գաղտնիքը ռեսուրս է, որը պարունակում է բանալի/արժեք զույգեր, որոնք ցանկանում եք օգտագործել ձեր ծածկագրում: Դրանք կարող են լինել տվյալների բազայի միացման տողեր, էլփոստի գաղտնաբառեր և այլն: Օգտագործելով գաղտնիքները, դուք հստակ տարանջատում եք կոդի և կարգավորումների միջև, ինչը թույլ է տալիս հեշտությամբ հարմարեցնել տարբեր տեղակայումներ՝ առանց կոդերի բազան փոխելու:
Ընդհանուր իրավիճակն այն է, երբ երկու մոդուլները պետք է հաղորդակցվեն՝ օգտագործելով ընդհանուր բանալի: Կլաստերից դուրս ոչ ոք չպետք է իմանա այս բանալին, քանի որ այն նախատեսված է կլաստերի ներսում մեկ առ մեկ հաղորդակցվելու համար:
Գաղտնիքներ պատրաստելը
Սովորաբար, Helm-ում գաղտնիք ստեղծելու համար անհրաժեշտ է.
Պարզ 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-ը կա՛մ կստեղծի նոր գաղտնի արժեք (եթե դեռ գաղտնիք չկա), կա՛մ նորից կօգտագործի գոյություն ունեցող արժեքը: