Kustomize — Natívna konfigurácia Kubernetes
Kustomize je nástroj zabudovaný priamo do kubectl, ktorý umožňuje prispôsobovať Kubernetes manifesty bez použitia šablón. Namiesto templatovania (ako Helm) používa prístup overlay patching — máte základnú konfiguráciu (base) a na ňu aplikujete vrstvy zmien pre rôzne prostredia.
Prečo Kustomize
Helm je výborný na zdieľanie aplikácií ako balíčkov, ale pre interné tímy, ktoré spravujú vlastné manifesty, je často zbytočne komplexný. Kustomize rieši bežné scenáre jednoduchšie:
- Žiadne šablóny — pracujete s platnými YAML súbormi, nie s Go templates
- Natívny v kubectl —
kubectl apply -kfunguje bez inštalácie čohokoľvek - Overlay model — base konfigurácia + per-environment patches
- Composable — bases sa dajú skladať a zdieľať medzi tímami
- GitOps friendly — deklaratívne, verzionovateľné, bez stavu
Kustomize vs Helm
| Aspekt | Kustomize | Helm |
|---|---|---|
| Prístup | Overlay patching | Templatovanie |
| Krivka učenia | Nízka | Stredná |
| Validný YAML | Áno, vždy | Nie (Go templates) |
| Package management | Nie | Áno (charts) |
| Rollback | Cez Git | Natívny (helm rollback) |
| Community charts | Nie | Bohatý ekosystém |
| Zabudovaný v kubectl | Áno | Vyžaduje inštaláciu |
Štruktúra projektu
Typická Kustomize štruktúra pre multi-environment deployment:
k8s/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
├── overlays/
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── replica-patch.yaml
│ │ └── env-configmap.yaml
│ ├── staging/
│ │ ├── kustomization.yaml
│ │ └── replica-patch.yaml
│ └── production/
│ ├── kustomization.yaml
│ ├── replica-patch.yaml
│ ├── hpa.yaml
│ └── resource-limits-patch.yaml
Base kustomization.yaml
# k8s/base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
commonLabels:
app: my-api
managed-by: kustomize
images:
- name: my-api
newName: registry.example.com/my-api
newTag: latest
Base deployment
# k8s/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api
image: my-api
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
Overlays a patches
Production overlay
# k8s/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
- hpa.yaml
namespace: production
namePrefix: prod-
patches:
- path: replica-patch.yaml
- path: resource-limits-patch.yaml
images:
- name: my-api
newName: registry.example.com/my-api
newTag: v2.3.1
configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=warn
- ENABLE_DEBUG=false
- DATABASE_POOL_SIZE=20
Strategic merge patch
# k8s/overlays/production/replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
replicas: 5
JSON 6902 patch
Pre presnejšie úpravy:
# k8s/overlays/production/resource-limits-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
template:
spec:
containers:
- name: my-api
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: "2"
memory: 1Gi
Generátory
Kustomize vie generovať ConfigMaps a Secrets s automatickým hashovaním:
# kustomization.yaml
configMapGenerator:
- name: app-config
files:
- config.properties
literals:
- API_URL=https://api.example.com
secretGenerator:
- name: db-credentials
literals:
- username=admin
- password=s3cr3t
type: Opaque
Výsledný ConfigMap dostane hash suffix (napr. app-config-k5m8h2). Pri zmene obsahu sa vytvorí nový ConfigMap s novým hashom, čo automaticky triggeruje rolling update Deploymentu.
Pokročilé techniky
Components (znovupoužiteľné kusy)
# components/monitoring/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
patches:
- target:
kind: Deployment
patch: |
- op: add
path: /spec/template/metadata/annotations/prometheus.io~1scrape
value: "true"
- op: add
path: /spec/template/metadata/annotations/prometheus.io~1port
value: "9090"
resources:
- servicemonitor.yaml
# overlays/production/kustomization.yaml
components:
- ../../components/monitoring
- ../../components/network-policies
Remote bases
# Referencia na Git repozitár
resources:
- github.com/myorg/k8s-common/base?ref=v1.2.0
Replacements (nový spôsob)
Od Kustomize v5 nahrádzajú vars:
replacements:
- source:
kind: ConfigMap
name: app-config
fieldPath: data.API_URL
targets:
- select:
kind: Deployment
name: my-api
fieldPaths:
- spec.template.spec.containers.[name=my-api].env.[name=API_URL].value
Integrácia s CI/CD
GitHub Actions
# .github/workflows/deploy.yaml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set image tag
working-directory: k8s/overlays/production
run: |
cd k8s/overlays/production
kustomize edit set image my-api=registry.example.com/my-api:${{ github.sha }}
- name: Build and validate
run: |
kustomize build k8s/overlays/production > /tmp/manifests.yaml
kubectl apply --dry-run=client -f /tmp/manifests.yaml
- name: Deploy
run: kubectl apply -k k8s/overlays/production
ArgoCD integrácia
ArgoCD natívne podporuje Kustomize:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-api-production
spec:
source:
repoURL: https://github.com/myorg/my-api
path: k8s/overlays/production
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: production
Validácia a testovanie
# Build a preview výstupu
kustomize build k8s/overlays/production
# Dry-run proti klastru
kubectl apply -k k8s/overlays/production --dry-run=server
# Diff proti aktuálnemu stavu
kubectl diff -k k8s/overlays/production
# Validácia s kubeval/kubeconform
kustomize build k8s/overlays/production | kubeconform -strict
Pre-commit hook
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: kustomize-build
name: Validate kustomize overlays
entry: bash -c 'for d in k8s/overlays/*/; do kustomize build "$d" > /dev/null || exit 1; done'
language: system
pass_filenames: false
Best practices
- Base by mal byť deployovateľný — aj bez overlays musí fungovať
- Minimálne patches — meňte len to, čo sa líši medzi prostrediami
- Pinujte remote bases — vždy
?ref=tag, nikdymain - Používajte
commonLabelsopatrne — ovplyvňujú selektory, čo môže rozbíť rolling updates - Hash suffixes pre ConfigMaps — nikdy nevypínajte, zabezpečujú rolling update pri zmene konfigurácie
- Testujte build v CI — každý PR by mal validovať
kustomize buildpre všetky overlays - Components pre cross-cutting concerns — monitoring, network policies, security contexts
- Nepatchujte to, čo môžete abstrahovať — ak sa niečo mení v každom prostredí, zvážte configMapGenerator
Kedy zvoliť Kustomize vs Helm
Kustomize je lepšia voľba keď:
- Spravujete interné aplikácie s rôznymi prostrediami
- Chcete pracovať s čistým YAML
- Používate GitOps (ArgoCD/Flux natívne podporujú)
- Tím nie je oboznámený s Go templates
Helm je lepšia voľba keď:
- Zdieľate aplikácie ako balíčky
- Potrebujete komplexnú logiku (conditionals, loops)
- Chcete využiť community charts
- Potrebujete lifecycle management (install, upgrade, rollback)
Hybridný prístup: Renderujte Helm chart cez helm template a výstup manažujte cez Kustomize overlays — best of both worlds.
Zhrnutie
Kustomize ponúka elegantný, template-free prístup ku konfigurácii Kubernetes. Je zabudovaný do kubectl, pracuje s validným YAML a výborne sa integruje s GitOps workflows. Pre tímy, ktoré spravujú vlastné aplikácie naprieč viacerými prostrediami, je často jednoduchší a udržiavateľnejší alternatívou k Helm.