ΠΡΠ°ΡΠΊΠΎ ΠΎ Helmfile
Helmfile β ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Helm-ΡΠ°ΡΡΠΎΠ²/ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π΄Π΅ΠΏΠ»ΠΎΡ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ².
Helmfile-ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠΌ ΠΈ Π±ΡΡΡ Π³ΠΈΠ±ΠΊΠΎ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΠΉ β Π»ΡΠ±ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΡΡΡ ΠΈ ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ βΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡβ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ, single-source-of-truth.
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Helmfile, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅
- ΠΠ΄ΠΈΠ½ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΉ
helmfile.yamlβ ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π²ΠΎ Π²ΡΠ΅ ΡΠ°ΡΡΡ, ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, values, secrets, ΡΠ°Π±Π»ΠΎΠ½Ρ. - IaC: ΡΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½Π°, ΡΠ°ΡΡΠΈΡΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ ΡΠ΅Π»ΠΈΠ·ΠΎΠ², ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ Helm-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π²: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, bitnami, nginx ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠΉ ΡΠ²ΠΎΠΉ.
- ΠΠΈΠ±ΠΊΠ°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ values ΠΈ secrets: ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅/ΡΠ΅ΠΊΡΠ΅ΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ, ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠ»ΠΎΠ΅Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ, Π΄Π»Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ΠΊΡΠ΅ΡΠ°).
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· environments.
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ°ΡΡΠΎΠ² ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
helm init --client-only || echo "probably helm3" helm plugin install https://github.com/databus23/helm-diff
helm plugin install https://github.com/rimusz/helm-tiller # default
wget -O ~/bin/helmfile https://github.com/roboll/helmfile/releases/download/v0.102.0/helmfile_linux_amd64
chmod +x ~/bin/helmfile
# brew
brew install helmfilehelmfile init --forceΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΎΠ² ΡΠ°Π·Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
chartsbackenddatabasewebapp
helmfile.yaml
# ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π»ΠΈΠ·ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠΈΡΡ
releases:
- name: webapp # ΠΈΠΌΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
namespace: default # ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΡΠ½
chart: ./charts/webapp # ΠΌΠ΅ΡΡΠΎΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠ°
version: "0.1.0" # Π²Π΅ΡΡΠΈΡ ΡΠ΅Π»ΠΈΠ·Π°
wait: true # ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ
installed: true # ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠ°
- name: backend
namespace: default
chart: ./charts/backend
wait: true
- name: database
namespace: default
chart: ./charts/database
wait: trueΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠ°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠΈΡ helmfile
helmfile listhelmfile applyhelmfile synchelmfile destroyΠ§Π΅ΡΠ΅Π· set ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ values
helmfile.yaml
- name: backend
namespace: default
chart: ./backend
wait: true
set:
- name: replicaCount
value: 2Π§ΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² ΡΠ°ΡΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ΄Π΅Π»Π°Π½Ρ ΠΈΠ·-Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ³Π½Π°ΡΡ
helmfile diffΠ Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ°ΡΡΡ ΠΈΠ· Π²Π½Π΅ΡΠ½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² ΠΈ ΡΡΠ°Π·Ρ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ
releases:
- name: nginx
namespace: default
chart: oci://registry-1.docker.io/bitnamicharts/nginx # link
version: "15.4.4"
wait: true
set:
- name: service.type
value: ClusterIPhelmfile.yaml
# ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ
repositories:
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts
releases:
- name: prom-norbac-ubuntu
namespace: prometheus
chart: prometheus-community/prometheus # name ΠΈ ΠΈΠΌΡ ΡΠ°ΡΡΠ° ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
set:
- name: rbac.create
value: falseΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ oci ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
repositories:
- name: ocirepo
url: registry-1.docker.io/bitnamicharts
oci: true
releases:
- name: nginx
namespace: default
chart: ocirepo/nginx
version: 15.4.4
wait: true
set:
- name: service.type
value: ClusterIPΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠΌΠΏΠΎΡΡ ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° helm-ΡΠ°ΡΡΠΎΠ²:
.helmfile / repositories.yaml
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠ·Π°/ΡΠ°ΡΡΠ° ΡΠ΅ΡΠ΅Π· external repo
ΠΠ΄Π΅ΡΡ chart ΠΈΠ· ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π° values β ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
.helmfile/releases.yaml.gotmpl
releases:
- name: redis
namespace: common
chart: bitnami/redis
version: 17.4.0
installed: true
values:
- password: secretpassword
- values/redis/{{ .Environment.Name }}.yaml
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Helm-ΡΠ°ΡΡΠ°
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠ°ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, charts/custom-app/):
releases:
- name: custom-app
namespace: apps
chart: ./charts/custom-app
version: 1.0.0
installed: true
values:
- values/custom-app/{{ .Environment.Name }}.yaml
Helmfile Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ΅Ρ Π»ΡΠ±ΡΠ΅ values-ΡΠ°ΠΉΠ»Ρ ΠΈ secrets Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ
-
ΠΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π²
.helmfile/environments.yaml. -
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π·Π°Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ²ΠΎΡ ΠΏΠ°ΠΏΠΊΠ° Π²
envs/:envs/ staging/ env.yaml values/ secrets/ prod/ env.yaml values/ secrets/
Π env.yaml ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, Π² values/ β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π² secrets/ β Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ sensitive-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ (ΡΠ΅ΡΠ΅Π· SOPS).
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠΊΠΎΠΌ
ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ
helmfile -e prod applyΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ΅Π»ΠΈΠ·
helmfile -l name=redis syncΠ Π΅Π½Π΄Π΅Ρ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠ² Π±Π΅Π· Π΄Π΅ΠΏΠ»ΠΎΡ
helmfile templateΠ Π°Π±ΠΎΡΠ° Ρ ΡΠ΅ΠΊΡΠ΅ΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· SOPS
helm secrets edit envs/prod/secrets/_all.yamlΠΠΎΠ²Π°Ρ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ° β ΠΊΠ°ΠΊ Helmfile ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄
- ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ β Π²Π΅ΡΡ ΡΡΠ΅ΠΊ ΠΎΠΏΠΈΡΠ°Π½ Π² git, Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡΡΡ, canary/rollback ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π΅Π½.
- ΠΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ ΠΈ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ β Π½ΠΎΠ²ΡΠΉ ΡΠ°ΡΡ ΠΈΠ»ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π·Π° ΠΌΠΈΠ½ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ»Ρ ΠΈ ΡΠ°Π±Π»ΠΎΠ½Ρ.
- ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ β ΡΠ΅ΠΊΡΠ΅ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΠΎΡΠΊΡΡΡΡΠΉ git.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΡΠ»ΡΡΠΈΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΠΌΠΈ β Π±ΡΡΡΡΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ dev/staging/prod.
- ΠΠΈΠ±ΠΊΠΎΡΡΡ Π΄Π»Ρ DevOps β ΡΠ°ΡΡΡ Π²Π½ΡΡΡΠΈ, ΡΠ°ΡΡΡ ΡΠ½Π°ΡΡΠΆΠΈ, Π»ΡΠ±ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ β Π²ΡΡ ΠΏΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΌΡ workflow.
TL;DR
Helmfile ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ β Π²Π°ΡΠΈ Kubernetes-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, secrets, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΈΡ ΡΠ²ΡΠ·ΠΈ ΠΈ Π»ΠΎΠ³ΠΈΠΊΡ Π²ΡΠΊΠ°ΡΠΊΠΈ, Π²ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.