ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ дСплоя Π² мноТСство k8s ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ helmfile

Helmfile β€” ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для helm, которая позволяСт Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ мноТСство helm Ρ€Π΅Π»ΠΈΠ·ΠΎΠ², ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‡Π°Ρ€Ρ‚Ρ‹ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ порядок ΠΈΡ… дСплоя.

О самом helmfile ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π΅Π³ΠΎ использования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² readme ΠΈ best practices guide.

ΠœΡ‹ ΠΆΠ΅ познакомимся с Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ способами ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π»ΠΈΠ·Ρ‹ Π² helmfile

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ‡ΠΊΠ° helm-Ρ‡Π°Ρ€Ρ‚ΠΎΠ² (для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡƒΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ postgres ΠΈ Π½Π΅ΠΊΠΎΠ΅ backend ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅) ΠΈ нСсколько ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ (нСсколько kubernetes кластСров, нСсколько namespace’ΠΎΠ² ΠΈΠ»ΠΈ нСсколько ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ). Π‘Π΅Ρ€Ρ‘ΠΌ helmfile, Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ наши окруТСния ΠΈ Ρ€Π΅Π»ΠΈΠ·Ρ‹:

    .
    β”œβ”€β”€ 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

Π£ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 2 окруТСния: devel, production β€” Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ находятся свои значСния для helm Ρ‡Π°Ρ€Ρ‚ΠΎΠ² Ρ€Π΅Π»ΠΈΠ·ΠΎΠ². ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ Π² Π½ΠΈΡ… Ρ‚Π°ΠΊ:

helmfile -n <namespace> -e <env> apply

Π Π°Π·Π½Ρ‹Π΅ вСрсии helm Ρ‡Π°Ρ€Ρ‚ΠΎΠ² Π² Ρ€Π°Π·Π½Ρ‹Ρ… окруТСниях

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии бэкСнда Π² Ρ€Π°Π·Π½Ρ‹Π΅ окруТСния? Как ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Ρ€Π΅Π»ΠΈΠ·Π°? На ΠΏΠΎΠΌΠΎΡ‰ΡŒ приходят значСния окруТСния, доступныС Ρ‡Π΅Ρ€Π΅Π· {{ .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 }}
...

Π Π°Π·Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Ρ€Π°Π·Π½Ρ‹Ρ… окруТСниях

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, Π½ΠΎ Ρ‡Ρ‚ΠΎ Ссли Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ Π² production Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ postgres, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΈΡ…Π°Ρ‚ΡŒ Π² k8s ΠΈ для ΠΏΡ€ΠΎΠ΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ кластСр postgres? Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρƒ нас Π΅ΡΡ‚ΡŒ Π»Π΅ΠΉΠ±Π»Ρ‹ (labels)

helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply

Π­Ρ‚ΠΎ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Π½ΠΎ Π»ΠΈΡ‡Π½ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ прилоТСния Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² запуска, Π° Π² описании самих ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ? МоТно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ описаниС Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ, Π² описании окруТСния завСсти список Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² ΠΈ "ΠΏΠΎΠ΄Ρ†Π΅ΠΏΠ»ΡΡ‚ΡŒ" Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π»ΠΈΠ·Ρ‹, игнорируя ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅

    .
    β”œβ”€β”€ 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

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

ΠŸΡ€ΠΈ использовании bases: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ yaml Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ---, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ releases (ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ части, Ρ‚ΠΈΠΏΠ° helmDefaults) значСниями ΠΈΠ· environments

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Ρ€Π΅Π»ΠΈΠ· postgres Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² описаниС для production. ΠžΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ!

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡ‹Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ значСния для Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ окруТСния Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния для helm Ρ‡Π°Ρ€Ρ‚ΠΎΠ², Π½ΠΎ Ρ‡Ρ‚ΠΎ Ссли Ρƒ нас описано нСсколько ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, допустим, Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ для всСх affinity, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² самих Ρ‡Π°Ρ€Ρ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² Ρ€Π΅ΠΏΠ°Ρ….

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° Π·Π°Π΄Π°Ρ‚ΡŒ 2 Ρ„Π°ΠΉΠ»Π° с values: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ с Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΌΠΈ значСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ значСния самого Ρ‡Π°Ρ€Ρ‚Π°, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ со значСниями для окруТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅.

    .
    β”œβ”€β”€ 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"

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для helm Ρ‡Π°Ρ€Ρ‚ΠΎΠ² всСх Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ окруТСния

Допустим, Ρƒ нас Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅Π»ΠΈΠ·Π°Ρ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ нСсколько ingress β€” ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π°Ρ€Ρ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ hosts:, Π½ΠΎ Π² нашСм случаС Π΄ΠΎΠΌΠ΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅, Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Π΅Π³ΠΎ Π½Π΅ вынСсти Π² Π½Π΅ΠΊΡƒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ просто ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‡Π°Ρ€Ρ‚Ρ‹? Для этого Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с values, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .gotmpl, Ρ‡Ρ‚ΠΎΠ±Ρ‹ helmfile Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€.

    .
    β”œβ”€β”€ 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 }}

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ingress Π² Ρ‡Π°Ρ€Ρ‚Π΅ postgres β€” это Π½Π΅Ρ‡Ρ‚ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, поэтому Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ просто Π² качСствС сфСричСского ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² Π²Π°ΠΊΡƒΡƒΠΌΠ΅ ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ описания ingress

ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° сСкрСтов (secrets) ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ окруТСния

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ helm secrets значСния. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свой Ρ„Π°ΠΉΠ» secrets, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ для Ρ‡Π°Ρ€Ρ‚Π° Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΌ default.yaml.gotmpl значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ. А значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ Π½ΠΈ ΠΎΡ‚ ΠΊΠΎΠ³ΠΎ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΆΠ΅ спокойно ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² значСниях Ρ€Π΅Π»ΠΈΠ·Π° Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ.

    .
    β”œβ”€β”€ 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

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

ΠšΡΡ‚Π°Ρ‚ΠΈ, getOrNil β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция для go шаблонов Π² helmfile, которая, Π΄Π°ΠΆΠ΅ Ссли .Values.secrets Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ default ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ каТутся довольно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ, Π½ΠΎ информация ΠΏΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌΡƒ описанию дСплоя Π² нСсколько ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ helmfile ΠΎΡ‡Π΅Π½ΡŒ скудна, Π° я люблю IaC(Infrastructure-as-Code) ΠΈ Ρ…ΠΎΡ‡Ρƒ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Ρ‘Ρ‚ΠΊΠΎΠ΅ описаниС стСйта дСплоя.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ…ΠΎΡ‡Ρƒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для окруТСния default ΠΌΠΎΠΆΠ½ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния ОБ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ Ρ€Π°Π½Π½Π΅Ρ€Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ динамичСскиС окруТСния

helmfile.yaml

environments:
  default:
    values:
    - global:
        clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
        ingressDomain: {{ env "INGRESS_DOMAIN" }}

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com