เชนเซ‡เชฒเซเชฎเชซเชพเชˆเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเชนเซเชตเชฟเชง 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹