ืึธืจื’ืึทื ื™ื™ื–ื™ื ื’ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืฆื• ืงื™ื™ืคืœ ืง8ืก ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ื ื™ืฆืŸ ื”ืขืœืืคื™ืœืข

ื”ืขืœืžืคื™ืœืข - ืจืึทืคึผืขืจ ืคึฟืึทืจ ืจื•ื“ืขืจ, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืคื™ืœืข ื”ืขืœื ืจื™ืœื™ืกื™ื– ืื™ืŸ ืื™ื™ืŸ ืึธืจื˜, ืคึผืึทืจืึทืžืขื˜ื™ื–ื™ืจืŸ ื–ื™ื™ืขืจ ื˜ืฉืึทืจืฅ ืคึฟืึทืจ ืขื˜ืœืขื›ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ืื•ืŸ ืื•ื™ืš ืฉื˜ืขืœืŸ ื“ื™ ืกื“ืจ ืคื•ืŸ ื–ื™ื™ืขืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜.

ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ื•ื•ืขื’ืŸ ื”ืขืœืžืคื™ืœืข ื–ื™ืš ืื•ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื–ื™ื™ึทืŸ ื ื•ืฆืŸ ืื™ืŸ ืจืขืึทื“ืžืข ะธ ื‘ืขืกื˜ืขืจ ืคึผืจืึทืงื˜ืึทืกืึทื– ืคื™ืจืŸ.

ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทืงืขื ืขืŸ ื–ื™ืš ืžื™ื˜ ื ื™ื˜-ืงืœืึธืจืขื•ื•ื“ื™ืง ื•ื•ืขื’ืŸ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืจื™ืœื™ืกื™ื– ืื™ืŸ ื”ืขืœืžืคื™ืœืข

ื–ืืœ ืก ื–ืึธื’ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืึท ืคึผืึทืง ืคื•ืŸ ื”ืขืœื ื˜ืฉืึทืจืฅ (ืœืžืฉืœ, ืœืึธื–ืŸ ืื•ื ื“ื– ื–ืึธื’ืŸ ืคึผืึธืกื˜ื’ืจืขืก ืื•ืŸ ืขื˜ืœืขื›ืข ื‘ืึทืงืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ) ืื•ืŸ ืขื˜ืœืขื›ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ (ืขื˜ืœืขื›ืข ืงื•ื‘ืขืจื ืขื˜ืขืก ืงืœืึทืกื˜ืขืจื–, ืขื˜ืœืขื›ืข ื ืึธืžืขืŸ ืกืคึผื™ื™ืกืึทื– ืึธื“ืขืจ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื‘ื™ื™ื“ืข). ืžื™ืจ ื ืขืžืขืŸ ื“ื™ ื”ืขืœื ื˜ืขืงืข, ืœื™ื™ืขื ืขืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื•ืŸ ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืื•ื ื“ื–ืขืจ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ืื•ืŸ ืจื™ืœื™ืกื™ื–:

    .
    โ”œโ”€โ”€ 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 ืจืึธืœืœ ืื•ื™ืก ืคึผืึธืกื˜ื’ืจืขืก, ื•ื•ื™ื™ึทืœ ืžื™ืจ ื•ื•ื™ืกืŸ ืึทื– ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืฉื˜ื•ืคึผืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื™ืŸ ืง8ืก ืื•ืŸ ืคึฟืึทืจ ืคืึทืจืงื•ื™ืฃ ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื•ื•ื•ื ื“ืขืจืœืขืš ื‘ืึทื–ื•ื ื“ืขืจ ืคึผืึธืกื˜ื’ืจืขืก ืงื ื•ื™ืœ? ืฆื• ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื ืžื™ืจ ื”ืึธื‘ืŸ ืœืึทื‘ืขืœืก

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: ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ื ื•ืฆืŸ ื™ืึทืžืœ ืกืขืคึผืึทืจืึทื˜ืึธืจ ---, ืึทื–ื•ื™ ืึทื– ืื™ืจ ืงืขื ืขืŸ ืžื•ืกื˜ืขืจ ืจื™ืœื™ืกื™ื– (ืื•ืŸ ืื ื“ืขืจืข ืคึผืึทืจืฅ, ืึทื–ืึท ื•ื•ื™ ื”ืขืœื ื“ืขืคืึทื•ืœื˜) ืžื™ื˜ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ

ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ืคึผืึธืกื˜ื’ืจืขืก ืžืขืœื“ื•ื ื’ ื•ื•ืขื˜ ื ื™ืฉื˜ ืืคื™ืœื• ื–ื™ื™ืŸ ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืื™ืŸ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคึฟืึทืจ ืคึผืจืึธื“ื•ืงืฆื™ืข. ื–ื™ื™ืขืจ ืงืึทืžืคืขืจื˜ืึทื‘ืœื™!

ืึธื•ื•ืขืจืจื™ื“ืึทื‘ืœืข ื’ืœืื‘ืืœืข ื•ื•ืึทืœื•ืขืก ืคึฟืึทืจ ืจื™ืœื™ืกื™ื–

ื“ืึธืš, ืขืก ืื™ื– ื’ืจื•ื™ืก ืึทื– ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขืœืŸ ื•ื•ืึทืœื•ืขืก ืคึฟืึทืจ ื”ืขืœื ื˜ืฉืึทืจืฅ ืคึฟืึทืจ ื™ืขื“ืขืจ ืกื•ื•ื™ื•ื•ืข, ืึธื‘ืขืจ ื•ื•ืึธืก ืื•ื™ื‘ ืžื™ืจ ื”ืึธื‘ืŸ ืขื˜ืœืขื›ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ื“ื™ืกืงืจื™ื™ื‘ื“, ืื•ืŸ ืžื™ืจ ื•ื•ืขืœืŸ, ืœืžืฉืœ, ืฉื˜ืขืœืŸ ื“ื™ ื–ืขืœื‘ืข ืคึฟืึทืจ ืึทืœืข. 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 (Infrastructure-as-Code) ืื•ืŸ ื•ื•ื™ืœืŸ ืฆื• ื”ืึธื‘ืŸ ืึท ืงืœืึธืจ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืฉื˜ืึทื˜.

ืื™ืŸ ืžืกืงื ื, ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ืœื™ื™ื’ืŸ ืึทื– ื“ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืคึฟืึทืจ ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืกื•ื•ื™ื•ื•ืข ืงืขื ืขืŸ, ืื™ืŸ ืงืขืจ, ื–ื™ื™ืŸ ืคึผืึทืจืึทืžืขื˜ืขืจื™ื™ื–ื“ ืžื™ื˜ ื“ื™ ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืคื•ืŸ ื“ื™ ืึทืก ืคื•ืŸ ืึท ื–ื™ื›ืขืจ ืจืึทื ืขืจ ืคื•ืŸ ื•ื•ืึธืก ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœืึธื ื˜ืฉื˜, ืื•ืŸ ืึทื–ื•ื™ ื‘ืึทืงื•ืžืขืŸ ื“ื™ื ืึทืžื™ืฉ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ.

helmfile.yaml

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

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’