🟡 Intermediate

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 kubectlkubectl apply -k funguje 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

  1. Base by mal byť deployovateľný — aj bez overlays musí fungovať
  2. Minimálne patches — meňte len to, čo sa líši medzi prostrediami
  3. Pinujte remote bases — vždy ?ref=tag, nikdy main
  4. Používajte commonLabels opatrne — ovplyvňujú selektory, čo môže rozbíť rolling updates
  5. Hash suffixes pre ConfigMaps — nikdy nevypínajte, zabezpečujú rolling update pri zmene konfigurácie
  6. Testujte build v CI — každý PR by mal validovať kustomize build pre všetky overlays
  7. Components pre cross-cutting concerns — monitoring, network policies, security contexts
  8. 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.