Helmfile berari buruz eta erabileraren adibideak irakur ditzakezu
Argiak ez diren moduak ezagutuko ditugu helmfile-ko bertsioak deskribatzeko
Demagun helm diagramen pakete bat (adibidez, demagun postgres eta backend aplikazioren bat) eta hainbat ingurune (kubernetes multzo batzuk, izen-espazio batzuk edo bietako batzuk) ditugula. Helmfile hartu, dokumentazioa irakurri eta gure inguruneak eta bertsioak deskribatzen hasten gara:
.
├── 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
2 ingurunerekin amaitu genuen: garatu, ekoizpen - bakoitzak bere balioak ditu lema-oharra zerrendetarako. Horrela zabalduko diegu:
helmfile -n <namespace> -e <env> apply
Helm-karren bertsio desberdinak ingurune desberdinetan
Zer gertatzen da backendaren bertsio desberdinak ingurune ezberdinetara zabaldu behar baditugu? Nola parametrizatu oharra bertsioa? Eskuragarri diren ingurumen-balioak {{ .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 }}
...
Aplikazio multzo desberdinak ingurune ezberdinetan
Bikaina, baina zer behar ez badugu production
zabaldu postgres, badakigulako ez dugula datu-basea k8etara bultzatu behar eta salgai postgres kluster zoragarri bat dugula? Arazo hau konpontzeko etiketak ditugu
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Hau bikaina da, baina pertsonalki nahiago dut deskribatu zein aplikazio inplementatu ingurunean abiarazteko argumentuak erabili gabe, inguruneen deskribapenean baizik. Zer egin? Argitalpenen deskribapenak karpeta bereizi batean jar ditzakezu, inguruneko deskribapenean beharrezko bertsioen zerrenda sortu eta beharrezko bertsioak soilik "jaso" ditzakezu, gainerakoak alde batera utzita.
.
├── 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
Oharra
Noiz erabiliz bases:
beharrezkoa da yaml bereizlea erabiltzea ---
, bertsioen txantiloiak (eta beste atal batzuk, adibidez, helmDefaults) inguruneetako balioekin
Kasu honetan, postgres bertsioa ez da ekoizpenerako deskribapenean ere sartuko. Oso eroso!
Argitalpenetarako balio global baliogabeak
Jakina, bikaina da ingurune bakoitzerako helm-tauletarako balioak ezar ditzakezula, baina zer gertatzen da deskribatutako hainbat ingurune baditugu eta, adibidez, guztientzako berdina ezarri nahi badugu. affinity
, baina ez dugu lehenespenez konfiguratu nahi diagrametan bertan, arbietan gordetzen direnak.
Kasu honetan, bertsio bakoitzeko 2 fitxategi zehaztu ditzakegu balioekin: lehenengoa balio lehenetsiekin, grafikoaren beraren balioak zehaztuko dituena, eta bigarrena ingurunerako balioekin, zeinak aldi berean gainidatziko dituena. lehenetsitakoak.
.
├── 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"
Ingurune mailan kaleratze guztien lema-zerrendetarako balio globalak zehaztea
Demagun hainbat sarrera sortzen ditugula hainbat bertsiotan - eskuz defini genitzake diagrama bakoitzeko hosts:
, baina gure kasuan domeinua berdina da, beraz, zergatik ez jarri aldagai global batean eta besterik gabe bere balioa zerrendetan ordezkatu? Horretarako, parametrizatu nahi ditugun balioak dituzten fitxategiek luzapena izan beharko dute .gotmpl
, helmfile txantiloi-motorretik exekutatu behar dela jakin dezan.
.
├── 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 }}
Oharra
Jakina, postgres diagraman sarrera oso zalantzazkoa da, beraz, artikulu hau hutsean adibide esferiko gisa ematen da eta artikuluan bertsio berririk ez sartzeko sarrera deskribatzeko soilik.
Ingurumen-balioetatik sekretuak ordezkatzea
Goiko adibidearekin analogia eginez, enkriptatutakoak ordezkatu ditzakezu erabiliz
.
├── 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
Oharra
Bide batez, getOrNil
- Helmfileko go txantiloietarako funtzio berezi bat, nahiz eta .Values.secrets
ez da existituko, ez du errorerik botako, baina emaitza funtzioa erabiliz baimenduko du default
ordezko balio lehenetsia
Ondorioa
Deskribatutako gauzak nahiko argiak dirudite, baina helmfile erabiliz hainbat ingurunetara hedatzearen deskribapen egoki bati buruzko informazioa oso urria da, eta IaC (Infrastructure-as-Code) maite dut eta inplementazio egoeraren deskribapen argia izan nahi dut.
Amaitzeko, gehitu nahi dut ingurune lehenetsirako aldagaiak, aldi berean, ezarpena abiaraziko den lasterkari jakin baten OSaren ingurune-aldagaiekin parametriza daitezkeela, eta horrela ingurune dinamikoak lor daitezke.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Iturria: www.habr.com