
Ekipa rreth se si të gjeneroni automatikisht sekrete Helm gjatë përditësimeve. Më poshtë është teksti nga autori i artikullit — drejtori teknik i Intoware, kompanisë zhvilluse të zgjidhjeve SaaS.
Kontejnerët janë të mrekullueshëm. Fillimisht isha një kundërshtar i kontejnereve (më vjen turp ta pranoj), por tani e mbështes plotësisht përdorimin e kësaj teknologjie. Nëse po e lexoni këtë, shpresoj që keni kaluar me sukses nëpër detet Docker, e keni kuptuar përparësitë e Kubernetes dhe e keni bërë jetën tuaj shumë më të lehtë me Helm.
Megjithatë, disa gjëra janë dukshëm më të komplikuara se sa duhen.
Si të gjeneroni automatikisht sekrete gjatë përditësimeve?
Sekreti i Kubernetes është një burim që përmban çifte çelës/vlerë që dëshironi të përdorni në kodin tuaj. Këto mund të jenë lidhje në baza të dhënash, fjalëkalime të postave elektronike dhe kështu me radhë. Duke përdorur sekrete, krijoni një ndarje të qartë midis kodit dhe konfigurimeve, çka lejon që të konfiguroheni lehtësisht për shpërndarje të ndryshme pa ndryshuar bazën e kodit.
Një situatë e zakonshme është kur dy module duhet të bashkëveprojnë përmes një çelësi të përbashkët. Askush jashtë klasterit nuk duhet ta dijë këtë çelës, pasi ai është i destinuar për lidhjen "nga njëri te tjetri" brenda klasterit.
Krijimi i sekreteve
Normalisht, për të krijuar një sekret në Helm, duhet:
- të përshkruani sekretin në skedarin e vlerave;
- të rishkruani atë gjatë procesit të shpërndarjes;
- të referoheni te ai brenda shpërndarjes/podit;
- … fitimi !
Normalisht, duket disi kështu:
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ .Values.MyApiKeySecret | quote }}
Një sekret i thjeshtë i Kubernetes, duke përdorur vlerat nga values.yml
Por, le të themi se nuk dëshironi ta specifikoni sekretin tuaj në skedarin e vlerave.
Ka shumë variante kur një çelës i përbashkët kërkohet për shpërndarje që duhet të gjenerohet gjatë instalimit.
Në shembullin e mësipërm me lidhjen midis moduleve, ndarja e sekretit jashtë shpërndarjes nuk është e dëshirueshme. Prandaj, është shumë e dëshirueshme që Helm të ketë mekanizma për krijimin automatik të sekreteve pa nevojën për ta specifikuar atë drejtpërdrejt.
Hukodat
Hukët lejojnë ekzekutimin e kodit në vende të caktuara gjatë procesit të instalimit. Mund të ketë një detyrë konfigurimi që duhet të ekzekutohet pas instalimit të parë, ose ndoshta është e nevojshme të bëhet një pastrim para se të kryhet ndonjë përditësim.
Për zgjidhjen e problemit tonë të shtimit të çelësit, i gjeneruar gjatë instalimit, hukët e parainstaluara janë një zgjidhje ideale. Por ka një kapëse: nuk mund të gjeneroni automatikisht një sekret një herë gjatë përditësimit. Hukët do të funksionojnë me çdo përditësim.
Nëse keni gjeneruar sekretin tuaj dhe instalimi i parë ende nuk ka ndodhur, atëherë ndaloni së lexuari, huka e parainstaluar është e shkëlqyer për ju.
Por nëse sekreti është pjesë e përditësimit (ndoshta një veçori e re që nuk ishte gjatë instalimit), atëherë është e bezdisshme që nuk është e mundur të krijoni një huka parainstaluar që të funksionojë vetëm një herë.
Funksionet
Funksionet Helm lejojnë shtimin e elementeve të ndryshme të skripteve në skenaret e shpërndarjes.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Gjeneroni një UUID të ri dhe citojeni atë
Në këtë shembull, vlera e sekretit apiKey do të jetë një UUID i ri, i gjeneruar gjatë instalimit.
Helm përfshin një bibliotekë të gjerë funksionesh, që përdor funksione mahnitëse të shabllonit GO dhe bibliotekën e funksioneve Sprig për të krijuar shpërndarje të personalizuara.
Funksioni Lookup
Deri në Helm 3.1 është shtuar , i cili lejon të kërkoni një shpërndarje ekzistuese dhe:
- të kontrolloni ekzistencën e burimeve;
- të ktheni vlerën e burimit ekzistues për përdorim të mëtejshëm.
Duke përdorur të dyja këto mundësi, mund të krijojmë një sekret dinamik të gjeneruar një herë!
# 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 }}
Sa herë që një përditësim i ri aplikohet në server, Helm do të gjenerojë ose një vlerë të re të sekretit (nëse sekreti nuk ekziston tashmë), ose do të ribashkëngjisë vlerën ekzistuese.
Suksese!
Çfarë tjetër të lexoni mbi këtë temë:
- .
- .
- .
Burimi: habr.com
