
Komanda o tome kako automatski generirati tajne Helm prilikom ažuriranja. U nastavku slijedi tekst autora članka — tehničkog direktora Intoware, tvrtke koja razvija SaaS rješenja.
Kontejneri su super. Isprva sam bio protivnik kontejnera (sram me priznati), ali sada potpuno podržavam korištenje te tehnologije. Ako ovo čitate, nadam se da ste uspješno plovili morima Dockera, prepoznali prednosti Kubernetesa i olakšali si život s Helm-om.
Ipak, neke stvari su očito složenije nego što bi trebale biti.
Kako automatski generirati tajne prilikom ažuriranja?
Tajna Kubernetesa je resurs koji sadrži parove ključ/vrijednost koje želite koristiti u svom kodu. To mogu biti veze za bazu podataka, lozinke za e-poštu i slično. Korištenjem tajni stvarate jasno razdvajanje između koda i postavki, što omogućuje jednostavno prilagođavanje različitih implementacija bez promjene osnovne kodne baze.
Česta situacija je kada dva modula trebaju komunicirati putem zajedničkog ključa. Nitko izvan klastera ne bi trebao znati taj ključ, jer je namijenjen komunikaciji "od jednog do drugog" unutar klastera.
Kreiranje tajni
Obično, da biste kreirali tajnu u Helmu, trebate:
- opisati tajnu u datoteci vrijednosti;
- prepisati je tijekom deploya;
- pozvati je unutar deploya/podra;
- … profit!
Obično to izgleda otprilike ovako:
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ .Values.MyApiKeySecret | quote }}
Jednostavna tajna Kubernetesa, koristeći vrijednosti iz values.yml
Ali, pretpostavimo da ne želite navesti svoju tajnu u datoteci vrijednosti.
Postoji mnogo opcija kada implementacija zahtijeva zajednički ključ, koji se mora generirati tijekom instalacije.
U gornjem primjeru komunikacije između modula nije poželjno dijeliti tajnu izvan implementacije. Stoga je vrlo poželjno da Helm ima mehanizme za automatsko kreiranje tajne bez potrebe za izravnim navođenjem.
Hookovi
Hookovi omogućuju pokretanje koda na određenim mjestima tijekom procesa instalacije. Moguće je da postoji zadatak konfiguracije koji treba izvršiti nakon prve instalacije, ili možda trebate izvršiti čišćenje prije bilo koje nadogradnje.
Za rješavanje našeg problema s dodavanjem ključa, koji se generira tijekom instalacije, predinstalacijski hookovi su savršeni. Ali postoji jedan problem: ne možete automatski generirati tajnu jednom prilikom nadogradnje. Hookovi će raditi pri svakoj nadogradnji.
Ako ste generirali svoju tajnu, a vaša prva instalacija još nije obavljena, tada prestanite čitati, predinstalacijski hook će biti savršen za vas.
No ako je tajna dio nadogradnje (možda nove funkcionalnosti koja nije postojala tijekom instalacije), onda je žalosno što nije moguće stvoriti predinstalacijski hook koji će raditi samo jedanput.
Funkcije
Helmove funkcije omogućuju dodavanje raznih elemenata skripti u skripte za implementaciju.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Generirajte novi UUID i citirajte ga
U ovom primjeru prikazano je da će vrijednost tajne apiKey biti novi UUID, generiran tijekom instalacije.
Helm uključuje stvarno opsežnu knjižnicu funkcija, koja koristi nevjerojatne GO predloške i Sprig knjižnicu funkcija za izradu prilagođenih implementacija.
Funkcija Lookup
U Helmu 3.1 dodana je , koja omogućuje upit postojećeg deploya i:
- provjeru postojanja resursa;
- vratiti vrijednost postojećeg resursa za daljnju upotrebu.
Korištenjem obje ove mogućnosti možemo stvoriti jednokratnu dinamički generiranu tajnu!
# 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 }}
Svaki put kada se nova nadogradnja primijeni na poslužitelj, Helm će ili generirati novu vrijednost tajne (ako tajne još nema), ili ponovo upotrijebiti postojeću vrijednost.
Sretno!
Što još pročitati o temi:
- .
- .
- .
Izvor: habr.com
