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 }}
์ฐธ๊ณ :
๋ถ๋ช ํ ํฌ์คํธ๊ทธ๋ ์ค ์ฐจํธ์ ์์ ์ ๋งค์ฐ ๋ชจํธํ๋ฏ๋ก ์ด ๊ธฐ์ฌ๋ ๋จ์ํ ์์ ์ ์ค๋ช ํ๊ธฐ ์ํด ๊ธฐ์ฌ์ ์๋ก์ด ๋ฆด๋ฆฌ์ค๋ฅผ ์๊ฐํ์ง ์๊ธฐ ์ํด ์ง๊ณต ์ํ์ ๊ตฌํ ์์ ๋ก๋ง ์ ๊ณต๋ฉ๋๋ค.
ํ๊ฒฝ ๊ฐ์์ ๋น๋ฐ ๋์ฒด
์์ ์์ ์ ์ฌํ๊ฒ ๋ค์์ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๊ฒ์ ๋์ฒดํ ์ ์์ต๋๋ค.
.
โโโ 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