Anjeun tiasa maca ngeunaan helmfile sorangan sareng conto panggunaanana dina
Urang bakal kenal sareng cara anu teu jelas pikeun ngajelaskeun pelepasan dina helmfile
Hayu urang nyebutkeun urang boga pak grafik Helm (Contona, urang nyebutkeun postgres sarta sababaraha aplikasi backend) jeung sababaraha lingkungan (sababaraha klaster kubernetes, sababaraha namespaces, atawa sababaraha duanana). Kami nyandak helmfile, maca dokuméntasi sareng ngawitan ngajelaskeun lingkungan sareng sékrési kami:
.
├── 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
Urang réngsé kalawan 2 lingkungan: ngembangkeun, produksi - masing-masing ngandung nilai sorangan pikeun bagan pelepasan helm. Kami bakal nyebarkeun aranjeunna sapertos kieu:
helmfile -n <namespace> -e <env> apply
Versi béda tina grafik Helm di lingkungan béda
Kumaha lamun urang kudu gulung kaluar versi béda tina backend ka lingkungan béda? Kumaha parameterize versi release? Nilai lingkungan sayogi ngalangkungan {{ .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 }}
...
Set aplikasi anu béda dina lingkungan anu béda
Hebat, tapi kumaha upami urang henteu peryogi production
gulung kaluar postgres, sabab urang terang yen urang teu perlu nyorong database kana k8s jeung diobral urang boga klaster postgres misah éndah? Pikeun ngajawab masalah ieu kami boga labél
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Ieu saé, tapi sacara pribadi kuring langkung resep ngajelaskeun aplikasi mana anu disebarkeun di lingkungan henteu nganggo argumen peluncuran, tapi dina pedaran lingkunganana sorangan. Naon anu kedah dilakukeun? Anjeun tiasa nempatkeun déskripsi sékrési dina polder anu misah, nyiptakeun daptar sékrési anu diperyogikeun dina déskripsi lingkungan sareng "nyokot" ngan ukur sékrési anu diperyogikeun, teu malire sésana.
.
├── 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
Catetan
Ngagunakeun bases:
perlu ngagunakeun yaml separator ---
, ku kituna anjeun tiasa ngaleupaskeun citakan (sareng bagian sanésna, sapertos helmDefaults) kalayan nilai tina lingkungan
Dina hal ieu, sékrési postgres malah moal kaasup kana déskripsi pikeun produksi. Nyaman pisan!
Nilai-nilai global anu tiasa dileungitkeun pikeun sékrési
Tangtosna, éta saé yén anjeun tiasa nyetél nilai-nilai pikeun bagan kemudi pikeun unggal lingkungan, tapi kumaha upami urang gaduh sababaraha lingkungan anu dijelaskeun, sareng urang hoyong, contona, nyetél sami pikeun sadayana. affinity
, tapi urang teu hayang ngonpigurasikeun eta sacara standar dina grafik sorangan, nu disimpen dina turnips.
Dina hal ieu, pikeun tiap release urang bisa nangtukeun 2 file kalawan nilai: kahiji kalayan nilai standar, nu bakal nangtukeun nilai tina bagan sorangan, sarta kadua kalayan nilai pikeun lingkungan, anu dina gilirannana bakal override anu standar.
.
├── 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"
Nangtukeun nilai global pikeun bagan kemudi sadaya rilis di tingkat lingkungan
Anggap urang nyieun sababaraha ingress dina sababaraha release - urang bisa nangtukeun sacara manual pikeun tiap bagan hosts:
, Tapi dina hal urang domain sarua, jadi naha henteu nempatkeun eta dina sababaraha variabel global jeung saukur ngagantikeun nilai na kana grafik? Jang ngalampahkeun ieu, file-file anu gaduh nilai anu urang hoyong parameterkeun kedah gaduh ekstensi .gotmpl
, supados helmfile terang yén éta kedah dijalankeun dina mesin citakan.
.
├── 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 }}
Catetan
Jelas, ingress dina bagan postgres mangrupikeun hal anu diragukeun, janten tulisan ieu dirumuskeun ngan ukur salaku conto buleud dina ruang hampa sareng supados henteu ngenalkeun sababaraha sékrési énggal kana tulisan ngan ukur pikeun ngajelaskeun ingress.
Ngaganti rusiah tina nilai lingkungan
Ku analogi sareng conto di luhur, anjeun tiasa ngagentos anu énkripsi nganggo
.
├── 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
Catetan
Ku jalan kitu, getOrNil
- fungsi husus pikeun buka template di helmfile, nu, sanajan .Values.secrets
moal aya, moal buang kasalahan, tapi bakal ngidinan hasilna ngagunakeun fungsi default
ngaganti nilai standar
kacindekan
Hal-hal anu dijelaskeun sigana écés, tapi inpormasi ngeunaan panyebaran anu saé pikeun sababaraha lingkungan anu nganggo helmfile jarang pisan, sareng Abdi bogoh ka IaC (Infrastruktur-sakumaha-Kode) sareng hoyong gaduh gambaran anu jelas ngeunaan kaayaan penyebaran.
Dina kacindekan, abdi hoyong tambahkeun yén variabel pikeun lingkungan standar tiasa, kahareupna jadi parameterized jeung variabel lingkungan OS tina runner tangtu ti mana deployment bakal dibuka, sahingga ménta lingkungan dinamis.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
sumber: www.habr.com