â obal pro , kterĂœ umoĆŸĆuje na jednom mĂstÄ popisovat vĂce helm releasĆŻ, parametrizovat jejich chartery pro nÄkolik prostĆedĂ a takĂ© urÄovat poĆadĂ jejich nasazenĂ.
O samotnĂ©m helmfile a pĆĂkladech jeho pouĆŸitĂ si mĆŻĆŸete pĆeÄĂst v a .
My se seznĂĄmĂme s mĂ©nÄ zĆejmĂœmi zpĆŻsoby, jak popsat releasy v helmfile
PĆedstavme si, ĆŸe mĂĄme sadu helm-chartĆŻ (pro pĆĂklad pouĆŸijeme postgres a nÄjakou backend aplikaci) a nÄkolik prostĆedĂ (nÄkolik kubernetes clustera, nÄkolik namespaceâĆŻ nebo obojĂ). vezmeme helmfile, pĆeÄteme dokumentaci a zaÄneme popisovat naĆĄe prostĆedĂ a releasy:
.
âââ envs
â  âââ devel
â  â  âââ values
â  â  âââ backend.yaml
â  â  âââ postgres.yaml
â  âââ production
â  âââ values
â  âââ backend.yaml
â  âââ postgres.yaml
âââ helmfile.yamlhelmfile.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.yamlMĂĄme 2 prostĆedĂ: devel, production â v kaĆŸdĂ©m se nachĂĄzejĂ svĂĄ vlastnĂ nastavenĂ pro helm chartery releasĆŻ. Budeme je nasazovat takto:
helmfile -n -e applyRĆŻznĂ© verze helm chartĆŻ v rĆŻznĂœch prostĆedĂch
Co dÄlat, pokud chceme nasazovat rĆŻznĂ© verze backendu do rĆŻznĂœch prostĆedĂ? Jak parametrizovat verzi releasu? K tomu nĂĄm slouĆŸĂ hodnoty prostĆedĂ dostupnĂ© pĆes {{ .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 }}
...RĆŻznĂ© sady aplikacĂ v rĆŻznĂœch prostĆedĂch
SkvÄlĂ©, ale co kdyĆŸ nechceme production nasazovat postgres, protoĆŸe vĂme, ĆŸe nenĂ potĆeba databĂĄzi nasazovat do k8s a pro produkci mĂĄme skvÄlĂœ samostatnĂœ cluster postgres? Pro ĆeĆĄenĂ tohoto problĂ©mu mĂĄme ĆĄtĂtky (labels)
helmfile -n -e devel apply
helmfile -n -e production -l app=backend applyTo je skvÄlĂ©, ale osobnÄ preferuji popisovat, kterĂ© aplikace se nasazujĂ v prostĆedĂ, nikoli pomocĂ spouĆĄtÄcĂch argumentĆŻ, ale v popisu samotnĂœch prostĆedĂ. Co s tĂm? MĆŻĆŸeme umĂstit popis verzĂ do samostatnĂ© sloĆŸky, v popisu prostĆedĂ vytvoĆit seznam potĆebnĂœch verzĂ a "pĆipojit" pouze poĆŸadovanĂ© verze, zatĂmco ostatnĂ ignorujeme.
.
âââ 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.yamlreleases/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.yamlPoznĂĄmka
PĆi pouĆŸĂvĂĄnĂ bases: je nutnĂ© pouĆŸĂt yaml oddÄlovaÄ ---, aby bylo moĆŸnĂ© ĆĄablonizovat releases (a dalĆĄĂ ÄĂĄsti, jako helmDefaults) hodnotami z environments
V takovĂ©m pĆĂpadÄ se release postgres ani nedostane do popisu pro produkci. Velmi pohodlnĂ©!
PĆepisovatelnĂ© globĂĄlnĂ hodnoty pro releases
UrÄitÄ je skvÄlĂ©, ĆŸe mĆŻĆŸeme pro kaĆŸdĂ© prostĆedĂ nastavit hodnoty pro helm chart, ale co kdyĆŸ mĂĄme popsĂĄno nÄkolik prostĆedĂ a chceme napĆĂklad nastavit stejnou hodnotu pro vĆĄechny affinity, ale nechceme ji nastavovat jako vĂœchozĂ v samotnĂœch chartech, kterĂ© se nachĂĄzejĂ v repozitĂĄĆĂch.
V takovĂ©m pĆĂpadÄ bychom mohli pro kaĆŸdĂœ release nastavit 2 soubory s values: prvnĂ s vĂœchozĂmi hodnotami, kterĂ© urÄujĂ hodnoty samotnĂ©ho chartu, a druhĂœ se hodnotami pro prostĆedĂ, kterĂœ nĂĄslednÄ pĆepĂĆĄe defaulty.
.
âââ 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.yamlreleases/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.yamlenvs/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"Definice globĂĄlnĂch hodnot pro helm grafy vĆĄech vydĂĄnĂ na Ășrovni prostĆedĂ
PĆedstavme si, ĆŸe mĂĄme v nÄkolika vydĂĄnĂch vytvoĆen nÄkolik ingress â mohli bychom pro kaĆŸdĂœ graf ruÄnÄ definovat hosts:, ale v naĆĄem pĆĂpadÄ je domĂ©na stejnĂĄ, tak proÄ ji nevytĂĄhnout do globĂĄlnĂ promÄnnĂ© a jednoduĆĄe ji pouĆŸĂt v grafech? K tomu by mÄly mĂt soubory s hodnotami, kterĂ© chceme parametrizovat, pĆĂponu .gotmpl, aby helmfile vÄdÄl, ĆŸe je tĆeba je projĂt ĆĄablonizĂĄtorem.
.
âââ 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.yamlhelmfile.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 }}PoznĂĄmka
Je zĆejmĂ©, ĆŸe ingress v chartÄ postgres je nÄco velmi problematickĂ©ho, a proto je v ÄlĂĄnku uvedeno jen jako hypotetickĂœ pĆĂklad v prĂĄzdnĂ©m prostoru, aby se do textu nezavĂĄdÄla nÄjakĂĄ novĂĄ verze pouze kvĆŻli popisu ingress.
VklĂĄdĂĄnĂ tajemstvĂ (secrets) z promÄnnĂœch prostĆedĂ.
Analogicky k vĂœĆĄe uvedenĂ©mu pĆĂkladu lze takĂ© vklĂĄdat zaĆĄifrovanĂ© pomocĂ hodnoty. MĂsto toho, abychom pro kaĆŸdĂ© vydĂĄnĂ vytvĂĄĆeli svĆŻj soubor secrets, ve kterĂ©m bychom definovali zaĆĄifrovanĂ© hodnoty pro chart, mĆŻĆŸeme jednoduĆĄe definovat v souboru default.yaml.gotmpl hodnoty, kterĂ© budou brĂĄny z promÄnnĂœch nastavenĂœch na Ășrovni prostĆedĂ. A hodnoty, kterĂ© nechceme skrĂœvat, mĆŻĆŸeme jiĆŸ pohodlnÄ pĆedefinovat ve specifickĂœch hodnotĂĄch vydĂĄnĂ pro danĂ© prostĆedĂ.
.
âââ 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.yamlhelmfile.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.domainenvs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domainPoznĂĄmka
Mimochodem, getOrNil â speciĂĄlnĂ funkce pro go ĆĄablony v helmfile, kterĂĄ, i kdyĆŸ .Values.secrets nebude existovat, nevygeneruje chybu, a umoĆŸnĂ tak pomocĂ funkce default vloĆŸenĂ vĂœchozĂ hodnoty.
ZĂĄvÄr
PopisovanĂ© vÄci se zdajĂ bĂœt docela zĆejmĂ©, ale informace o pohodlnĂ©m popisu nasazenĂ do nÄkolika prostĆedĂ pomocĂ helmfile jsou velmi skromnĂ©, a jĂĄ miluji IaC (Infrastructure-as-Code) a chci mĂt jasnĂœ popis stavu nasazenĂ.
Na zĂĄvÄr chci dodat, ĆŸe promÄnnĂ© pro vĂœchozĂ prostĆedĂ lze naopak parametrizovat promÄnnĂœmi prostĆedĂ OS nÄjakĂ©ho runnera, ze kterĂ©ho bude nasazenĂ spuĆĄtÄno, a tĂmto zpĆŻsobem zĂskat dynamickĂĄ prostĆedĂ.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}Zdroj: habr.com
