เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบฑเบšโ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบก k8s เบซเบผเบฒเบโ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ helmfileโ€‹

Helmfile - wrapper เบชเปเบฒเบฅเบฑเบš เปเบงเบ เบเบฑเบ™เบเบฐเบ—เบปเบš, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เปˆเบญเบเบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบšเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ”เบฝเบง, เบเปเบฒเบ™เบปเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบชเปเบฒเบฅเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบซเบผเบฒเบ, เปเบฅเบฐเบเบฑเบ‡เบเปเบฒเบ™เบปเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš Helmfile เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ readme ะธ เบ„เบนเปˆเบกเบทเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฎเบนเป‰เบˆเบฑเบเบงเบดเบ—เบตเบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เปˆเบญเบเปƒเบ™ helmfile

เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบŠเบธเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ helm (เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒ postgres เปเบฅเบฐเบšเบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ backend) เปเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡ (เบซเบผเบฒเบ kubernetes clusters, เบซเบผเบฒเบ namespaces, เบซเบผเบทเบซเบผเบฒเบเบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡). เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒ 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 เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก: เบŠเบฒเบ, เบเบฒเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ” โ€” เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบ„เบปเบ™โ€‹เบกเบตโ€‹เบ„เบธเบ™โ€‹เบ„เปˆเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹เป€เบญเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เปˆเบญเบโ€‹เบซเบกเบงเบโ€‹. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

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

เบฎเบธเปˆเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบšเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™

เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง backend เบฎเบธเปˆเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป„เบ›เบชเบนเปˆเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™? เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ›เปˆเบญเบโ€‹? เบ„เบธเบ™เบ„เปˆเบฒเบชเบดเปˆเบ‡เปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบกเบตเบขเบนเปˆเป‚เบ”เบเบœเปˆเบฒเบ™ {{ .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 roll out postgres, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบนเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ k8s เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฒเบเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบธเปˆเบก postgres เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบ›เบฐเป€เบชเบตเบ”เบšเป? เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ›เป‰เบฒเบเบŠเบทเปˆ

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 ---, เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™โ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰ template เบ›เปˆเบญเบ (เปเบฅเบฐโ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹เบญเบทเปˆเบ™เป†โ€‹, เป€เบŠเบฑเปˆเบ™โ€‹: helmDefaultsโ€‹) เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบธเบ™โ€‹เบ„เปˆเบฒโ€‹เบˆเบฒเบโ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบก

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เบ›เปˆเบญเบ postgres เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบœเบฐเบฅเบดเบ”. เบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบเบซเบผเบฒเบ!

Overridable เบกเบนเบ™เบ„เปˆเบฒเบ—เบปเปˆเบงเป‚เบฅเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบญเบ

เปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบšเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, เปเบ•เปˆเบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบ, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบเปเบฒเบ™เบปเบ”เบ”เบฝเบงเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเบ„เบปเบ™. affinity, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบกเบฑเบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ turnips.

เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹, เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบญเบโ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบ„เบปเบ™โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเปเบฒโ€‹เบ™เบปเบ” 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"

เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบกเบนเบ™เบ„เปˆเบฒเบ—เบปเปˆเบงเป‚เบฅเบเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ helm เบ‚เบญเบ‡เบเบฒเบ™เบ›เปˆเบญเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบฅเบฐเบ”เบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก

เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ ingress เบซเบผเบฒเบเป†เบ„เบฑเป‰เบ‡เปƒเบ™เบซเบผเบฒเบเบฅเบธเป‰เบ™ - เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hosts:, เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป‚เบ”เป€เบกเบ™เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบˆเบถเปˆเบ‡เบšเปเปˆเป€เบญเบปเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเบฒเบ‡เบ•เบปเบงเปเบ›เบ—เบปเปˆเบงเป‚เบฅเบเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบ—เบปเบ”เปเบ—เบ™เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡? เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบกเบตเบ„เปˆเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™ parameterize เบˆเบฐเบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ .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 เปเบกเปˆเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบชเบ—เบตเปˆเบชเบธเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เปƒเบซเป‰เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ spherical เปƒเบ™เบชเบนเบ™เบเบฒเบเบฒเบ”เปเบฅเบฐเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เบ›เปˆเบญเบเปƒเบซเบกเปˆเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบš sake เบ‚เบญเบ‡เบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบ ingress.

เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบ„เบงเบฒเบกเบฅเบฑเบšเบˆเบฒเบเบ„เบธเบ™เบ„เปˆเบฒเบชเบดเปˆเบ‡เปเบงเบ”เบฅเป‰เบญเบก

เป‚เบ”เบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ—เบปเบ”เปเบ—เบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ เบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบš เบ„เบงเบฒเบกโ€‹เบซเบกเบฒเบ. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบเบฒเบ™เบ›เปˆเบญเบ, เปƒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒ encrypted เบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบ 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 templates เปƒเบ™ helmfile, เป€เบŠเบดเปˆเบ‡, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ .Values.secrets เบˆเบฐเบšเปเปˆเบขเบนเปˆ, เบˆเบฐเบšเปเปˆเบ–เบดเป‰เบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เปเบ•เปˆเบˆเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ default เปเบ—เบ™เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เบชเบฐเบซเบฅเบธเบš

เบชเบดเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบˆเบฐเปเบˆเป‰เบ‡, เปเบ•เปˆเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปเปˆเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบซเบผเบฒเบเป†เบขเปˆเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰ helmfile เปเบกเปˆเบ™เบ‚เบฒเบ”เปเบ„เบ™เบซเบผเบฒเบ, เปเบฅเบฐเบ‚เป‰เบญเบเบฎเบฑเบ IaC (Infrastructure-as-Code) เปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰.

เบชเบฐเบซเบฅเบธเบšเบฅเบงเบกเปเบฅเป‰เบง, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเป€เบžเบตเปˆเบกเบงเปˆเบฒเบ•เบปเบงเปเบ›เบชเปเบฒเบฅเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเบฒเบกเบฒเบ”, เปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™, เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบเบฑเบšเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบญเบ‡ OS เบ‚เบญเบ‡ runner เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เป„เบ”เป‰เบฎเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

helmfile.yaml

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

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™