â mĂ€hiselement , mis vĂ”imaldab ĂŒhes kohas kirjeldada mitmeid helmvĂ€ljalasid, parametriseerida neid tabeleid mitme keskkonna jaoks ning mÀÀrata nende juurutamise jĂ€rjekorda.
Helmfile'i ja selle kasutamise nÀidete kohta saab lugeda ja .
Me tutvume mitte-ilmselgete viisidega, kuidas kirjeldada vÀljalasid helmfile'is
Oletame, et meil on hulk helm-tabeleid (nÀiteks postgres ja mingi tagaukse rakendus) ja mitu keskkonda (mitu Kubernetes klastrit, mitu namespace'i vÔi mÔlemat). VÔtame helmfile'i, loeme dokumentatsiooni ja hakkame kirjeldama meie keskkondi ja vÀljalasid:
.
âââ envs
â  âââ devel
â  â  âââ values
â  â  âââ backend.yaml
â  â  âââ postgres.yaml
â  âââ production
â  âââ values
â  âââ backend.yaml
â  âââ postgres.yaml
âââ helmfile.yamlhelmfile.yaml
keskkonnad:
devel:
production:
vÀljalad:
- nimi: postgres
sildid:
rakendus: postgres
oota: true
tabel: stable/postgresql
versioon: 8.4.0
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/postgres.yaml
- nimi: backend
sildid:
rakendus: backend
oota: true
tabel: private-helm-repo/backend
versioon: 1.0.5
vajab:
- postgres
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/backend.yamlMeil on kaks keskkonda: devel, tootmisse â igas on oma vÀÀrtused helm chartide vĂ€ljaannetes. Me deponeerime neid nii:
helmfile -n -e applyErinevad helm chartide versioonid erinevates keskkondades
Mida teha, kui peame erinevate versioonide backend'i erinevatesse keskkondadesse rakendama? Kuidas parameetriseerida vÀljaande versioon? Siin tulevad appi keskkonna vÀÀrtused, mis on saadaval kaudu {{ .Values }}
helmfile.yaml
environments:
devel:
+ values:
+ - charts:
+ versions:
+ backend: 1.1.0
production:
+ values:
+ - charts:
+ versions:
+ backend: 1.0.5
...
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
- version: 1.0.5
+ version: {{ .Values.charts.versions.backend }}
...Erinev rakenduste komplekt erinevates keskkondades
SuurepĂ€rane, aga mis siis, kui me ei pea tootmisse rakendama postgres'i, sest teame, et andmebaasi ei pea k8s-sse pannama ja meil on mĂŒĂŒgis imeline eraldi postgres klasster? Selle probleemi lahendamiseks on meil etiketid (labels)
helmfile -n -e devel apply
helmfile -n -e production -l app=backend applySee on suurepĂ€rane, kuid isiklikult eelistan ma kirjeldada, milliseid rakendusi keskkonnas juurutada mitte kĂ€ivitamisargumentide, vaid keskkondade enda kirjeldustes. Mida teha? Siin on vĂ”imalik paigutada versioonide kirjeldused eraldi kausta, keskkonna kirjelduse alla luua vajalike versioonide nimekiri ja "siduda" ainult vajalikud versioonid, jĂ€ttes ĂŒlejÀÀnud tĂ€helepanuta.
.
âââ envs
â  âââ devel
â  â  âââ values
â  â  âââ backend.yaml
â  â  âââ postgres.yaml
â  âââ production
â  âââ values
â  âââ backend.yaml
â  âââ postgres.yaml
+ âââ releases
+ â  âââ backend.yaml
+ â  âââ postgres.yaml
âââ helmfile.yaml
helmfile.yaml
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
- releases:
- - name: postgres
- labels:
- app: postgres
- wait: true
- chart: stable/postgresql
- version: 8.4.0
- values:
- - envs/{{ .Environment.Name }}/values/postgres.yaml
- - name: backend
- labels:
- app: backend
- wait: true
- chart: private-helm-repo/backend
- version: {{ .Values.charts.versions.backend }}
- needs:
- - postgres
- values:
- - envs/{{ .Environment.Name }}/values/backend.yaml
+ ---
+ bases:
+ {{- range .Values.apps }}
+ - releases/{{ . }}.yaml
+ {{- end }}releases/postgres.yaml
vÀljaanded:
- nimi: postgres
sildid:
rakendus: postgres
oota: true
kaart: stable/postgresql
versioon: 8.4.0
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/postgres.yamlreleases/backend.yaml
vÀljaanded:
- nimi: backend
sildid:
rakendus: backend
oota: true
kaart: private-helm-repo/backend
versioon: {{ .Values.charts.versions.backend }}
vajadused:
- postgres
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/backend.yamlMĂ€rkus
ĐŃĐž ĐžŃĐżĐŸĐ»ŃĐ·ĐŸĐČĐ°ĐœĐžĐž baasid: on kohustuslik kasutada yaml eraldajat ---, et oleks vĂ”imalik vĂ€ljaandeid (ja muid osi, nagu helmDefaults) mallida vÀÀrtustega keskkondadest
Sel juhul ei pÀÀse postgres vÀljaanne isegi tootmisest kirjeldusse. VÀga mugav!
Ăledefineeritavad globaalne vÀÀrtused vĂ€ljaannete jaoks
Loomulikult on tore, et iga keskkonna jaoks saab seada helm kaardile vÀÀrtusi, kuid mis juhtub, kui meil on mitu keskkonda ja me tahame nÀiteks seada need kÔikidele sama affinity, kuid ei taha seadistada seda vaikimisi endi kaardides, mis on salvestatud hoidlates.
Sel juhul vĂ”iksime iga vĂ€ljaande jaoks seada 2 vÀÀrtuste faili: esimene vaikimisi vÀÀrtustega, mis mÀÀravad kaardi vÀÀrtused, ja teine vÀÀrtustega keskkonnale, mis omakorda ĂŒletab vaikimisi.
.
âââ envs
+ â  âââ default
+ â  â  âââ values
+ â  â  âââ backend.yaml
+ â  â  âââ postgres.yaml
â  âââ devel
â  â  âââ values
â  â  âââ backend.yaml
â  â  âââ postgres.yaml
â  âââ production
â  âââ values
â  âââ backend.yaml
â  âââ postgres.yaml
âââ releases
â  âââ backend.yaml
â  âââ postgres.yaml
âââ helmfile.yamlreleases/backend.yaml
vÀljaanded:
- nimi: backend
sildid:
app: backend
oota: true
chart: private-helm-repo/backend
version: {{ .Values.charts.versions.backend }}
vajab:
- postgres
value-d:
+ - envs/default/values/backend.yaml
- envs/{{ .Environment.Name }}/values/backend.yamlenvs/default/values/backend.yaml
afiniteet:
podAntiAffinity:
eelistatudPlaneerimiselIgnoreerituTĂ€itmisel:
- kaal: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"Helmi chartide globaalsete vÀÀrtuste mÀÀratlemine kÔigi vÀljaannete keskkonna tasemel
Oletame, et meil on mitmes vĂ€ljaandes mitu ingress'i â saaksime igas chartis kĂ€sitsi mÀÀratleda hosts:, aga meie puhul on domeen ĂŒks ja sama, miks ei saaks seda ĂŒldiseks muutujaks teha ja lihtsalt selle vÀÀrtust graafikutesse sisestada? Sel eesmĂ€rgil peavad need vÀÀrtuste failid, mida soovime parameetriseerida, olema laiendusega .gotmpl, et helmfile teaks, et neid tuleb töödelda ĆĄabloonimise kaudu.
.
âââ envs
â âââ default
â â âââ values
- â â âââ backend.yaml
- â â âââ postgres.yaml
+ â â âââ backend.yaml.gotmpl
+ â â âââ postgres.yaml.gotmpl
â âââ devel
â â âââ values
â â âââ backend.yaml
â â âââ postgres.yaml
â âââ production
â âââ values
â âââ backend.yaml
â âââ postgres.yaml
âââ releases
â âââ backend.yaml
â âââ postgres.yaml
âââ helmfile.yamlhelmfile.yaml
keskkonnad:
devel:
vÀÀrtused:
- graafikud:
versioonid:
backend: 1.1.0
- rakendused:
- postgres
- backend
+ - globaalne:
+ ingressDomain: k8s.devel.domain
production:
vÀÀrtused:
- graafikud:
versioonid:
backend: 1.0.5
- rakendused:
- backend
+ - globaalne:
+ ingressDomain: production.domain
---
baasi:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}envs/default/values/backend.yaml.gotmpl
ingress:
lubatud: true
teed:
- /api
kĂŒlalised:
- {{ .Values.global.ingressDomain }}envs/default/values/postgres.yaml.gotmpl
ingress:
enabled: true
paths:
- /
hosts:
- postgres.{{ .Values.global.ingressDomain }}MĂ€rkus
On selge, et postgres chartâi ingress on midagi vĂ€ga kahtlast, mistĂ”ttu on see artiklis toodud lihtsalt kui sfÀÀriline nĂ€ide tĂŒhjas Ă”hus ja selleks, et mitte artiklisse tuua mingit uut vĂ€ljaandmist lihtsalt ingressi kirjeldamiseks.
Saladuste (secrets) asendamine keskkonna vÀÀrtustest
Sarnaselt eelpool toodud nĂ€itele saab asendada ka krĂŒpteeritud vÀÀrtusi vÀÀrtuste. Selle asemel, et iga vĂ€ljaande jaoks luua oma secrets fail, milles mÀÀratakse ĆĄifreeritud vÀÀrtused chartâi jaoks, saame lihtsalt mÀÀratleda vĂ€ljaande default.yaml.gotmpl failis vÀÀrtused, mis vĂ”etakse keskkonnatasemel mÀÀratud muutujatest. Ja vÀÀrtused, mida me ei pea kedagi varjama, saab rahulikult ĂŒmber mÀÀrata vĂ€ljaande vÀÀrtustes konkreetse keskkonna jaoks.
.
âââ envs
â âââ default
â â âââ values
â â âââ backend.yaml
â â âââ postgres.yaml
â âââ devel
â â âââ values
â â â âââ backend.yaml
â â â âââ postgres.yaml
+ â â âââ secrets.yaml
â âââ production
â âââ values
â â âââ backend.yaml
â â âââ postgres.yaml
+ â âââ secrets.yaml
âââ releases
â âââ backend.yaml
â âââ postgres.yaml
âââ helmfile.yamlhelmfile.yaml
keskkonnad:
devel:
vÀÀrtused:
- kaardid:
versioonid:
backend: 1.1.0
- rakendused:
- postgres
- backend
- globaalne:
ingressDomain: k8s.devel.domain
+ saladused:
+ - envs/devel/secrets.yaml
tootmis:
vÀÀrtused:
- kaardid:
versioonid:
backend: 1.0.5
- rakendused:
- backend
- globaalne:
ingressDomain: production.domain
+ saladused:
+ - envs/production/secrets.yaml
---
baasid:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}envs/devel/secrets.yaml
saladused:
elastic:
parool: ENC[AES256_GCM,data:hjCB,iv:Z1P6/6xBJgJoKLJ0UUVfqZ80o4L84jvZfM+uH9gBelc=,tag:dGqQlCZnLdRAGoJSj63rBQ==,type:int]
...envs/production/secrets.yaml
saladused:
elastic:
parool: ENC[AES256_GCM,data:ZB/VpTFk8f0=,iv:EA//oT1Cb5wNFigTDOz3nA80qD9UwTjK5cpUwLnEXjs=,tag:hMdIUaqLRA8zuFBd82bz6A==,type:str]
...envs/default/values/backend.yaml.gotmpl
elasticsearch:
host: elasticsearch
port: 9200
parool: {{ .Values | getOrNil "saladused.elastic.parool" | default "parool" }}envs/devel/values/backend.yaml
elasticsearch:
host: elastic-0.devel.domainenvs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domainMĂ€rkus
Muide, getOrNil â spetsiaalne funktsioon go mallide jaoks helmfile'is, mis isegi kui .Values.secrets ei eksisteeri, ei tekitaks viga, vaid vĂ”imaldaks tulemuseks kasutada funktsiooni default sisestada vaikimisi vÀÀrtus
KokkuvÔte
Kirjeldatud asjad tunduvad ĂŒsna ilmsed, kuid mugava kirjelduse leidmine mitme keskkonna juurutamiseks helmfile'i abil on vĂ€ga napp, ja mulle meeldib IaC (Infrastructure-as-Code) ning tahan omada selget juurutuse oleku kirjeldust.
LĂ”petuseks tahan lisada, et vaikimisi keskkonna muutujad saab omakorda parametriseerida teatud jooksja operatsioonisĂŒsteemi keskkonnamuutujate kaudu, millelt juurutamine kĂ€ivitatakse, ja seega saavutada dĂŒnaamilised keskkonnad
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}Allikas: habr.com
