â egy burkolĂł a , amely lehetĆvĂ© teszi, hogy egy helyen Ărjuk le a sok helm kiadĂĄst, paramĂ©terezve a chartokat több környezethez, Ă©s megadva a telepĂtĂ©sĂŒk sorrendjĂ©t.
A helmfile-ról és annak hasznålatånak példåiról itt olvashat: és .
Most a helmfile-ben a kiadĂĄsok leĂrĂĄsĂĄnak nem nyilvĂĄnvalĂł mĂłdszereit ismerjĂŒk meg
TegyĂŒk fel, hogy van egy csomag helm chartunk (pĂ©ldĂĄul postgres Ă©s egy backend alkalmazĂĄs), Ă©s több környezet (több kubernetes klaszter, több namespace vagy mindkettĆ). ElĆvesszĂŒk a helmfile-t, elolvassuk a dokumentĂĄciĂłt, Ă©s elkezdjĂŒk leĂrni a környezeteinket Ă©s kiadĂĄsainkat:
.
âââ envs
â âââ devel
â â âââ values
â â âââ backend.yaml
â â âââ postgres.yaml
â âââ production
â âââ values
â âââ backend.yaml
â âââ postgres.yaml
âââ helmfile.yamlhelmfile.yaml
environments:
devel:
production:
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: 1.0.5
needs:
- postgres
values:
- envs/{{ .Environment.Name }}/values/backend.yamlKĂ©t környezetĂŒnk lett: devel, production â mindegyikben sajĂĄt Ă©rtĂ©kek vannak a helm chartok kiadĂĄsaihoz. TelepĂteni az alĂĄbbiak szerint fogunk:
helmfile -n -e applyKĂŒlönbözĆ helm chart verziĂłk kĂŒlönbözĆ környezetekben
Mi a teendĆ, ha kĂŒlönbözĆ backend verziĂłkat kell kiadnunk kĂŒlönbözĆ környezetekben? Hogyan paramĂ©terezhetjĂŒk a kiadĂĄs verziĂłjĂĄt? A környezeti Ă©rtĂ©kek segĂtenek, amelyeket elĂ©rhetĂŒnk a {{ .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 }}
...KĂŒlönbözĆ alkalmazĂĄsok kĂ©szlete kĂŒlönbözĆ környezetekben
Remek, de mi van, ha nem kĂvĂĄnjuk production a postgREST kiadĂĄsĂĄt, mert tudjuk, hogy nem kell adatbĂĄzist tennĂŒnk a k8s-be, Ă©s a termelĂ©shez van egy csodĂĄs kĂŒlön postgres klaszterĂŒnk? Erre a problĂ©mĂĄra a cĂmkĂ©k (labels) jelentik a megoldĂĄst.
helmfile -n -e devel apply
helmfile -n -e production -l app=backend applyEz nagyszerƱ, de szemĂ©ly szerint Ășgy preferĂĄlnĂĄm, hogy az alkalmazĂĄsok környezeten belĂŒli telepĂtĂ©sĂ©t ne futtatĂĄsi argumentumokkal, hanem maguknak a környezeteknek a leĂrĂĄsĂĄval hatĂĄrozzuk meg. Mi a teendĆ? A kiadĂĄsok leĂrĂĄsĂĄt egy kĂŒlön mappĂĄba tehetjĂŒk, a környezet leĂrĂĄsĂĄban lĂ©trehozhatunk egy szĂŒksĂ©ges kiadĂĄsok listĂĄjĂĄt, Ă©s csak a szĂŒksĂ©ges kiadĂĄsokat "cselezhetjĂŒk be", figyelmen kĂvĂŒl hagyva a többit.
.
âââ környezetek
â  âââ fejlesztĂ©s
â  â  âââ Ă©rtĂ©kek
â  â  âââ backend.yaml
â  â  âââ postgres.yaml
â  âââ termelĂ©s
â  âââ Ă©rtĂ©kek
â  âââ backend.yaml
â  âââ postgres.yaml
+ âââ kiadĂĄsok
+ â  âââ backend.yaml
+ â  âââ postgres.yaml
âââ helmfile.yaml
helmfile.yaml
környezetek:
fejlesztés:
értékek:
- chartok:
verziĂłk:
backend: 1.1.0
- alkalmazĂĄsok:
- postgres
- backend
termelés:
értékek:
- chartok:
verziĂłk:
backend: 1.0.5
- alkalmazĂĄsok:
- backend
- kiadĂĄsok:
- - név: postgres
- cĂmkĂ©k:
- alkalmazĂĄs: postgres
- vĂĄrakozĂĄs: igaz
- chart: stabil/postgresql
- verziĂł: 8.4.0
- értékek:
- - környezetek/{{ .Environment.Name }}/értékek/postgres.yaml
- - név: backend
- cĂmkĂ©k:
- alkalmazĂĄs: backend
- vĂĄrakozĂĄs: igaz
- chart: privĂĄt-helm-repo/backend
- verziĂł: {{ .Values.chartok.verziĂłk.backend }}
- szĂŒksĂ©gek:
- - postgres
- értékek:
- - környezetek/{{ .Environment.Name }}/értékek/backend.yaml
+ ---
+ alapok:
+ {{- range .Values.alapok }}
+ - kiadĂĄsok/{{ . }}.yaml
+ {{- end }}kiadĂĄsok/postgres.yaml
kiadĂĄsok:
- név: postgres
cĂmkĂ©k:
alkalmazĂĄs: postgres
vĂĄrakozĂĄs: igaz
chart: stabil/postgresql
verziĂł: 8.4.0
értékek:
- környezetek/{{ .Environment.Name }}/értékek/postgres.yamlkiadåsok/backend.yaml
kiadĂĄsok:
- név: backend
cĂmkĂ©k:
alkalmazĂĄs: backend
vĂĄrakozĂĄs: igaz
chart: privĂĄt-helm-repo/backend
verziĂł: {{ .Values.chartok.verziĂłk.backend }}
szĂŒksĂ©gek:
- postgres
értékek:
- környezetek/{{ .Environment.Name }}/értékek/backend.yamlMegjegyzés
HasznĂĄlat közben alapok: szĂŒksĂ©ges a yaml elvĂĄlasztĂł kötelezĆ hasznĂĄlata ---, hogy a kiadĂĄsok (Ă©s a többi rĂ©sz, mint pĂ©ldĂĄul a helmDefaults) sablonosĂthatĂłk legyenek az környezetekbĆl szĂĄrmazĂł Ă©rtĂ©kekkel
Ebben az esetben a postgres kiadĂĄs mĂ©g a termelĂ©si leĂrĂĄsba sem kerĂŒl bele. Nagyon kĂ©nyelmes!
FelĂŒldefiniĂĄlhatĂł globĂĄlis Ă©rtĂ©kek a kiadĂĄsokhoz
TermĂ©szetesen nagyszerƱ, hogy minden környezethez megadhatjuk a helm chartok Ă©rtĂ©keit, de mi van, ha több környezet van leĂrva, Ă©s pĂ©ldĂĄul ugyanazt szeretnĂ©nk beĂĄllĂtani mindegyikhez affinity, de nem akarjuk alapĂ©rtelmezetten beĂĄllĂtani magukban a chartokban, amelyek a repĂłkban vannak tĂĄrolva.
Ebben az esetben minden kiadĂĄsnĂĄl megadhatnĂĄnk 2 fĂĄjlt az Ă©rtĂ©kekkel: az elsĆt az alapĂ©rtelmezett Ă©rtĂ©kekkel, amelyek a chart Ă©rtĂ©keit hatĂĄrozzĂĄk meg, a mĂĄsodik pedig a környezeti Ă©rtĂ©kekkel, ami viszont felĂŒl fogja Ărni az alapĂ©rtelmezetteket.
.
âââ 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.yamlkiadĂĄsok/backend.yaml
releases:
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
version: {{ .Values.charts.versions.backend }}
needs:
- postgres
values:
+ - envs/default/values/backend.yaml
- envs/{{ .Environment.Name }}/values/backend.yamlenvs/default/values/backend.yaml
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"Globålis értékek definiålåsa a helm chartok szåmåra minden kiadås környezet szintjén
TegyĂŒk fel, hogy több kiadĂĄsnĂĄl több ingress-t hozunk lĂ©tre - minden chart esetĂ©ben manuĂĄlisan definiĂĄlhatnĂĄnk hosts:, de mivel az esetĂŒnkben a domain ugyanaz, miĂ©rt ne tehetnĂ©nk ezt egy globĂĄlis vĂĄltozĂłba, Ă©s egyszerƱen behelyettesĂthetnĂ©nk az Ă©rtĂ©kĂ©t a chartokba? Ehhez azoknak a values fĂĄjloknak, amelyeket paramĂ©terezni szeretnĂ©nk, .gotmpl kiterjesztĂ©sƱeknek kell lenniĂŒk .gotmpl, hogy a helmfile tudja, hogy le kell futtatnia a sablonkezelĆt.
.
âââ 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
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
+ - global:
+ ingressDomain: k8s.devel.domain
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
+ - global:
+ ingressDomain: production.domain
---
bases:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}envs/default/values/backend.yaml.gotmpl
ingress:
enabled: true
paths:
- /api
hosts:
- {{ .Values.global.ingressDomain }}envs/default/values/postgres.yaml.gotmpl
ingress:
enabled: true
paths:
- /
hosts:
- postgres.{{ .Values.global.ingressDomain }}Megjegyzés
NyilvĂĄnvalĂł, hogy a postgres chartban talĂĄlhatĂł ingress egy rendkĂvĂŒl kĂ©tsĂ©ges dolog, ezĂ©rt ezt az ĂrĂĄsban csupĂĄn egy szfĂ©rikus pĂ©ldakĂ©nt emlĂtjĂŒk meg a vĂĄkuumban, Ă©s nem azĂ©rt, hogy Ășj kiadĂĄst vezessĂŒnk be a cikkbe, csupĂĄn az ingress leĂrĂĄsa vĂ©gett.
Titkos Ă©rtĂ©kek (secrets) behelyettesĂtĂ©se környezeti Ă©rtĂ©kekbĆl.
A fent emlĂtett pĂ©lda alapjĂĄn titkosĂtott Ă©rtĂ©keket is be lehet helyettesĂteni. Ă©rtĂ©kekkel. Ahelyett, hogy minden egyes kiadĂĄshoz lĂ©trehoznĂĄnk egy kĂŒlön secrets fĂĄjlt, amelyben a chart titkosĂtott Ă©rtĂ©keit definiĂĄljuk, egyszerƱen megadhatjuk a release default.yaml.gotmpl fĂĄjljĂĄban azokat az Ă©rtĂ©keket, amelyek környezeti szinten definiĂĄlt vĂĄltozĂłkbĂłl szĂĄrmaznak. A nem titkos Ă©rtĂ©keket nyugodtan felĂŒlĂrhatjuk a konkrĂ©t környezetben lĂ©vĆ release Ă©rtĂ©keiben.
.
âââ 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
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
- global:
ingressDomain: k8s.devel.domain
+ secrets:
+ - envs/devel/secrets.yaml
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
- global:
ingressDomain: production.domain
+ secrets:
+ - envs/production/secrets.yaml
---
bases:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}envs/devel/secrets.yaml
secrets:
elastic:
password: ENC[AES256_GCM,data:hjCB,iv:Z1P6/6xBJgJoKLJ0UUVfqZ80o4L84jvZfM+uH9gBelc=,tag:dGqQlCZnLdRAGoJSj63rBQ==,type:int]
...envs/production/secrets.yaml
secrets:
elastic:
password: ENC[AES256_GCM,data:ZB/VpTFk8f0=,iv:EA//oT1Cb5wNFigTDOz3nA80qD9UwTjK5cpUwLnEXjs=,tag:hMdIUaqLRA8zuFBd82bz6A==,type:str]
...envs/default/values/backend.yaml.gotmpl
elasticsearch:
host: elasticsearch
port: 9200
password: {{ .Values | getOrNil "secrets.elastic.password" | default "password" }}envs/devel/values/backend.yaml
elasticsearch:
host: elastic-0.devel.domainenvs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domainMegjegyzés
EgyĂ©bkĂ©nt, getOrNil â egy speciĂĄlis fĂŒggvĂ©ny a go sablonokhoz helmfile-ben, amely, mĂ©g ha .Values.secrets nem lĂ©tezne, nem dob hibĂĄt, hanem lehetĆvĂ© teszi, hogy a fĂŒggvĂ©nnyel alapĂ©rtelmezett egy alapĂ©rtelmezett Ă©rtĂ©ket adjunk meg.
ZĂĄrĂĄs
A leĂrt dolgok meglehetĆsen nyilvĂĄnvalĂłnak tƱnnek, de az informĂĄciĂłk a helmfile segĂtsĂ©gĂ©vel törtĂ©nĆ több környezetbe törtĂ©nĆ telepĂtĂ©s kĂ©nyelmes leĂrĂĄsĂĄhoz nagyon szƱkösek, Ă©s Ă©n szeretem az IaC (Infrastructure-as-Code) megoldĂĄsokat, ezĂ©rt szeretnĂ©m, ha vilĂĄgos leĂrĂĄs lenne a telepĂtĂ©si ĂĄllapotrĂłl.
ĂsszegzĂ©skĂ©nt szeretnĂ©m hozzĂĄtenni, hogy a default környezeti vĂĄltozĂłk paramĂ©terezhetĆek az operĂĄciĂłs rendszer környezeti vĂĄltozĂłival, amelyrĆl a telepĂtĂ©s indĂtĂĄsa törtĂ©nik, Ăgy dinamikus környezeteket hozhatunk lĂ©tre.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}ForrĂĄs: habr.com
