Makabasa ka bahin sa helmfile mismo ug mga pananglitan sa paggamit niini sa
Masinati namon ang dili klaro nga mga paagi sa paghulagway sa mga pagpagawas sa helmfile
Ingnon ta nga kita adunay usa ka pakete sa mga tsart sa timon (pananglitan, ingnon ta nga mga postgres ug pipila ka aplikasyon sa backend) ug daghang mga palibot (daghang kubernetes clusters, daghang mga namespace, o ubay-ubay sa duha). Gikuha namo ang helmfile, gibasa ang dokumentasyon ug nagsugod sa paghulagway sa among mga palibot ug mga pagpagawas:
.
├── 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
Natapos namon ang 2 ka palibot: molambo, produksyon - Ang matag usa adunay kaugalingon nga mga kantidad alang sa mga tsart sa pagpagawas sa timon. Atong ipakaylap ngadto kanila sama niini:
helmfile -n <namespace> -e <env> apply
Nagkalainlain nga mga bersyon sa mga tsart sa timon sa lainlaing mga palibot
Unsa kaha kung kinahanglan naton i-roll out ang lainlaing mga bersyon sa backend sa lainlaing mga palibot? Giunsa ang pag-parameter sa bersyon sa pagpagawas? Ang mga bili sa kinaiyahan nga magamit pinaagi sa {{ .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 }}
...
Lahi nga hugpong sa mga aplikasyon sa lainlaing mga palibot
Nindot, apan unsa man kung dili naton kinahanglan production
i-roll out ang mga postgres, tungod kay nahibal-an namon nga dili kinahanglan nga iduso ang database sa mga k8 ug ibaligya kami adunay usa ka matahum nga lahi nga postgres cluster? Aron masulbad kini nga problema kami adunay mga label
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Nindot kini, apan sa personal mas gusto nako nga ihulagway kung unsang mga aplikasyon ang i-deploy sa palibot nga dili gamit ang mga argumento sa paglansad, apan sa paghulagway sa mga palibot mismo. Unsay buhaton? Mahimo nimong ibutang ang mga deskripsyon sa pagpagawas sa usa ka bulag nga folder, paghimo usa ka lista sa mga kinahanglan nga pagpagawas sa paghulagway sa palibot ug "kuhaa" lamang ang kinahanglan nga mga pagpagawas, wala magtagad sa nahabilin
.
├── 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
Ang mubo nga sulat
Sa paggamit bases:
gikinahanglan nga gamiton ang yaml separator ---
, aron mahimo nimo ang mga pagpagawas sa template (ug uban pang mga bahin, sama sa helmDefaults) nga adunay mga kantidad gikan sa mga palibot
Niini nga kaso, ang pagpagawas sa mga postgres dili gani iapil sa paghulagway alang sa produksyon. Komportable kaayo!
Ma-overridable nga global nga mga kantidad alang sa pagpagawas
Siyempre, maayo nga mahimo nimong itakda ang mga kantidad alang sa mga tsart sa timon alang sa matag palibot, apan unsa man kung adunay daghang mga palibot nga gihulagway, ug gusto namon, pananglitan, nga itakda ang parehas alang sa tanan. affinity
, apan dili namo gusto nga i-configure kini pinaagi sa default sa mga tsart mismo, nga gitipigan sa mga turnip.
Sa kini nga kaso, alang sa matag pagpagawas mahimo namon nga mahibal-an ang 2 nga mga file nga adunay mga kantidad: ang una nga adunay mga default nga kantidad, nga magtino sa mga kantidad sa tsart mismo, ug ang ikaduha nga adunay mga kantidad alang sa kalikopan, nga sa baylo mag-override sa mga default.
.
├── 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"
Paghubit sa mga global nga kantidad alang sa mga tsart sa timon sa tanan nga gipagawas sa lebel sa kalikopan
Ingnon ta nga naghimo kami daghang mga pagsulod sa daghang mga pagpagawas - mahimo namon nga mano-mano nga ipasabut ang matag tsart hosts:
, apan sa among kaso ang domain parehas, busa nganong dili kini ibutang sa pipila ka global nga variable ug ilisan lang ang bili niini ngadto sa mga tsart? Aron mahimo kini, ang mga file nga adunay mga kantidad nga gusto namon i-parameter kinahanglan adunay extension .gotmpl
, aron ang helmfile makahibalo nga kini kinahanglan nga ipadagan pinaagi sa template engine.
.
├── 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 }}
Ang mubo nga sulat
Dayag nga, ang pagsulod sa postgres chart usa ka butang nga labi ka kaduhaduhaan, mao nga kini nga artikulo gihatag lamang ingon usa ka spherical nga pananglitan sa usa ka haw-ang ug aron dili ipakilala ang pipila ka bag-ong pagpagawas sa artikulo alang lamang sa paghulagway sa pagsulod
Pag-ilis sa mga sekreto gikan sa mga bili sa palibot
Pinaagi sa pagkasama sa pananglitan sa ibabaw, mahimo nimong ilisan ang mga naka-encrypt nga gigamit
.
├── 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
Ang mubo nga sulat
Hinuon, getOrNil
- usa ka espesyal nga function alang sa go templates sa helmfile, nga, bisan kung .Values.secrets
dili maglungtad, dili maglabay sa usa ka sayup, apan tugotan ang resulta gamit ang function default
ilisan ang default nga bili
konklusyon
Ang mga butang nga gihulagway ingon og klaro kaayo, apan ang kasayuran sa usa ka kombenyente nga paghulagway sa pag-deploy sa daghang mga palibot gamit ang helmfile nihit kaayo, ug ganahan ko sa IaC (Infrastructure-as-Code) ug gusto nga adunay tin-aw nga paghulagway sa estado sa pag-deploy.
Sa konklusyon, gusto nako nga idugang nga ang mga variable alang sa default nga palibot mahimo, sa baylo, ma-parameter sa mga variable sa palibot sa OS sa usa ka runner diin gikan ang paglansad, ug sa ingon makakuha mga dinamikong palibot.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Source: www.habr.com