α’αααα’αΆα
α’αΆαα’αααΈ Helmfile αααα½αααΆ αα·αα§ααΆα αααααααΆαααααΎααααΆααααααααΆαα
αααα»α
ααΎαβααΉαβααααΆααβααΈβαα·ααΈβαα·αβα αααΆααβααΆααβαααα»αβααΆαβαα·αααααΆβα’αααΈβααΆαβα ααβααααΆαβαααα»αβhelmfile
α αΌααα·ααΆαααΆααΎαααΆααααα ααααααΆααΆααααα½α (α§ααΆα ααα α αΌααα·ααΆαααΆ postgres αα·ααααααα·ααΈ backend αα½αα ααα½α) αα·αααα·ααααΆαααΆα αααΎα (α ααααα kubernetes ααΆα αααΎα α ααααααααααααΆα αααΎα α¬ααΆααααΈαααΆααααΈα)α ααΎαααα―αααΆααααα½α α’αΆαα―αααΆα α αΎαα αΆααααααΎααα·αααααΆα’αααΈααα·ααααΆα αα·αααΆαα ααααααΆαααααααΎαα
.
βββ 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
α
αΆααααααΎα 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 ---
ααΌα
ααααα’αααα’αΆα
αααααΎαααααΌα
ααααααΆα (αα·ααααααααααααααααΌα
ααΆ helmDefaults) ααΆαα½αααΉααααααααΈααα·ααααΆα
αααα»αααααΈααα ααΆαα ααααααΆα Postgres ααΉααα·αααααΌαααΆαααΆαααααα αΌααααα»αααΆααα·αααααΆαααααΆααααα·ααααααα αααα½αααΆαα!
αααααααααααα’αΆα ααα·αααααΆααααααΆααααΆαα ααααααΆα
ααΆααΆααα·αααΆαα ααΆαα·αααΆααα’ααΆαααααα’αααα’αΆα
αααααααααααααααΆααααααΌαααΆααα½ααα»ααααα·ααΆααααααΆααααα·ααααΆαααΈαα½αα ααα»ααααα
α»ααααΆαααΆααΎααΎαααΆαααα·ααααΆαααΆα
αααΎααααααΆααα·αααααΆ α αΎαααΎαα
αααααααααΌα
ααααΆαααααΆααααΆααα’ααααααΆα 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"
ααΆαααααααααααααααααααΆααααΆααΆααα½ααα»ααααα·ααΆαααααΆαα ααααααΆαααΆααα’αααα ααααα·αααα·ααααΆα
α
αΌααα·ααΆαααΆααΎααααααΎα ingress ααΆα
αααΎααα
αααα»αααΆαα
ααααααΆαααΆα
αααΎα - ααΎαα’αΆα
αααααααααααααααΆααααΆααΆαααΈαα½αα 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 }}
αααααααααΆαα
ααΆααααααα ααΆαα αΌααα αααα»αααΆααΆα postgres ααΊααΆα’αααΈααααα½αα±αααααααααααα»α ααΌα ααααα’ααααααααααααΌαααΆααααααα±αααααΆαααΆααααααΆα§ααΆα αααααΆααααααααα αααα»αααααααααααααα½α α αΎαααΎααααΈαα»αα±ααααααΆαααΆαα ααααααΆαααααΈαα½αα ααα½ααα αααα»αα’ααααααααααΆααααααΆααα·αααααΆα’αααΈ 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
- αα»αααΆααα·ααααααααΆαα go templates αα
αααα»α Helmfile ααααααααΈααΆ .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" }}
ααααα: www.habr.com