helmfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ k8s ํ™˜๊ฒฝ์— ๋ฐฐํฌ ๊ตฌ์„ฑ

ํ—ฌ๋ฆ„ํŒŒ์ผ - ๋ž˜ํผ ์ง€๋ฐฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๊ณณ์—์„œ ๋งŽ์€ Helm ๋ฆด๋ฆฌ์Šค๋ฅผ ์„ค๋ช…ํ•˜๊ณ , ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐจํŠธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๊ณ , ๋ฐฐํฌ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

helmfile ์ž์ฒด์™€ ๊ทธ ์‚ฌ์šฉ ์˜ˆ์— โ€‹โ€‹๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด ะธ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๊ฐ€์ด๋“œ.

helmfile์˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Helm ์ฐจํŠธ ํŒฉ(์˜ˆ: postgres ๋ฐ ์ผ๋ถ€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๊ณผ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ(์—ฌ๋Ÿฌ kubernetes ํด๋Ÿฌ์Šคํ„ฐ, ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ๋‘˜ ๋‹ค)์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 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๊ฐ€์ง€ ํ™˜๊ฒฝ์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. DEVEL, ์ƒ์‚ฐ โ€” ๊ฐ๊ฐ์—๋Š” ์กฐํƒ€ ๋ฆด๋ฆฌ์Šค ์ฐจํŠธ์— ๋Œ€ํ•œ ์ž์ฒด ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐํฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

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๋กœ ํ‘ธ์‹œํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ํŒ๋งค์šฉ์œผ๋กœ ๋ฉ‹์ง„ ๋ณ„๋„์˜ postgres ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 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 ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ---, ํ™˜๊ฒฝ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆด๋ฆฌ์Šค(๋ฐ helmDefaults์™€ ๊ฐ™์€ ๊ธฐํƒ€ ๋ถ€๋ถ„)๋ฅผ ํ…œํ”Œ๋ฆฟํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ postgres ๋ฆด๋ฆฌ์Šค๋Š” ํ”„๋กœ๋•์…˜ ์„ค๋ช…์—๋„ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ํŽธ์•ˆํ•˜๊ฒŒ!

๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ์žฌ์ •์˜ ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๊ฐ’

๋ฌผ๋ก  ๊ฐ ํ™˜๊ฒฝ๋งˆ๋‹ค ํ—ฌ๋ฆ„ ์ฐจํŠธ์˜ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ์ข‹์ง€๋งŒ, ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์„ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? 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"

ํ™˜๊ฒฝ ์ˆ˜์ค€์—์„œ ๋ชจ๋“  ๋ฆด๋ฆฌ์Šค์˜ Helm ์ฐจํŠธ์— ๋Œ€ํ•œ ์ „์—ญ ๊ฐ’ ์ •์˜

์—ฌ๋Ÿฌ ๋ฆด๋ฆฌ์Šค์—์„œ ์—ฌ๋Ÿฌ ์ˆ˜์‹ ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฐจํŠธ์— ๋Œ€ํ•ด ์ˆ˜๋™์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. hosts:, ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋„๋ฉ”์ธ์€ ๋™์ผํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ํ•ด๋‹น ๊ฐ’์„ ์ฐจํŠธ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๋ ค๋Š” ๊ฐ’์ด ์žˆ๋Š” ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. .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 }}

์ฐธ๊ณ  :

๋ถ„๋ช…ํžˆ ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค ์ฐจํŠธ์˜ ์ˆ˜์‹ ์€ ๋งค์šฐ ๋ชจํ˜ธํ•˜๋ฏ€๋กœ ์ด ๊ธฐ์‚ฌ๋Š” ๋‹จ์ˆœํžˆ ์ˆ˜์‹ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์‚ฌ์— ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค๋ฅผ ์†Œ๊ฐœํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ง„๊ณต ์ƒํƒœ์˜ ๊ตฌํ˜• ์˜ˆ์ œ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๊ฐ’์—์„œ ๋น„๋ฐ€ ๋Œ€์ฒด

์œ„์˜ ์˜ˆ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ๊ฒƒ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐํƒ€ ๋น„๋ฐ€ ์˜๋ฏธ. ์ฐจํŠธ์— ๋Œ€ํ•œ ์•”ํ˜ธํ™”๋œ ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์ž์ฒด ๋น„๋ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ์— ์ •์˜๋œ ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ฌ ๊ฐ’์„ 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 - helmfile์˜ go ํ…œํ”Œ๋ฆฟ์„ ์œ„ํ•œ ํŠน์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. .Values.secrets ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. default ๋Œ€์ฒด ๊ธฐ๋ณธ๊ฐ’

๊ฒฐ๋ก 

์„ค๋ช…๋œ ๋‚ด์šฉ์€ ๋งค์šฐ ๋ถ„๋ช…ํ•ด ๋ณด์ด์ง€๋งŒ helmfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๋Š” ํŽธ๋ฆฌํ•œ ์„ค๋ช…์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋งค์šฐ ๋ถ€์กฑํ•˜๋ฉฐ ์ €๋Š” IaC(Infrastructure-as-Code)๋ฅผ ์ข‹์•„ํ•˜๊ณ  ๋ฐฐํฌ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์„ค๋ช…์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐฐํฌ๊ฐ€ ์‹œ์ž‘๋  ํŠน์ • ์‹คํ–‰๊ธฐ์˜ OS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋˜์–ด ๋™์  ํ™˜๊ฒฝ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

helmfile.yaml

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€