Helmdatei - ein Wrapper fΓΌr das Ruder , mit dem Sie viele Helmfreigaben an einem Ort beschreiben, ihre Diagramme fΓΌr mehrere Umgebungen parametrisieren und auch die Reihenfolge ihrer Bereitstellung festlegen kΓΆnnen.
Sie kΓΆnnen ΓΌber helmfile selbst und Beispiele fΓΌr seine Verwendung in der lesen readme und Best Practices Guide .
Wir werden uns mit nicht offensichtlichen MΓΆglichkeiten vertraut machen, VerΓΆffentlichungen in der Helmdatei zu beschreiben
Angenommen, wir haben eine Reihe von Helmdiagrammen (z. B. Postgres und eine Art Backend-Anwendung) und mehrere Umgebungen (mehrere Kubernetes-Cluster, mehrere Namespace'ov oder mehrere von beiden). Wir nehmen Helmdatei, lesen die Dokumentation und beginnen, unsere Umgebungen und Releases zu beschreiben:
.
βββ 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
Wir haben zwei Umgebungen: Entwicklung , Produktion - jede hat ihre eigenen Werte fΓΌr Helm-Release-Charts. Wir werden sie wie folgt bereitstellen:
helmfile -n <namespace> -e <env> apply
Verschiedene Versionen von Helmkarten in verschiedenen Umgebungen
Was ist, wenn wir verschiedene Versionen des Backends in verschiedenen Umgebungen einfΓΌhren mΓΌssen? Wie parametriere ich die Release-Version? Umgebungswerte verfΓΌgbar durch{{ .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 }}
...
Eine andere Reihe von Anwendungen in verschiedenen Umgebungen
, production
postgres, , k8s postgres? (labels)
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 ---
, releases ( , helmDefaults) environments
postgres production. !
, , helm , , , , affinity
, - , .
2 values: , , , .
.
βββ 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
, ingress β hosts:
, , ? values, , .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 }}
, ingress postgres β , , - ingress
(secrets)
helm secrets . , secrets, , 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
β go helmfile, , .Values.secrets
, , default
-
Die beschriebenen Dinge scheinen ziemlich offensichtlich zu sein, aber die Informationen zu einer praktischen Bereitstellungsbeschreibung in mehreren Umgebungen mit Helmdatei sind sehr knapp, und ich liebe IaC (Infrastructure-as-Code) und mΓΆchte eine klare Beschreibung des Bereitstellungsstatus haben.
AbschlieΓend mΓΆchte ich hinzufΓΌgen, dass die Variablen fΓΌr die Standardumgebung wiederum durch die Betriebssystemumgebungsvariablen eines LΓ€ufers parametrisiert werden kΓΆnnen, von dem aus die Bereitstellung gestartet wird, und somit dynamische Umgebungen erhalten
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}