Þú getur lesið um Helmfile sjálft og dæmi um notkun þess í
Við munum kynnast óljósum leiðum til að lýsa útgáfum í helmfile
Segjum að við séum með pakka af stýrikortum (til dæmis, segjum postgres og eitthvað bakendaforrit) og nokkur umhverfi (nokkrir kubernetes þyrpingar, nokkur nafnrými eða nokkur af hvoru tveggja). Við tökum við stýrið, lesum skjölin og byrjum að lýsa umhverfi okkar og útgáfum:
.
├── 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
Við enduðum með 2 umhverfi: þróa, framleiðslu - hver inniheldur sín eigin gildi fyrir útgáfukortin fyrir stýrið. Við munum dreifa til þeirra svona:
helmfile -n <namespace> -e <env> apply
Mismunandi útgáfur af stýrikortum í mismunandi umhverfi
Hvað ef við þurfum að rúlla út mismunandi útgáfur af bakendanum í mismunandi umhverfi? Hvernig á að stilla útgáfu útgáfunnar? Umhverfisverðmætin í boði í gegnum {{ .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 }}
...
Mismunandi sett af forritum í mismunandi umhverfi
Frábært, en hvað ef við þurfum þess ekki production
rúlla út postgres, vegna þess að við vitum að við þurfum ekki að ýta gagnagrunninum inn í k8s og til sölu höfum við dásamlega sérstakan postgres þyrping? Til að leysa þetta vandamál höfum við merki
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Þetta er frábært, en persónulega kýs ég að lýsa hvaða forritum á að dreifa í umhverfinu, ekki með því að nota upphafsrök, heldur í lýsingunni á umhverfinu sjálfu. Hvað skal gera? Þú getur sett útgáfulýsingarnar í sérstakri möppu, búið til lista yfir nauðsynlegar útgáfur í umhverfislýsingunni og „sótt“ aðeins nauðsynlegar útgáfur, hunsað restina
.
├── 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
Seðillinn
Þegar á bases:
það er nauðsynlegt að nota yaml skilju ---
, svo að þú getir sniðmátútgáfur (og aðrir hlutar, svo sem helmDefaults) með gildum úr umhverfi
Í þessu tilviki mun postgres útgáfan ekki einu sinni vera með í framleiðslulýsingunni. Mjög þægilegt!
Óviðráðanleg alþjóðleg gildi fyrir útgáfur
Auðvitað er frábært að þú getur stillt gildi fyrir stýrikort fyrir hvert umhverfi, en hvað ef við höfum lýst nokkrum umhverfi og við viljum til dæmis setja það sama fyrir öll affinity
, en við viljum ekki stilla það sjálfgefið í töflunum sjálfum, sem eru geymdar í rófum.
Í þessu tilviki gætum við fyrir hverja útgáfu tilgreint 2 skrár með gildum: sú fyrri með sjálfgefnum gildum, sem mun ákvarða gildi töflunnar sjálfs, og sú seinni með gildum fyrir umhverfið, sem aftur mun hnekkja sjálfgefna.
.
├── 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"
Skilgreina alþjóðleg gildi fyrir stýrikort yfir allar útgáfur á umhverfisstigi
Segjum að við búum til nokkra innkomu í nokkrum útgáfum - við gætum skilgreint handvirkt fyrir hvert graf hosts:
, en í okkar tilviki er lénið það sama, svo hvers vegna ekki að setja það í einhverja alþjóðlega breytu og einfaldlega setja gildi hennar í töflurnar? Til að gera þetta verða þessar skrár með gildum sem við viljum breyta breytu að hafa viðbótina .gotmpl
, svo að helmfile viti að það þarf að keyra hana í gegnum sniðmátvélina.
.
├── 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 }}
Seðillinn
Augljóslega er innrás í postgres töfluna eitthvað ákaflega vafasamt, svo þessi grein er einfaldlega gefin sem kúlulaga dæmi í tómarúmi og til að kynna ekki nýja útgáfu í greininni bara til að lýsa inngöngu.
Að skipta út leyndarmálum frá umhverfisgildum
Á hliðstæðan hátt við dæmið hér að ofan geturðu skipt út dulkóðuðum með því að nota
.
├── 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
Seðillinn
Tilviljun, getOrNil
- sérstök aðgerð fyrir fara sniðmát í helmfile, sem, jafnvel þótt .Values.secrets
mun ekki vera til, mun ekki kasta villu, en mun leyfa niðurstöðu með því að nota aðgerðina default
staðgengill sjálfgefið gildi
Ályktun
Hlutirnir sem lýst er virðast nokkuð augljósir, en upplýsingar um þægilega lýsingu á dreifingu í nokkur umhverfi með því að nota helmfile eru mjög af skornum skammti og ég elska IaC (Infrastructure-as-Code) og vil hafa skýra lýsingu á dreifingarstöðunni.
Að endingu vil ég bæta því við að breyturnar fyrir sjálfgefið umhverfi er aftur á móti hægt að breyta með umhverfisbreytum stýrikerfis ákveðins hlaupara sem dreifingin verður sett af og fá þannig kraftmikið umhverfi
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Heimild: www.habr.com