Unaweza kusoma kuhusu helmfile yenyewe na mifano ya matumizi yake katika
Tutafahamiana na njia zisizo wazi za kuelezea matoleo kwenye helmfile
Wacha tuseme tuna pakiti ya chati za usukani (kwa mfano, wacha tuseme postgres na programu zingine za nyuma) na mazingira kadhaa (vikundi kadhaa vya kubernetes, nafasi kadhaa za majina, au kadhaa kati ya zote mbili). Tunachukua faili ya helm, kusoma hati na kuanza kuelezea mazingira yetu na matoleo:
.
├── 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
Tulimaliza na mazingira 2: maendeleo, uzalishaji - kila moja ina thamani zake za chati za kutolewa kwa usukani. Tutapeleka kwao kama hii:
helmfile -n <namespace> -e <env> apply
Matoleo tofauti ya chati za usukani katika mazingira tofauti
Je, ikiwa tunahitaji kusambaza matoleo tofauti ya mandharinyuma kwa mazingira tofauti? Jinsi ya kuainisha toleo la kutolewa? Maadili ya mazingira yanayopatikana kupitia {{ .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 }}
...
Seti tofauti za maombi katika mazingira tofauti
Nzuri, lakini vipi ikiwa hatuitaji production
toa posta, kwa sababu tunajua kwamba hatuhitaji kusukuma hifadhidata kwenye k8s na kwa kuuza tuna nguzo ya ajabu tofauti ya posta? Ili kutatua tatizo hili tuna lebo
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Hii ni nzuri, lakini kibinafsi napendelea kuelezea ni programu gani za kupeleka katika mazingira bila kutumia hoja za uzinduzi, lakini katika maelezo ya mazingira yenyewe. Nini cha kufanya? Unaweza kuweka maelezo ya toleo katika folda tofauti, kuunda orodha ya matoleo muhimu katika maelezo ya mazingira na "kuchukua" matoleo muhimu pekee, ukipuuza mengine.
.
├── 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
noti
Wakati wa kutumia bases:
ni muhimu kutumia kitenganishi cha yaml ---
, ili uweze kuiga matoleo (na sehemu zingine, kama vile helmDefaults) na maadili kutoka kwa mazingira.
Katika kesi hii, kutolewa kwa postgres hata kujumuishwa katika maelezo ya uzalishaji. Raha sana!
Thamani za kimataifa zinazoweza kubatilishwa kwa matoleo
Kwa kweli, ni vizuri kwamba unaweza kuweka maadili ya chati za usukani kwa kila mazingira, lakini vipi ikiwa tunayo mazingira kadhaa yaliyoelezewa, na tunataka, kwa mfano, kuweka sawa kwa wote. affinity
, lakini hatutaki kuisanidi kwa chaguo-msingi katika chati zenyewe, ambazo zimehifadhiwa katika turnips.
Katika hali hii, kwa kila toleo tunaweza kubainisha faili 2 zenye thamani: ya kwanza ikiwa na thamani chaguo-msingi, ambayo itaamua thamani za chati yenyewe, na ya pili yenye thamani za mazingira, ambayo nayo itabatilisha chaguo-msingi.
.
├── 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"
Kufafanua thamani za kimataifa za chati za usukani za matoleo yote katika kiwango cha mazingira
Wacha tuseme tunaunda ingress kadhaa katika matoleo kadhaa - tunaweza kufafanua kwa kila chati hosts:
, lakini kwa upande wetu kikoa ni sawa, kwa nini usiiweke katika mabadiliko fulani ya kimataifa na ubadilishe tu thamani yake kwenye chati? Ili kufanya hivyo, faili hizo zilizo na maadili ambazo tunataka kuainisha zitalazimika kuwa na kiendelezi .gotmpl
, ili helmfile ijue kuwa inahitaji kuendeshwa kupitia injini ya kiolezo.
.
├── 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 }}
noti
Ni wazi, kuingia kwenye chati ya postgres ni jambo la kutia shaka sana, kwa hivyo kifungu hiki kinatolewa kama mfano wa duara kwenye utupu na ili sio kuanzisha toleo jipya kwenye kifungu kwa sababu ya kuelezea ingress.
Kubadilisha siri kutoka kwa maadili ya mazingira
Kwa mlinganisho na mfano hapo juu, unaweza kubadilisha zile zilizosimbwa kwa kutumia
.
├── 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
noti
Kwa njia, getOrNil
- kazi maalum kwa ajili ya kwenda templates katika helmfile, ambayo, hata kama .Values.secrets
haitakuwapo, haitatupa kosa, lakini itaruhusu matokeo kwa kutumia kazi default
badilisha thamani chaguo-msingi
Hitimisho
Mambo yaliyoelezewa yanaonekana dhahiri, lakini habari juu ya maelezo rahisi ya kupelekwa kwa mazingira kadhaa kwa kutumia helmfile ni haba sana, na ninapenda IaC (Miundombinu-kama-Msimbo) na ninataka kuwa na maelezo wazi ya hali ya kupelekwa.
Kwa kumalizia, ningependa kuongeza kwamba vigezo vya mazingira chaguo-msingi vinaweza, kwa upande wake, kuainishwa na vigezo vya mazingira ya OS ya mkimbiaji fulani ambayo kupelekwa kutazinduliwa, na hivyo kupata mazingira yenye nguvu.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Chanzo: mapenzi.com