ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΎ 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 helmfile
helmfile init --force

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ нСсколько Ρ‡Π°Ρ€Ρ‚ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

  • charts
    • backend
    • database
    • webapp

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 list
helmfile apply
helmfile sync
helmfile 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: ClusterIP

helmfile.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, зависимости, окруТСния, ΠΈΡ… связи ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ Π²Ρ‹ΠΊΠ°Ρ‚ΠΊΠΈ, всё управляСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

Samples