helmfile ááá¯ááºááá¯ááºá¡ááŒá±á¬ááºážááŸáá·áºáááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááá°áá¬áá»á¬ážááá¯áááºááá¯ááºáááºá
helmfile ááœáẠáá¯ááºáá±ááŸá¯áá»á¬ážááᯠáá±á¬áºááŒááẠááŸááºážááŸááºážáááºážáááºážááá¯ááºáá±á¬ áááºážáááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áááá¬áá«áááºá
áá»áœááºá¯ááºááá¯á·ááœáẠáá²á·ááááºážááá¬ážáá»á¬áž á¡á á¯á¶áá«ááŸáááẠ(á¥ááá¬á postgres ááŸáá·áº backend á¡ááá®áá±ážááŸááºážá¡áá»áá¯á·ááá¯ááá¯áá«á áá¯á·) ááŸáá·áº áááºáááºážáá»ááºáá»á¬ážá áœá¬ ( kubernetes á¡á á¯á¡áá±ážáá»á¬ážá áœá¬á namespaces áá»á¬ážá áœá¬ ááá¯á·ááá¯áẠááŸá áºáá¯áá¯á¶ážá á¡áá»á¬ážá¡ááŒá¬áž)á áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºááá¯áá°á á á¬ááœááºá á¬áááºážááá¯áááºááŒá®áž áá»áœááºá¯ááºááá¯á·ááááºáááºážáá»ááºááŸáá·áº áá¯ááºáá±ááŸá¯áá»á¬ážááᯠá áááºáá±á¬áºááŒáááº-
.
âââ 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
áá»áœááºá¯ááºááá¯á·ááẠáááºáááºážáá»áẠá áá¯ááŒáá·áº á¡áá¯á¶ážáááºáá²á·ááẠááá»á¬, áá¯ááºáá¯ááºááŸá¯ â áá áºáá¯á á®ááœáẠáá²á·áá¯ááºááŒááºážááá¬ážáá»á¬ážá¡ááœáẠáááºážáááá¯ááºááá¯ááºáááºááá¯ážáá»á¬áž áá«ááŸááááºá áááºážááá¯á·á¡á¬áž á€áá²á·ááá¯á· á¡áá¯á¶ážáá»áá«áááº-
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 }}
...
ááá°áá®áá±á¬áááºáááºážáá»ááºáá»á¬ážááœáẠááá°áá®áá±á¬ application á¡á á¯á¶
áá±á¬ááºážááẠáá«áá±ááá·áº áááá¯á¡ááºááẠáááºááá¯áá¯ááºááá²á production
áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á
áºááᯠk8s ááá¯á· ááœááºážááá¯á·ááẠáááá¯á¡ááºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·áááá±á¬ááŒá±á¬áá·áº postgres áá»á¬ážááᯠááŒáá·áºáá¯ááºááŒá®áž áá±á¬ááºážáá»áááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠá¡á¶á·ááŒááœááºáá®ážááŒá¬áž postgres á¡á
á¯á¡áá±ážáá
áºáá¯ááŸááá±áááºá á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠáá»áœááºá¯ááºááá¯á·ááœáẠáá¶ááááºáá»á¬ážááŸááááºá
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
áááºážááẠáá±á¬ááºážááœááºáá±á¬áºáááºážá launch arguments áá»á¬ážááá¯ááá¯á¶ážáá² áááºáááºážáá»ááºááœáẠá¡áá¯á¶ážáá»áááá·áº application áá»á¬ážááᯠááá¯ááºááá¯ááºááá¯ááºáá» áá±á¬áºááŒááá¯áá«áááºá áá¬áá¯ááºááá²? áá¯ááºáá±ááŸá¯áá±á¬áºááŒáá»ááºáá»á¬ážá¡á¬áž áá®ážááŒá¬ážááá¯ááºááœá²áá áºáá¯ááœáẠáá¬ážááá¯ááºááŒá®ážá áááºáááºážáá»ááºáá±á¬áºááŒáá»ááºááœáẠááá¯á¡ááºáá±á¬áá¯ááºááŒááºáá»ááºáá»á¬ážá á¬áááºážááᯠáááºáá®ážááá¯ááºááŒá®áž áá»ááºá¡áá¬áá»á¬ážááᯠáá»á áºáá»á°ááŸá¯áᬠááá¯á¡ááºáá±á¬áá¯ááºáá±ááŸá¯áá»á¬ážááá¯áᬠ"áá±á¬ááºáá°" ááá¯ááºáá«áááºá
.
âââ 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 separator ááá¯á¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáááºá ---
ááá¯á·ááŒá±á¬áá·áº áááºááẠáááºáááºážáá»ááºá០áááºááá¯ážáá»á¬áž (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"
áááºáááºážáá»ááºá¡ááá·áºááŸá áá¯ááºáá±ááŸá¯á¡á¬ážáá¯á¶ážá áá²á·ááá¯ááºááá¬ážáá»á¬ážá¡ááœáẠááá¹áá¬áá¯á¶ážááá¯ááºáá¬áááºááá¯ážáá»á¬ážááᯠáááºááŸááºááŒááºážá
áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±ááŸá¯áá»á¬ážá
áœá¬ááœáẠingress á¡áá»á¬ážá¡ááŒá¬ážááᯠáááºáá®ážáááºááá¯áá«á
áá¯á· - áá»áœááºá¯ááºááá¯á·ááẠááá¬ážáá
áºáá¯á
á®á¡ááœáẠááá¯ááºááá¯ááºáááºááŸááºááá¯ááºáááºá hosts:
ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœáẠááá¯ááááºážááẠá¡áá°áá°ááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº áááºážááᯠglobal variable ááœááºááá·áºáᬠáááºážááááºááá¯ážááᯠááá¬ážáá»á¬ážááœáẠááá¯ážááá¯ážááŸááºážááŸááºáž á¡á
á¬ážááá¯ážáá«á áá«ááá¯áá¯ááºááá¯á·á áá»áœááºáá±á¬áºááá¯á· parameterize áá¯ááºáá»ááºáá²á· áááºááá¯ážááœá±áá²á· á¡á²áá®ááá¯ááºááœá±ááŸá¬ extension ááŸáááááºá .gotmpl
á ááá¯á·ááŒá±á¬áá·áº helmfile ááẠtemplate engine ááŸáááá·áº run áááºááá¯á¡ááºááŒá±á¬ááºážáááááºá
.
âââ 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 }}
ááŸááºáá»ááº
áááºááŸá¬ážáááºááŸá¬á postgres ááá¬ážááŸá ingress ááẠá¡ááœááºáá¶ááááŒá áºááœááºá¡áá¬ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº á€áá±á¬ááºážáá«ážááᯠáá±áá¬áááºáá áºáá¯ááœáẠáá¯á¶ážáááºááá°áá¬áá áºáá¯á¡ááŒá Ạááá¯ážááŸááºážá áœá¬áá±ážáá¬ážááŒá®áž ingress ááá¯áá±á¬áºááŒáááºá¡ááœááºáᬠáá±á¬ááºážáá«ážááœáẠá¡áá áºááœááºááŸááá¬ááŒááºážááᯠááááºáááºááŒááºážáááŒá¯ááá¯ááºáááºá
áááºáááºážáá»ááºáááºááá¯ážáá»á¬ážá០áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááᯠá¡á á¬ážááá¯ážááŒááºážá
á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááŸáá·áº ááŸáá¯ááºážááŸááºááŒááºážááŒáá·áºá áááºááẠáá¯ááºááŸááºáá¬ážáá±á¬ á¡áá¬áá»á¬ážááᯠá¡á
á¬ážááá¯ážááá¯ááºáááºá
.
âââ 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 templates á¡ááœáẠá¡áá°ážáá¯ááºáá±á¬ááºáá»ááºáá
áºáᯠ.Values.secrets
ááŸááááºááá¯ááºáá«á á¡ááŸá¬ážááá¯áá
áºáááºááá¯ááºáá±á¬áºáááºáž function ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áºááááºááá¯ááœáá·áºááŒá¯áááá·áºáááºá default
áá°áááºážáááºááá¯ážááᯠá¡á
á¬ážááá¯ážáá«á
áá±á¬ááºáá»ááº
áá±á¬áºááŒáá¬ážááá·áºá¡áá¬áá»á¬ážááẠááŸááºážááŸááºážáááºážáááºážáááºááá±á¬áºáááºáž helmfile ááá¯á¡áá¯á¶ážááŒá¯á áááºáááºážáá»ááºá¡áá»á¬ážá¡ááŒá¬ážááá¯á· ááŒáá·áºáá»ááºááŒááºážá¡ááœáẠá¡áááºááŒá±áá±á¬áá±á¬áºááŒáá»ááºáá« á¡áá»ááºá¡áááºáá»á¬ážááẠá¡ááœááºááŸá¬ážáá«ážááŒá®áž IaC (Infrastructure-as-Code) ááá¯ááŸá áºáááºááŒá®áž ááŒáá·áºáá»ááºááŸá¯á¡ááŒá±á¡áá±á¡á¬áž ááŸááºážáááºážá áœá¬áá±á¬áºááŒááá¯áá«áááºá
áááá¯á¶ážáá»á¯ááºá¡áá±áá²á·á áá°áááºážáááºáááºážáá»ááºá¡ááœáẠvariable ááœá±ááᯠdeployment á áááºááá·áº runner áá²á· OS áá²á· environment variables ááœá±áá²á· parameterized áá¯ááºááá¯ááºááŒá®áž dynamic environments ááœá±ááᯠááá°ááá¯ááºááá¯á· áááá¯á¶ážáá»á¯ááºáá»ááºáá«áááºá
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
source: www.habr.com