Voit lukea itse helmfilesta ja esimerkkejä sen käytöstä
Tutustumme ei-ilmeisiin tapoihin kuvata julkaisuja helmfilessä
Oletetaan, että meillä on paketti ruorikaavioita (kuten esimerkiksi postgres ja jokin taustasovellus) ja useita ympäristöjä (useita kubernetes-klustereita, useita nimiavaruuksia tai useita molempia). Otamme ruoritiedoston, luemme dokumentaation ja alamme kuvailla ympäristöjämme ja julkaisujamme:
.
├── 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
Päädyimme kahteen ympäristöön: devel, tuotanto - jokainen sisältää omat arvonsa ruorin vapautuskaavioille. Jaamme heille näin:
helmfile -n <namespace> -e <env> apply
Ruorikarttojen eri versioita eri ympäristöissä
Entä jos meidän on otettava käyttöön taustajärjestelmän eri versioita eri ympäristöissä? Kuinka parametroida julkaisuversio? Ympäristöarvot saatavilla kautta {{ .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 }}
...
Erilaisia sovelluksia eri ympäristöissä
Hienoa, mutta entä jos meidän ei tarvitsekaan production
ottaa postgres käyttöön, koska tiedämme, että meidän ei tarvitse työntää tietokantaa k8s:iin ja meillä on myynnissä upea erillinen postgres-klusteri? Tämän ongelman ratkaisemiseksi meillä on tarrat
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Tämä on hienoa, mutta henkilökohtaisesti mieluummin kuvailen, mitkä sovellukset otetaan käyttöön ympäristössä, ei käynnistysargumenttien avulla, vaan itse ympäristöjen kuvauksessa. Mitä tehdä? Voit sijoittaa julkaisukuvaukset erilliseen kansioon, luoda ympäristökuvaukseen luettelon tarvittavista julkaisuista ja "poimia" vain tarpeelliset julkaisut, muut huomiotta
.
├── 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
Muistilappu
Käytettäessä bases:
on tarpeen käyttää yaml-erotinta ---
, jotta voit mallintaa julkaisut (ja muut osat, kuten helmDefaults) ympäristöjen arvoilla
Tässä tapauksessa postgres-julkaisua ei edes sisällytetä tuotannon kuvaukseen. Erittäin mukavasti!
Ohitattavat maailmanlaajuiset arvot julkaisuille
Tietysti on hienoa, että voit asettaa arvot ruorikaavioille kullekin ympäristölle, mutta entä jos meillä on kuvattu useita ympäristöjä ja haluamme esimerkiksi asettaa saman kaikille affinity
, mutta emme halua määrittää sitä oletuksena itse kaavioissa, jotka tallennetaan nauriisiin.
Tässä tapauksessa kullekin julkaisulle voisimme määrittää 2 tiedostoa, joissa on arvot: ensimmäinen oletusarvoilla, jotka määrittävät itse kaavion arvot, ja toinen ympäristön arvoilla, jotka puolestaan ohittavat oletusarvoiset.
.
├── 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"
Maailmanlaajuisten arvojen määrittäminen kaikkien julkaisujen ruorikaavioille ympäristötasolla
Oletetaan, että luomme useita sisääntuloja useissa julkaisuissa - voimme määrittää manuaalisesti kullekin kaaviolle hosts:
, mutta meidän tapauksessamme verkkotunnus on sama, joten miksi et laittaisi sitä johonkin globaaliin muuttujaan ja yksinkertaisesti korvaisi sen arvon kaavioissa? Tätä varten tiedostoilla, joilla on arvoja, jotka haluamme parametroida, on oltava tunniste .gotmpl
, jotta ruoritiedosto tietää, että se on ajettava mallimoottorin läpi.
.
├── 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 }}
Muistilappu
Ilmeisesti ingress postgres-kaaviossa on jotain erittäin kyseenalaista, joten tämä artikkeli on annettu yksinkertaisesti pallomaisena esimerkkinä tyhjiössä ja jotta artikkeliin ei tuoda jotain uutta julkaisua vain ingressin kuvaamisen vuoksi
Salaisuuksien korvaaminen ympäristöarvoilla
Analogisesti yllä olevan esimerkin kanssa voit korvata salatut käyttämällä
.
├── 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
Muistilappu
muuten, getOrNil
- erityinen toiminto go-malleille helmfilessä, joka vaikka .Values.secrets
ei ole olemassa, ei aiheuta virhettä, mutta sallii tuloksen funktion avulla default
korvaa oletusarvo
Johtopäätös
Kuvatut asiat näyttävät varsin ilmeisiltä, mutta tietoa kätevästä käyttöönoton kuvauksesta useisiin ympäristöihin helmfileä käyttämällä on hyvin vähän, ja rakastan IaC:tä (Infrastructure-as-Code) ja haluan selkeän kuvauksen käyttöönottotilasta.
Lopuksi haluan lisätä, että oletusympäristön muuttujat voidaan puolestaan parametroida tietyn juoksijan käyttöjärjestelmän ympäristömuuttujilla, josta käyttöönotto käynnistetään, ja siten saada dynaamisia ympäristöjä.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Lähde: will.com