â mĂ€his helm'i jaoks , mis vĂ”imaldab ĂŒhes kohas kirjeldada mitut helm'i vĂ€ljaannet, neid mitme keskkonna jaoks parametreerida ning mÀÀrata nende juurutamise jĂ€rjekorra.
Helmfileâist ja selle kasutamise nĂ€idetest saab lugeda ja .
Tutvume vĂ€hem ilmsete viisidega, kuidas vĂ€ljaandeid helmfileâis kirjeldada
Oletame, et meil on hunnik helm-kaarte (nÀiteks postgres ja mÔni backend rakendus) ja mitmed keskkonnad (mitmed kubernetes klastrid, mitmed namespace'id vÔi mÔlemad). VÔtame helmfile'i, loeme dokumentatsiooni ja hakkame kirjeldama meie keskkondi ja vÀljaandeid:
.
âââ envs
â âââ devel
â â âââ values
â â âââ backend.yaml
â â âââ postgres.yaml
â âââ production
â âââ values
â âââ backend.yaml
â âââ postgres.yaml
âââ helmfile.yamlhelmfile.yaml
keskkonnad:
devel:
production:
vÀljaanded:
- nimi: postgres
sildid:
rakendus: postgres
oota: tÔene
kaart: stable/postgresql
versioon: 8.4.0
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/postgres.yaml
- nimi: backend
sildid:
rakendus: backend
oota: tÔene
kaart: private-helm-repo/backend
versioon: 1.0.5
vajab:
- postgres
vÀÀrtused:
- envs/{{ .Environment.Name }}/values/backend.yamlMeil on 2 keskkonda: devel, production â igas on oma vÀÀrtused helm'i kaartide vĂ€ljaannete jaoks. Me hakkame neid juurutama nii:
helmfile -n -e applyErinevad versioonid helm'i kaartidest erinevates keskkondades
Mis saab siis, kui meil on vaja vÀlja lasta erinevaid backend-versioone erinevates keskkondades? Kuidas parametreerida vÀljaande versioon? Siin tulevad appi keskkonna vÀÀrtused, mis on saadaval lÀbi {{ .Values }}
helmfile.yaml
keskkonnad:
devel:
+ vÀÀrtused:
+ - kaardid:
+ versioonid:
+ backend: 1.1.0
production:
+ vÀÀrtused:
+ - kaardid:
+ versioonid:
+ backend: 1.0.5
...
- nimi: backend
sildid:
rakendus: backend
oota: tÔene
kaart: private-helm-repo/backend
- versioon: 1.0.5
+ versioon: {{ .Values.charts.versions.backend }}
...Erinev rakenduste komplekt erinevates keskkondades
SuurepÀrane, kuid mis siis, kui me ei pea production vÀlja laskma postgres, sest me teame, et andmebaasi pole vaja k8s-sse panna ja meil on tootmises suurepÀrane eraldi postgres klaster? Selle probleemi lahendamiseks on meil sildid (labels)
helmfile -n -e devel apply
helmfile -n -e production -l app=backend applySee, but personally I prefer to describe which applications to deploy in the environment not through launch arguments, but in the description of the environments themselves. What to do? You can put the release descriptions in a separate folder, create a list of required releases in the environment description, and 'attach' only the needed releases, ignoring the rest.
.
âââ 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.yamlreleases/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.yamlNote
Kasutades bases: it is necessary to use the YAML separator ---, to allow templating releases (and other parts, such as helmDefaults) with values from environments
In this case, the postgres release won't even be included in the production description. Very convenient!
Overridable global values for releases
Of course, it is great that you can specify values for helm charts for each environment, but what if we have several environments described, and we want to set the same for all, for example affinity, but we do not want to configure it as default in the charts themselves that are stored in the repositories.
In this case, we could specify 2 value files for each release: the first with default values that will determine the chart's values, and the second with values for the environment, which will in turn override the defaults.
.
âââ 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
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"MÀÀratlege globaalsete vÀÀrtuste helmi kaardid kÔigi vÀljalaskete tasemel
Eeldame, et meil luuakse mitmes vĂ€ljalaskes mitu ingressi â saaksime need iga kaardi jaoks kĂ€sitsi mÀÀratleda. hosts:, kuid meie juhul on domeen sama, miks mitte viia see globaalsesse muutuja ja lihtsalt sisestada selle vÀÀrtus kaartidesse? Selleks peavad need values-failid, mida soovime parametriseerida, olema laiendiga .gotmpl, et helmfile teaks, et see tuleb martid lĂ€bi ĆĄablonisĂŒsteemi.
.
âââ 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 }}Note
Ilmselt on ingress postgres'i chart'is midagi ÀÀrmiselt kahtlast, seetÔttu on artikkel selle esitanud lihtsalt kui sfÀÀrilist nÀidet vaakumis ja selleks, et mitte tuua sisse mingit uut versiooni lihtsalt ingress'i kirjeldamiseks.
Salajaste vÀÀrtuste (secrets) sisestamine keskkonna vÀÀrtustest.
Sarnaselt eelnevale nĂ€iteks on vĂ”imalik sisestada ka krĂŒptitud vÀÀrtusi, kasutades vÀÀrtusi. Selle asemel, et iga vĂ€ljaande jaoks luua oma salajaste (secrets) fail, milles mÀÀratleda ĆĄifreeritud vÀÀrtused chart'i jaoks, saame lihtsalt mÀÀrata vĂ€ljaande default.yaml.gotmpl failis vÀÀrtused, mis vĂ”etakse keskkonna tasandil mÀÀratud muutujatest. Ja vÀÀrtused, mida ei pea kellegi eest varjama, vĂ”ib juba rahulikult ĂŒle kirjutada vĂ€ljaande vÀÀrtustes konkreetses keskkonnas.
.
âââ 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
+ salajased:
+ - envs/devel/secrets.yaml
production:
vÀÀrtused:
- kaardid:
versioonid:
backend: 1.0.5
- rakendused:
- backend
- globaalne:
ingressDomain: production.domain
+ salajased:
+ - envs/production/secrets.yaml
---
alused:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}envs/devel/secrets.yaml
salajased:
elastic:
parool: ENC[AES256_GCM,data:hjCB,iv:Z1P6/6xBJgJoKLJ0UUVfqZ80o4L84jvZfM+uH9gBelc=,tag:dGqQlCZnLdRAGoJSj63rBQ==,type:int]
...envs/production/secrets.yaml
salajased:
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 "secrets.elastic.password" | default "parool" }}envs/devel/values/backend.yaml
elasticsearch:
host: elastic-0.devel.domainenvs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domainNote
Muide, getOrNil â spetsiaalne funktsioon go mallide jaoks helmfile'is, mis isegi juhul, kui .Values.secrets ei eksisteeri, ei tekita viga, vaid vĂ”imaldab tulemuseks koos funktsiooniga SeejĂ€rel kĂ€ivitame exec kĂ€su ja ootame 5000 sekundit, et jĂ€tkata jĂ€lgimist: mĂŒĂŒda vaikimisi vÀÀrtust.
KokkuvÔte
Kirjeldatud asjad tunduvad ĂŒsna ilmsed, kuid teave helmfile abil mitme keskkonna juurutamise mugavast kirjeldusest on vĂ€ga puudulik. Mulle meeldib IaC (Infrastructure-as-Code) ja soovin omada selget juurutamise oleku kirjeldust.
KokkuvĂ”tteks tahan lisada, et vaikekeskkonna muutujad saab omakorda parameteriseerida operatsioonisĂŒsteemi keskkonna muutujatega, millega juurutamine toimub, ja seelĂ€bi luua dĂŒnaamilisi keskkondi.
helmfile.yaml
keskkonnad:
vaikimisi:
vÀÀrtused:
- globaalne:
klasterDomeen: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
sisenemisDomeen: {{ env "INGRESS_DOMAIN" }}Allikas: habr.com
