рд╣реЗрд▓реНрдордлрд╛рдЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдзреЗрд░реИ 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 рд╡рд┐рднрд╛рдЬрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ ---, рддрд╛рдХрд┐ рддрдкрд╛рдИрдВ рд╡рд╛рддрд╛рд╡рд░рдгрдмрд╛рдЯ рдорд╛рдирд╣рд░реВ рд╕рд╣рд┐рдд рд░рд┐рд▓рд┐рдЬрд╣рд░реВ (рд░ рдЕрдиреНрдп рднрд╛рдЧрд╣рд░реВ, рдЬрд╕реНрддреИ helmDefaults) рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рд░рд┐рд▓реАрдЬ рдкрдирд┐ рдЙрддреНрдкрд╛рджрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╡рд░рдгрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдиреЗ рдЫреИрдиред рдзреЗрд░реИ рд╕рд╣рдЬ!

рд╡рд┐рдореЛрдЪрдирдХрд╛ рд▓рд╛рдЧрд┐ рдУрднрд░рд░рд╛рдЗрдб рдЧрд░реНрди рдорд┐рд▓реНрдиреЗ рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рдорд╛рдирд╣рд░реВ

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпреЛ рд░рд╛рдореНрд░реЛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдзреЗрд░реИ рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рд╣рд╛рдореА рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рдмреИрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рд╕реЗрдЯ рдЧрд░реНрдиред 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 (рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдПрдЬ-рдХреЛрдб) рд▓рд╛рдИ рдорд╛рдпрд╛ рдЧрд░реНрдЫреБ рд░ рддреИрдирд╛рддреА рдЕрд╡рд╕реНрдерд╛рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдкрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБред

рдЕрдиреНрддрдорд╛, рдо рдердкреНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдЪрд░рд╣рд░реВ, рдмрджрд▓реЗрдорд╛, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзрд╛рд╡рдХрдХреЛ рдУрдПрд╕рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдгреАрдп рдЪрд░рд╣рд░реВрд╕рдБрдЧ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╛рдЗрдЬ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╣рд╛рдБрдмрд╛рдЯ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд╕реБрд░реБ рд╣реБрдиреЗрдЫ, рд░ рдпрд╕рд░реА рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

helmfile.yaml

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди