рд╣реЗрд▓реНрдордлрд╛рдЗрд▓ рд╡рд╛рдкрд░реВрди рдПрдХрд╛рдзрд┐рдХ k8s рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рддреИрдирд╛рддреА рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ

рд╣реЗрд▓реНрдордлрд╛рдЗрд▓ - рд╕рд╛рдареА рдЖрд╡рд░рдг рд╢рд┐рд░рд╕реНрддреНрд░рд╛рдг, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдЕрдиреЗрдХ рд╣реЗрд▓реНрдо рд░рд┐рд▓реАрдЭрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕, рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рддреНрдпрд╛рдВрдЪреЗ рдЪрд╛рд░реНрдЯ рдкреЕрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬ рдХрд░рдгреНрдпрд╛рд╕ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рддреИрдирд╛рддреАрдЪрд╛ рдХреНрд░рдо рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдЖрдкрдг рд╣реЗрд▓реНрдордлрд╛рдЗрд▓рдмрджреНрджрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рдорд▓рд╛ рд╡рд╛рдЪрд╛ ╨╕ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рд░рд╛рд╡ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ.

рдЖрдореНрд╣реА рд╣реЗрд▓реНрдордлрд╛рдЗрд▓рдордзреНрдпреЗ рд░рд┐рд▓реАрдЭрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдорд╛рд░реНрдЧрд╛рдВрд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК

рд╕рдордЬрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯреНрд╕рдЪрд╛ рдПрдХ рдкреЕрдХ рдЖрд╣реЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЖрдгрд┐ рдХрд╛рд╣реА рдмреЕрдХрдПрдВрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдореНрд╣рдгреВ рдпрд╛) рдЖрдгрд┐ рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгреЗ (рдЕрдиреЗрдХ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░реНрд╕, рдЕрдиреЗрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд┐рдВрд╡рд╛ рджреЛрдиреНрд╣реАрдкреИрдХреА рдЕрдиреЗрдХ). рдЖрдореНрд╣реА рд╣реЗрд▓реНрдордлрд╛рдЗрд▓ рдШреЗрддреЛ, рдХрд╛рдЧрджрдкрддреНрд░реЗ рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреЗ рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рддреЛ:

    .
    тФЬтФАтФА 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 рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╣ рд╕рдорд╛рдкреНрдд рдХреЗрд▓реЗ: рдбреЗрд╡реНрд╣рд▓, рдЙрддреНрдкрд╛рджрди тАФ рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ рд╣реЗрд▓реНрдо рд░рд┐рд▓реАрдЭ рдЪрд╛рд░реНрдЯрд╕рд╛рдареА рд╕реНрд╡рддрдГрдЪреА рдореВрд▓реНрдпреЗ рдЕрд╕рддрд╛рдд. рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдпрд╛рдкреНрд░рдорд╛рдгреЗ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░реВ:

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

рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдЖрд╡реГрддреНрддреНрдпрд╛

рдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдмреЕрдХрдПрдВрдбрдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░? рд░рд┐рд▓реАрдЭ рдЖрд╡реГрддреНрддреАрдЪреЗ рдкреЕрд░рд╛рдореАрдЯрд░рд╛рдЗрдЭ рдХрд╕реЗ рдХрд░рд╛рд╡реЗ? рджреНрд╡рд╛рд░реЗ рдЙрдкрд▓рдмреНрдз рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдореВрд▓реНрдпреЗ {{ .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 рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рд╛, рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ k8s рдордзреНрдпреЗ рдврдХрд▓рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА рдЖрдгрд┐ рд╡рд┐рдХреНрд░реАрд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЕрджреНрднреБрдд рд╕реНрд╡рддрдВрддреНрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдЖрд╣реЗ? рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд▓реЗрдмрд▓реЗ рдЖрд╣реЗрдд

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 рд╡рд┐рднрд╛рдЬрдХ рд╡рд╛рдкрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ ---, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдореНрд╣реА рд╡рд╛рддрд╛рд╡рд░рдгрд╛рддреАрд▓ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рд░рд┐рд▓реАрдЭ (рдЖрдгрд┐ рдЗрддрд░ рднрд╛рдЧ, рдЬрд╕реЗ рдХреА рд╣реЗрд▓реНрдордбрд┐рдлреЙрд▓реНрдЯреНрд╕) рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рд░рд┐рд▓реАрдЭ рдЙрддреНрдкрд╛рджрдирд╛рдЪреНрдпрд╛ рд╡рд░реНрдгрдирд╛рдд рджреЗрдЦреАрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА. рдЕрдЧрджреА рдЖрд░рд╛рдорд╛рдд!

рд░рд┐рд▓реАрдЭрд╕рд╛рдареА рдУрд╡реНрд╣рд░рд░рд┐рдбреЗрдмрд▓ рдЬрд╛рдЧрддрд┐рдХ рдореВрд▓реНрдпреЗ

рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрд╕рд╛рдареА рдореВрд▓реНрдпреЗ рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛ рд╣реЗ рдЦреВрдк рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рд░реНрд╡рд╛рдВрд╕рд╛рдареА рд╕рдорд╛рди рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕ рдХрд╛рдп? affinity, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рддреЗ рд╕реНрд╡рддрдГрдЪ рдЪрд╛рд░реНрдЯрдордзреНрдпреЗ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА, рдЬреЗ рд╕рд▓рдЧрдо рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдЖрд╣реЗрдд.

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЭрд╕рд╛рдареА рдЖрдореНрд╣реА рдореВрд▓реНрдпрд╛рдВрд╕рд╣ 2 рдлрд╛рдпрд▓реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ: рдкрд╣рд┐рд▓реА рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпрд╛рдВрд╕рд╣, рдЬреА рд╕реНрд╡рддрдГ рдЪрд╛рд░реНрдЯрдЪреА рдореВрд▓реНрдпреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рджреБрд╕рд░реА рдкрд░реНрдпрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рдореВрд▓реНрдпрд╛рдВрд╕рд╣, рдЬреА рдпрд╛рдордзреВрди рдУрд╡реНрд╣рд░рд░рд╛рдЗрдб рдХрд░реЗрд▓. рдбреАрдлреЙрд▓реНрдЯ.

    .
    тФЬтФАтФА 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"

рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реНрддрд░рд╛рд╡рд░ рд╕рд░реНрд╡ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреНрдпрд╛ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрд╕рд╛рдареА рдЬрд╛рдЧрддрд┐рдХ рдореВрд▓реНрдпреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ

рд╕рдордЬрд╛ рдЖрдореНрд╣реА рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдордзреНрдпреЗ рдЕрдиреЗрдХ рдкреНрд░рд╡реЗрд╢ рддрдпрд╛рд░ рдХрд░рддреЛ - рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд░реНрдЯрд╕рд╛рдареА рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддреЛ hosts:, рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдбреЛрдореЗрди рд╕рдорд╛рди рдЖрд╣реЗ, рдордЧ рддреЗ рдХрд╛рд╣реА рдЬрд╛рдЧрддрд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ рдХрд╛ рдареЗрд╡реВ рдирдпреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдореВрд▓реНрдп рдЪрд╛рд░реНрдЯрдордзреНрдпреЗ рдмрджрд▓реВ рдирдпреЗ? рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬреНрдпрд╛ рдлрд╛рдИрд▓реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рдкреЕрд░рд╛рдореАрдЯрд░рд╛рдЗрдЭ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ .gotmpl, рдЬреЗрдгреЗрдХрд░реВрди рд╣реЗрд▓реНрдордлрд╛рдЗрд▓рд▓рд╛ рдХрд│реЗрд▓ рдХреА рддреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрд┐рдирджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

    .
    тФЬтФАтФА 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 }}

рдЪрд┐рдареНрдареА

рд╕рд╛рд╣рдЬрд┐рдХрдЪ, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЪрд╛рд░реНрдЯрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреЗ рд╣реА рдЧреЛрд╖реНрдЯ рдЕрддреНрдпрдВрдд рд╕рдВрд╢рдпрд╛рд╕реНрдкрдж рдЖрд╣реЗ, рдореНрд╣рдгреВрди рд╣рд╛ рд▓реЗрдЦ рдХреЗрд╡рд│ рд╡реНрд╣реЕрдХреНрдпреВрдордордзреНрдпреЗ рдЧреЛрд▓рд╛рдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рджрд┐рд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдХреЗрд╡рд│ рдкреНрд░рд╡реЗрд╢рд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╣реЗрддреВрдиреЗ рд▓реЗрдЦрд╛рдд рдХрд╛рд╣реА рдирд╡реАрди рдкреНрд░рдХрд╛рд╢рди рд╕рд╛рджрд░ рдХрд░реВ рдирдпреЗ.

рдкрд░реНрдпрд╛рд╡рд░рдг рдореВрд▓реНрдпрд╛рдВрдордзреВрди рд░рд╣рд╕реНрдпреЗ рдмрджрд▓рдгреЗ

рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рд╢реА рд╕рд╛рдзрд░реНрдореНрдп рд╕рд╛рдзреВрди, рддреБрдореНрд╣реА рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб рд╡рд╛рдкрд░реВрди рдмрджрд▓реВ рд╢рдХрддрд╛ рд╕реБрдХрд╛рдгреВ рд░рд╣рд╕реНрдпреЗ рдЕрд░реНрде рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЭрд╕рд╛рдареА рдЖрдордЪреА рд╕реНрд╡рддрдГрдЪреА рд╕рд┐рдХреНрд░реЗрдЯ рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЪрд╛рд░реНрдЯрд╕рд╛рдареА рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддреЛ, рдЖрдореНрд╣реА рд░рд┐рд▓реАрдЭ 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 - рд╣реЗрд▓реНрдордлрд╛рдЗрд▓рдордзреАрд▓ рдЧреЛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп, рдЬреЗ, рдЬрд░реА .Values.secrets рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╛рд╣реА, рдПрд░рд░ рдЯрд╛рдХрдгрд╛рд░ рдирд╛рд╣реА, рдкрдг рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рдирд┐рдХрд╛рд▓рд╛рд▓рд╛ рдЕрдиреБрдорддреА рджреЗрдИрд▓ default рдкрд░реНрдпрд╛рдпреА рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдп

рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдЕрдЧрджреА рд╕реНрдкрд╖реНрдЯ рджрд┐рд╕рдд рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рд╣реЗрд▓реНрдордлрд╛рдЗрд▓ рд╡рд╛рдкрд░реВрди рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реЛрдпреАрд╕реНрдХрд░ рд╡рд░реНрдгрдирд╛рдЪреА рдорд╛рд╣рд┐рддреА рдлрд╛рд░рдЪ рдХрдореА рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ IaC (рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдПрдЬ-рдХреЛрдб) рдЖрд╡рдбрддреЗ рдЖрдгрд┐ рддреИрдирд╛рддреА рд╕реНрдерд┐рддреАрдЪреЗ рд╕реНрдкрд╖реНрдЯ рд╡рд░реНрдгрди рд╣рд╡реЗ рдЖрд╣реЗ.

рд╢реЗрд╡рдЯреА, рдореА рд╣реЗ рдЬреЛрдбреВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдбреАрдлреЙрд▓реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕, рдПрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдкрдЯреВрдЪреНрдпрд╛ OS рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╣ рдкреЕрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬреНрдб рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЬреНрдпрд╛рддреВрди рдЙрдкрдпреЛрдЬрди рд╕реБрд░реВ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓.

helmfile.yaml

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

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛