Skip to content

Kustomize Configuration Management

Introductie

Kustomize is een configuratie management tool voor Kubernetes die het mogelijk maakt om applicatie configuraties aan te passen zonder de originele YAML bestanden te wijzigen. Deze documentatie beschrijft de implementatie en het gebruik van Kustomize binnen de organisatie.

Basis Concepten

1. Directory Structuur

Een typische Kustomize project structuur:

project/
├── base/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
└── overlays/
    ├── development/
    │   └── kustomization.yaml
    └── production/
        └── kustomization.yaml

2. Base Configuratie

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml

commonLabels:
  app: example-app

3. Overlay Configuratie

# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

bases:
  - ../../base

patches:
  - path: replica-count.yaml

configMapGenerator:
  - name: app-config
    literals:
      - ENV=production

Werken met Patches

1. Strategic Merge Patches

Controleer eerst de structuur van de target resource voordat je een strategic merge patch implementeert:

# patches/deployment-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: project-name
spec:
  template:
    spec:
      containers:
      - name: main
        resources:
          limits:
            memory: "512Mi"
            cpu: "500m"

2. JSON Patches

# patches/service-patch.yaml
- op: replace
  path: /spec/ports/0/port
  value: 8080

3. Inline Patches

patches:
  - patch: |-
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: project-name-ingress
        annotations:
          nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8"

Configuratie Componenten

1. Resources

Basis Kubernetes resources definities:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-app
spec:
  template:
    spec:
      containers:
      - name: app
        image: example-app:latest
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

2. ConfigMap en Secret Generators

# kustomization.yaml
configMapGenerator:
  - name: app-config
    files:
      - config.properties
    literals:
      - API_URL=https://api.example.com
      - DEBUG=true

secretGenerator:
  - name: app-secrets
    files:
      - secret.properties
    type: Opaque

3. Image Transformers

# kustomization.yaml
images:
  - name: nginx
    newName: custom-registry/nginx
    newTag: v1.0.0

Veelgebruikte Use Cases

1. Ingress Configuratie

Configureer ingress instellingen met patches voor toegangscontrole en routing:

Ingress Controller

We gebruiken ingress-nginx als Ingress Controller. Voor meer informatie, zie de officiële documentatie: ingress-nginx

# patches/ingress-patch.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: project-name-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,192.168.1.0/24"
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"

2. Resource Aanpassingen

# patches/resources-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: project-name
spec:
  template:
    spec:
      containers:
      - name: main
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

3. Environment Variables

# patches/env-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: project-name
spec:
  template:
    spec:
      containers:
      - name: main
        env:
        - name: DEBUG
          value: "true"
        - name: API_URL
          value: "https://api.example.com"

Best Practices

1. Structuur

  • Implementeer een duidelijke base/overlay structuur
  • Gebruik betekenisvolle directory namen
  • Houd base configuraties minimaal
  • Documenteer overlay-specifieke aanpassingen

2. Configuratie Management

  • Gebruik ConfigMapGenerator voor omgevingsvariabelen
  • Implementeer SecretGenerator voor gevoelige data
  • Definieer resource limieten in base configuratie
  • Pas resource requests aan per omgeving

3. Versiebeheer

  • Gebruik specifieke image tags
  • Implementeer hash suffixes voor ConfigMaps
  • Documenteer breaking changes
  • Beheer dependencies expliciet

Deployment Workflow

1. Lokale Validatie

# Genereer en valideer configuratie
kustomize build overlays/development

# Dry-run deployment
kustomize build overlays/development | kubectl apply --dry-run=client -f -

2. Deployment

# Apply configuratie
kustomize build overlays/production | kubectl apply -f -

# Verificatie
kubectl get deployments,services,configmaps

Troubleshooting

1. Common Issues

Issue Oplossing
Resource conflict Controleer name prefixes
Patch error Verifieer resource selectors
ConfigMap mismatch Controleer hash suffixes

2. Debug Tools

# Debug output
kustomize build --enable-alpha-plugins overlays/production

# Diff changes
kustomize build overlays/production | kubectl diff -f -

3. Veelvoorkomende Problemen

  • Resource niet gevonden: Controleer resource namen in patches
  • Patch niet toegepast: Verifieer apiVersion en kind
  • Syntax fouten: Valideer YAML formatting
  • Verkeerde base path: Controleer relatieve paden

Integratie

1. ArgoCD

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-app
spec:
  source:
    path: overlays/production
    kustomize:
      commonLabels:
        environment: production

2. GitHub Actions

name: Deploy
on:
  push:
    branches: [ main ]

jobs:
  deploy:
    steps:
      - uses: actions/checkout@v3
      - name: Deploy
        run: |
          kustomize build overlays/production | kubectl apply -f -

Volgende Stappen

Externe Bronnen