Saate lugeda helmfile'i enda ja selle kasutamise näidete kohta
Tutvume ebaselgete viisidega väljaannete kirjeldamiseks helmfile'is
Oletame, et meil on pakk tüürdiagramme (näiteks oletame, et postgres ja mõni taustarakendus) ja mitu keskkonda (mitu kubernetese klastrit, mitu nimeruumi või mitu mõlemat). Võtame tüürifaili, loeme dokumentatsiooni ja hakkame kirjeldama oma keskkondi ja väljaandeid:
.
├── 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
Saime 2 keskkonda: arenema, tootmine — igaüks sisaldab oma väärtused rooli vabastamise graafikute jaoks. Me juurutame neile järgmiselt:
helmfile -n <namespace> -e <env> apply
Erinevad tüürikaartide versioonid erinevates keskkondades
Mis siis, kui peame juurutama taustaprogrammi erinevad versioonid erinevatesse keskkondadesse? Kuidas väljalaskeversiooni parameetrit muuta? Keskkonnaväärtused saadaval läbi {{ .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 }}
...
Erinevad rakendused erinevates keskkondades
Suurepärane, aga mis siis, kui meil pole seda vaja production
juurutada postgres, sest me teame, et meil pole vaja andmebaasi k8-sse suruda ja meil on müügiks suurepärane eraldi postgresi klaster? Selle probleemi lahendamiseks on meil sildid
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
See on suurepärane, kuid isiklikult eelistan kirjeldada, milliseid rakendusi keskkonnas juurutada, mitte käivitamisargumente kasutades, vaid keskkondade endi kirjelduses. Mida teha? Väljalasete kirjeldused saab paigutada eraldi kausta, koostada keskkonnakirjelduses vajalikest väljalasetest nimekiri ja “korjata” üles vaid vajalikud väljalasked, ülejäänud ignoreerides
.
├── 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
Märkus
Kui kasutate bases:
on vaja kasutada yamli eraldajat ---
, et saaksite väljalaseid (ja muid osi, näiteks helmDefaults) koostada keskkondade väärtustega
Sel juhul ei lisata postgresi väljalaset isegi tootmise kirjeldusse. Väga mugav!
Väljaannete alistatavad globaalsed väärtused
Muidugi on tore, et saate määrata iga keskkonna jaoks tüürdiagrammidele väärtused, aga mis siis, kui meil on kirjeldatud mitut keskkonda ja me tahame näiteks määrata kõigile samad affinity
, kuid me ei taha seda vaikimisi konfigureerida graafikutes endas, mis on salvestatud naeris.
Sel juhul saame iga versiooni jaoks määrata 2 väärtustega faili: esimene vaikeväärtustega, mis määrab diagrammi enda väärtused, ja teine keskkonna väärtustega, mis omakorda alistavad 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.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"
Globaalsete väärtuste määratlemine kõigi keskkonnatasemel väljaannete tüürdiagrammides
Oletame, et loome mitmes väljalaskes mitu sisendit – saame iga diagrammi jaoks käsitsi määratleda hosts:
, kuid meie puhul on domeen sama, miks mitte panna see mõnda globaalsesse muutujasse ja lihtsalt selle väärtus diagrammidesse asendada? Selleks peavad need väärtustega failid, mida tahame parameetristada, omama laiendit .gotmpl
, et helmfile teaks, et seda tuleb käivitada mallimootori 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.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 }}
Märkus
Ilmselgelt on postgresi graafikus ingress midagi äärmiselt kahtlast, nii et see artikkel on antud lihtsalt sfäärilise näitena vaakumis ja selleks, et mitte tuua artiklisse mõnda uut väljaannet lihtsalt ingressi kirjeldamise huvides
Saladuste asendamine keskkonnaväärtustega
Analoogiliselt ülaltoodud näitega saate krüpteeritud asendada kasutades
.
├── 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
Märkus
Muide, getOrNil
- spetsiaalne funktsioon helmfile'i go mallide jaoks, mis isegi siis, kui .Values.secrets
ei eksisteeri, ei anna tõrget, vaid lubab funktsiooni abil tulemuse default
asendusvaikeväärtus
Järeldus
Kirjeldatud asjad tunduvad üsna ilmsed, kuid teavet mitmes keskkonnas helmfile'i abil juurutamise mugava kirjelduse kohta on väga vähe ja ma armastan IaC-d (Infrastructure-as-Code) ja tahan juurutamise oleku selget kirjeldust.
Kokkuvõtteks tahaksin lisada, et vaikekeskkonna muutujaid saab omakorda parameetristada teatud jooksja OS-i keskkonnamuutujatega, millelt juurutus käivitatakse, ja seeläbi saada dünaamilisi keskkondi.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Allikas: www.habr.com