Tista 'taqra dwar helmfile innifsu u eżempji tal-użu tiegħu fi
Se nkunu familjari ma 'modi mhux ovvji biex niddeskrivu r-rilaxxi f'helmfile
Ejja ngħidu li għandna pakkett ta 'charts tat-tmun (per eżempju, ejja ngħidu postgres u xi applikazzjoni backend) u diversi ambjenti (diversi clusters kubernetes, diversi namespaces, jew diversi mit-tnejn). Nieħdu l-helmfile, naqraw id-dokumentazzjoni u nibdew niddeskrivu l-ambjenti u r-rilaxxi tagħna:
.
├── 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
Spiċċajna b'2 ambjenti: jiżviluppaw, produzzjoni — kull wieħed fih il-valuri tiegħu stess għat-tabelli tar-rilaxx tat-tmun. Aħna ser niskjeraw lilhom hekk:
helmfile -n <namespace> -e <env> apply
Verżjonijiet differenti ta 'charts tat-tmun f'ambjenti differenti
X'jiġri jekk neħtieġu li noħorġu verżjonijiet differenti tal-backend għal ambjenti differenti? Kif tipparametrizza l-verżjoni tar-rilaxx? Il-valuri ambjentali disponibbli permezz {{ .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 }}
...
Sett differenti ta 'applikazzjonijiet f'ambjenti differenti
Kbira, imma x'jiġri jekk m'għandniex bżonn production
roll out postgres, għax nafu li m'għandniex bżonn nimbottaw id-database f'k8s u għall-bejgħ għandna cluster separat mill-isbaħ tal-postgres? Biex insolvu din il-problema għandna tikketti
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Dan huwa kbir, imma personalment nippreferi niddeskrivi liema applikazzjonijiet niskjeraw fl-ambjent ma jużawx argumenti ta 'tnedija, iżda fid-deskrizzjoni tal-ambjenti nfushom. X'tagħmel? Tista 'tpoġġi d-deskrizzjonijiet tar-rilaxx f'folder separat, toħloq lista tar-rilaxxi meħtieġa fid-deskrizzjoni tal-ambjent u "jiġbed" biss ir-rilaxxi meħtieġa, u tinjora l-bqija
.
├── 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
In-nota
Meta jintuża l- bases:
huwa meħtieġ li tuża separatur yaml ---
, sabiex tkun tista 'mudella rilaxxi (u partijiet oħra, bħal helmDefaults) b'valuri minn ambjenti
F'dan il-każ, ir-rilaxx ta 'postgres lanqas se jkun inkluż fid-deskrizzjoni għall-produzzjoni. Komdu ħafna!
Valuri globali li jistgħu jiġu annullati għar-rilaxxi
Naturalment, huwa kbir li tista 'tissettja valuri għal charts tat-tmun għal kull ambjent, imma x'jiġri jekk ikollna diversi ambjenti deskritti, u rridu, pereżempju, nissettjaw l-istess għal kulħadd affinity
, iżda ma rridux nikkonfigurawh awtomatikament fiċ-ċarts infushom, li huma maħżuna f'nevew.
F'dan il-każ, għal kull rilaxx nistgħu nispeċifikaw 2 fajls b'valuri: l-ewwel b'valuri awtomatiċi, li jiddeterminaw il-valuri taċ-ċart innifisha, u t-tieni b'valuri għall-ambjent, li mbagħad jegħlbu l- dawk default.
.
├── 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"
Id-definizzjoni tal-valuri globali għall-mapep tat-tmun tar-rilaxxi kollha fil-livell ambjentali
Ejja ngħidu li noħolqu diversi dħul f'diversi rilaxxi - nistgħu niddefinixxu manwalment għal kull chart hosts:
, iżda fil-każ tagħna d-dominju huwa l-istess, allura għaliex ma tpoġġihx f'xi varjabbli globali u sempliċement tissostitwixxi l-valur tagħha fil-mapep? Biex tagħmel dan, dawk il-fajls b'valuri li rridu niparametrizzaw se jkollhom ikollhom l-estensjoni .gotmpl
, sabiex helmfile ikun jaf li jeħtieġ li jitmexxa permezz tal-magna tal-mudell.
.
├── 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 }}
In-nota
Ovvjament, id-dħul fil-grafika ta 'postgres huwa xi ħaġa estremament dubjuża, għalhekk dan l-artikolu jingħata sempliċement bħala eżempju sferiku fil-vakwu u sabiex ma jintroduċix xi rilaxx ġdid fl-artikolu biss għall-fini li jiddeskrivi l-ingress.
Sostituzzjoni ta' sigrieti mill-valuri ambjentali
B'analoġija ma 'l-eżempju ta' hawn fuq, tista 'tissostitwixxi dawk encrypted bl-użu
.
├── 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
In-nota
Mill-mod, getOrNil
- funzjoni speċjali għall-go templates fil-helmfile, li, anke jekk .Values.secrets
mhux se jeżisti, mhux se tarmi żball, iżda se jippermetti r-riżultat bl-użu tal-funzjoni default
jissostitwixxi valur default
Konklużjoni
L-affarijiet deskritti jidhru pjuttost ovvji, iżda l-informazzjoni dwar deskrizzjoni konvenjenti ta 'skjerament għal diversi ambjenti li jużaw helmfile hija skarsa ħafna, u nħobb IaC (Infrastructure-as-Code) u nixtieq li jkolli deskrizzjoni ċara tal-istat tal-iskjerament.
Bħala konklużjoni, nixtieq inżid li l-varjabbli għall-ambjent default jistgħu, min-naħa tagħhom, jiġu parametrizzati mal-varjabbli ambjentali tal-OS ta 'ċertu runner li minnu se jitnieda l-iskjerament, u b'hekk jiksbu ambjenti dinamiċi
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Sors: www.habr.com