JÅ«s varat lasÄ«t par paÅ”u helmfile un tÄs izmantoÅ”anas piemÄriem
MÄs iepazÄ«simies ar nepÄrprotamiem veidiem, kÄ aprakstÄ«t izlaidumus helmfile
PieÅemsim, ka mums ir stÅ«res diagrammu pakotne (piemÄram, Postgres un dažas aizmugursistÄmas lietojumprogrammas) un vairÄkas vides (vairÄkas kubernetes kopas, vairÄkas nosaukumvietas vai vairÄkas abas). MÄs paÅemam helmfile, izlasÄm dokumentÄciju un sÄkam aprakstÄ«t mÅ«su vidi un izlaidumus:
.
āāā envs
ā āāā devel
ā ā āāā values
ā ā āāā backend.yaml
ā ā āāā postgres.yaml
ā āāā production
ā āāā values
ā āāā backend.yaml
ā āāā postgres.yaml
āāā helmfile.yaml
helmfile.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.yaml
MÄs nonÄcÄm pie 2 vides: attÄ«stÄ«t, ražoÅ”ana ā katrs satur savas vÄrtÄ«bas stÅ«res atbrÄ«voÅ”anas diagrammÄm. MÄs viÅiem izvietosim Å”Ädi:
helmfile -n <namespace> -e <env> apply
DažÄdas stÅ«res diagrammu versijas dažÄdÄs vidÄs
Ko darÄ«t, ja mums ir jÄizlaiž dažÄdas aizmugursistÄmas versijas dažÄdÄs vidÄs? KÄ parametrizÄt izlaiduma versiju? Vides vÄrtÄ«bas, kas pieejamas caur {{ .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 }}
...
DažÄdas lietojumprogrammas dažÄdÄs vidÄs
Lieliski, bet ja nu mums tas nav vajadzīgs production
izvÄrst postgres, jo mÄs zinÄm, ka mums nav jÄiespiež datubÄze k8s, un mums ir pÄrdoÅ”anai brÄ«niŔķīgs atseviŔķs postgres klasteris? Lai atrisinÄtu Å”o problÄmu, mums ir etiÄ·etes
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Tas ir lieliski, bet man personÄ«gi labÄk patÄ«k aprakstÄ«t, kuras lietojumprogrammas izvietot vidÄ, nevis izmantojot palaiÅ”anas argumentus, bet gan paÅ”u vidi aprakstÄ. Ko darÄ«t? Izlaidumu aprakstus var ievietot atseviÅ”Ä·Ä mapÄ, vides aprakstÄ izveidot nepiecieÅ”amo izlaidumu sarakstu un āpaÅemtā tikai nepiecieÅ”amos laidienus, pÄrÄjos ignorÄjot
.
āāā 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
releases:
- name: postgres
labels:
app: postgres
wait: true
chart: stable/postgresql
version: 8.4.0
values:
- envs/{{ .Environment.Name }}/values/postgres.yaml
releases/backend.yaml
releases:
- 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
Piezīme
Lietojot bases:
ir nepiecieÅ”ams izmantot yaml atdalÄ«tÄju ---
, lai jÅ«s varÄtu veidot laidienus (un citas daļas, piemÄram, helmDefaults) ar vÄrtÄ«bÄm no vides
Å ajÄ gadÄ«jumÄ postgres izlaidums pat netiks iekļauts ražoÅ”anas aprakstÄ. Ä»oti Ärti!
IgnorÄjamas globÄlÄs vÄrtÄ«bas laidieniem
Protams, ir lieliski, ka varat iestatÄ«t vÄrtÄ«bas stÅ«res diagrammÄm katrai videi, bet ja mums ir aprakstÄ«tas vairÄkas vides un mÄs vÄlamies, piemÄram, iestatÄ«t vienÄdas visas affinity
, taÄu mÄs nevÄlamies to pÄc noklusÄjuma konfigurÄt paÅ”Äs diagrammÄs, kas tiek glabÄtas rÄceÅos.
Å ajÄ gadÄ«jumÄ katram laidienam mÄs varÄtu norÄdÄ«t 2 failus ar vÄrtÄ«bÄm: pirmais ar noklusÄjuma vÄrtÄ«bÄm, kas noteiks paÅ”as diagrammas vÄrtÄ«bas, un otrais ar vÄrtÄ«bÄm videi, kas savukÄrt ignorÄs noklusÄjuma.
.
āāā 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.yaml
releases/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.yaml
envs/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"
Visu izlaidumu globÄlo vÄrtÄ«bu noteikÅ”ana vadÄ«bas diagrammÄm vides lÄ«menÄ«
PieÅemsim, ka mÄs izveidojam vairÄkas ieejas vairÄkos laidienos ā mÄs varÄtu manuÄli definÄt katrai diagrammai hosts:
, bet mÅ«su gadÄ«jumÄ domÄns ir tas pats, tad kÄpÄc gan neievietot to kÄdÄ globÄlÄ mainÄ«gajÄ un vienkÄrÅ”i aizstÄt tÄ vÄrtÄ«bu diagrammÄs? Lai to izdarÄ«tu, tiem failiem ar vÄrtÄ«bÄm, kuras mÄs vÄlamies parametrizÄt, ir jÄbÅ«t paplaÅ”inÄjumam .gotmpl
, lai helmfile zinÄtu, ka tas ir jÄpalaiž caur veidnes dzinÄju.
.
āāā 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.yaml
helmfile.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 }}
Piezīme
AcÄ«mredzot ingress postgres diagrammÄ ir kaut kas ÄrkÄrtÄ«gi apÅ”aubÄms, tÄpÄc Å”is raksts ir dots vienkÄrÅ”i kÄ sfÄrisks piemÄrs vakuumÄ un lai neieviestu rakstÄ kÄdu jaunu izlaidumu tikai ingresa apraksta dÄļ
NoslÄpumu aizstÄÅ”ana ar vides vÄrtÄ«bÄm
PÄc analoÄ£ijas ar iepriekÅ” minÄto piemÄru, jÅ«s varat aizstÄt Å”ifrÄtus, izmantojot
.
āāā 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.yaml
helmfile.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.domain
envs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domain
Piezīme
Starp citu, getOrNil
- Ä«paÅ”a funkcija go veidnÄm helmfile, kas, pat ja .Values.secrets
nepastÄvÄs, neizmetÄ«s kļūdu, bet atļaus rezultÄtu, izmantojot funkciju default
aizstÄt noklusÄjuma vÄrtÄ«bu
SecinÄjums
AprakstÄ«tÄs lietas Ŕķiet diezgan acÄ«mredzamas, taÄu informÄcijas par Ärtu izvietoÅ”anas aprakstu vairÄkÄs vidÄs, izmantojot helmfile, ir ļoti maz, un man patÄ«k IaC (Infrastructure-as-Code) un vÄlos iegÅ«t skaidru izvietoÅ”anas stÄvokļa aprakstu.
NobeigumÄ vÄlos piebilst, ka noklusÄjuma vides mainÄ«gos savukÄrt var parametrizÄt ar noteikta skrÄjÄja OS vides mainÄ«gajiem, no kura tiks palaista izvietoÅ”ana, un tÄdÄjÄdi iegÅ«t dinamiskas vides.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Avots: www.habr.com