Umbrella chart
Az umbrella chart fő célja, hogy összefogjon több másik chartot (subchartokat). Leggyakrabban arra használják, hogy egy teljes microservice architektúrát (például egy webshopot, ami áll egy frontendből, egy backendből és egy adatbázisból) egyetlen helm install paranccsal lehessen telepíteni és egyben verziózni.
Bár a nagykönyv szerint az umbrella chartnak általában nincsenek saját template-jei, a gyakorlatban nagyon is hasznos tud lenni, ha ide teszünk be olyan globális erőforrásokat, amiket a subchartok közösen használnak (pl. egy közös Ingress szabály, vagy egy globális ConfigMap).
A példa forgatókönyve: "my-web-app"
Képzeljük el, hogy van egy umbrella chartunk, aminek a neve my-web-app. Ez két alkalmazást fog össze: egy frontendet és egy backendet.
1. A mappastruktúra
Így néz ki a fő chartunk mappája:
my-web-app/
├── Chart.yaml # Itt definiáljuk a subchartokat
├── values.yaml # Itt írjuk felül a subchartok alapbeállításait
├── charts/ # Ide tölti le a Helm a subchartokat (automatikusan)
└── templates/
└── shared-config.yaml # Egy saját, közös erőforrás az umbrella chartban
2. Chart.yaml (A függőségek definiálása)
Ez az umbrella chart "szíve". Itt mondjuk meg, hogy mik a subchartok.
apiVersion: v2
name: my-web-app
description: Umbrella chart a frontend és backend együttes telepítéséhez
type: application
version: 1.0.0
# Itt soroljuk fel a subchartokat (dependency-ket)
dependencies:
- name: frontend
version: "1.2.3"
repository: "https://my-company.github.io/helm-charts" # Honnan töltse le?
- name: backend
version: "2.0.0"
repository: "https://my-company.github.io/helm-charts"
repository lehet egy távoli URL, de lehet egy helyi mappaútvonal is (pl. file://../frontend), ha helyben fejleszted őket. 3. values.yaml (A custom értékek)
Itt jön a varázslat. Az umbrella chart values.yaml fájljából felül tudjuk írni a subchartok saját beállításait. A szabály nagyon egyszerű: a subchart neve lesz a fő kulcs, és alá kerül minden, ami ahhoz a charthoz tartozik.
# 1. Globális értékek, amit minden subchart (és maga az umbrella is) lát
global:
environment: "production"
companyName: "TechCorp"
# 2. A "frontend" subchart értékeinek felülírása
frontend:
replicaCount: 3 # A frontendből 3 podot kérünk
image:
tag: "latest"
service:
type: LoadBalancer
# 3. A "backend" subchart értékeinek felülírása
backend:
replicaCount: 2 # A backendből elég 2 pod is
databaseUrl: "postgresql://db:5432/mydb"
4. templates/shared-config.yaml (Saját erőforrás az umbrella-ban)
A példában teszünk valamit az umbrella chart templates mappájába is (de sok esetben nincs erre szükség, viszont pl backend + frontend esetén akár a közös ingress is jól jön). Most csináljunk egy közös ConfigMap-et, amit esetleg mindkét alkalmazás be tud csatolni magának, és használjuk benne a global értékeket.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-shared-config
labels:
app: {{ .Chart.Name }}
data:
# Itt behúzzuk az umbrella values.yaml-ből a global.environment értékét
ENVIRONMENT: {{ .Values.global.environment | quote }}
COMPANY: {{ .Values.global.companyName | quote }}
MESSAGE: "Ezt a ConfigMap-et az Umbrella chart generálta!"
Hogyan működik ez a gyakorlatban?
-
Függőségek letöltése: Mielőtt telepítenéd, a Helmnek le kell töltenie a subchartokat a
Ez létrehoz egyChart.yaml-ben megadott repókból.Chart.lockfájlt, és letölti a frontend/backend chartokat acharts/mappába.tgzformátumban. -
Sablonok ellenőrzése (Template): Ha látni akarod, hogyan fésüli össze a Helm az umbrella és a subchartok fájljait:
Ez kilistázza a frontend Deploymentjét (3 replikával), a backend Deploymentjét (2 replikával), és az umbrella chartban lévőshared-configConfigMap-et is. -
Telepítés:
Összegzés: Ezzel a módszerrel egyetlen paranccsal felhúztad a teljes rendszert úgy, hogy az egyes alkalmazások (subchartok) paramétereit egyetlen, központi values.yaml fájlból vezérelted, és még közös kiegészítőket (ConfigMap) is hozzáadtál a fő szinten.