Veröffentlicht am

Docker und Kubernetes für Tourismus-KMU: Saisonale Skalierung

Teilen:
Authors

Docker und Kubernetes fuer Tourismus-KMU: Container-Strategie mit saisonaler Skalierung

TL;DR

  • Saisonale Workloads (Sommer, Feiertage) eignen sich ideal fuer Horizontal Pod Autoscaling und Cluster Autoscaler -- statt dauerhaft fuer Peak-Last zu provisionieren
  • Ein Buchungssystem laesst sich sauber in Microservices zerlegen: Booking-API, Payment-Service, Inventory-Service, Notification-Service
  • Mit KEDA (Kubernetes Event Driven Autoscaling) koennt ihr auf Metriken wie Queue-Laenge oder HTTP-Request-Rate skalieren -- nicht nur auf CPU/Memory
  • Die gesamte Infrastruktur ist per Helm Chart reproduzierbar, was Staging/Prod Parity drastisch vereinfacht
  • Realistische Kostenersparnis durch bedarfsgerechte Skalierung: 25-40% gegenueber statisch provisionierter Infrastruktur

Das Problem: Statische Infrastruktur bei dynamischer Nachfrage

Tourismus-Unternehmen haben ein klares Lastprofil: Im Sommer und rund um Feiertage steigt der Traffic auf Buchungsportale um das 5-10-fache. In der Nebensaison laeuft die gleiche Infrastruktur mit 10-20% Auslastung. Wer statisch provisioniert, zahlt entweder das ganze Jahr fuer Peak-Kapazitaet oder riskiert Ausfaelle, wenn es drauf ankommt.

Containerisierung loest dieses Problem grundsaetzlich. Statt dedizierte VMs hochzufahren, packt ihr eure Services in Container und lasst Kubernetes die Skalierung uebernehmen. Der entscheidende Punkt: Kubernetes skaliert in Sekunden, nicht in Minuten.

Architektur: Buchungssystem als Microservices

Ein typisches Buchungssystem fuer Tourismus laesst sich in folgende Services aufteilen:

ServiceAufgabeSkalierungsverhalten
Booking APIVerfuegbarkeit pruefen, Reservierungen anlegenHorizontal, CPU-basiert
Payment ServiceZahlungsabwicklung, Gateway-IntegrationHorizontal, Queue-basiert
Inventory ServiceZimmer/Touren/Kapazitaeten verwaltenWenig Skalierung, read-heavy
Notification ServiceE-Mail, SMS, Push-NachrichtenEvent-driven, Queue-basiert
Search ServiceVolltextsuche ueber AngeboteHorizontal, Memory-intensiv
Analytics CollectorTracking, ReportingAsync, Batch-Processing

Der Vorteil dieser Zerlegung: Jeder Service skaliert unabhaengig. Der Booking-API-Service braucht im Sommer vielleicht 12 Replicas, waehrend der Inventory-Service mit 2 Replicas stabil laeuft.

Deployment: Booking Service mit HPA

Hier ein praxisnahes Deployment fuer den Booking Service inklusive Horizontal Pod Autoscaler:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: booking-api
  labels:
    app: booking-api
    tier: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: booking-api
  template:
    metadata:
      labels:
        app: booking-api
    spec:
      containers:
      - name: booking-api
        image: registry.example.com/booking-api:2.4.1
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          valueFrom:
            secretKeyRef:
              name: booking-db-credentials
              key: host
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: booking-db-credentials
              key: password
        resources:
          requests:
            cpu: "250m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: booking-api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: booking-api
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 65
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 75
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 30
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60

Wichtig ist das behavior-Feld: Scale-Up passiert schnell (innerhalb von 30 Sekunden stabil, dann verdoppeln), Scale-Down passiert langsam (5 Minuten Stabilisierung, dann maximal 10% pro Minute). Das verhindert Flapping bei kurzfristigen Lastschwankungen.

Event-Driven Skalierung mit KEDA

Fuer den Notification-Service ist CPU-basiertes Autoscaling oft unpassend. Besser: KEDA, das direkt auf die Message-Queue-Laenge reagiert.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: notification-scaler
spec:
  scaleTargetRef:
    name: notification-service
  pollingInterval: 15
  cooldownPeriod: 120
  minReplicaCount: 1
  maxReplicaCount: 10
  triggers:
  - type: rabbitmq
    metadata:
      host: "amqp://rabbitmq.messaging.svc.cluster.local:5672"
      queueName: booking-notifications
      queueLength: "50"
      activationQueueLength: "5"

Sobald mehr als 5 Messages in der Queue liegen, startet KEDA den ersten Pod. Pro 50 Messages kommt ein weiterer Pod dazu. Sind alle Messages verarbeitet, skaliert KEDA nach dem Cooldown wieder auf 1 Pod zurueck.

Cluster Autoscaler: Nodes bedarfsgerecht provisionieren

HPA skaliert Pods, aber irgendwann sind die vorhandenen Nodes voll. Der Cluster Autoscaler ergaenzt das Bild, indem er bei Bedarf neue Nodes hinzufuegt und leere Nodes wieder entfernt.

Eine sinnvolle Konfiguration fuer saisonale Workloads:

# Cluster Autoscaler Flags (Deployment-Auszug)
--scale-down-delay-after-add=10m
--scale-down-unneeded-time=10m
--scale-down-utilization-threshold=0.5
--max-node-provision-time=15m
--balance-similar-node-groups=true
--expander=least-waste

Der least-waste Expander waehlt die Node-Gruppe, die am wenigsten Ressourcen verschwendet. Das ist fuer gemischte Workloads (CPU-intensive Suche + Memory-intensives Analytics) die beste Strategie.

Mehr Details zum Cluster Autoscaler findet ihr in unserem Leitfaden zu Kubernetes Autoscaling.

Kosten: Statisch vs. Dynamisch skaliert

Hier eine realistische Gegenuberstellung fuer ein mittelgrosses Buchungsportal:

MetrikStatisch provisioniertMit Autoscaling
Nodes (Nebensaison)62-3
Nodes (Peak)68-12
Monatliche Kosten (Nebensaison)~2.400 EUR~1.000 EUR
Monatliche Kosten (Peak)~2.400 EUR~3.800 EUR
Jahreskosten (geschaetzt)~28.800 EUR~18.000 EUR
Ersparnis--~37%

Die Ersparnis kommt primaer aus den 8-9 Monaten Nebensaison, in denen die statische Loesung massiv ueberprovisioniert ist.

Fuer eine detailliertere Kostenanalyse verschiedener Hosting-Optionen lohnt sich unser Kubernetes Hosting Kostenvergleich.

CI/CD: Reproduzierbare Deployments mit Helm

Tourismus-KMU haben oft kein grosses DevOps-Team. Helm Charts machen Deployments reproduzierbar und reduzieren die Fehlerquote. Ein values.yaml pro Environment genuegt:

# values-production.yaml
replicaCount: 3
image:
  repository: registry.example.com/booking-api
  tag: "2.4.1"

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 20
  targetCPUUtilization: 65

resources:
  requests:
    cpu: 250m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi

ingress:
  enabled: true
  hosts:
    - host: api.booking-portal.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: booking-tls
      hosts:
        - api.booking-portal.example.com

Das Staging-Environment nutzt das gleiche Chart mit values-staging.yaml -- nur mit weniger Replicas und ohne Autoscaling. So ist die Parity zwischen den Environments garantiert.

Monitoring: Saisonale Patterns erkennen

Ohne Monitoring fliegt ihr blind. Prometheus + Grafana sind der Standard-Stack und lassen sich einfach per Helm deployen. Entscheidende Metriken fuer Tourismus-Workloads:

  • Request Rate pro Service: Erkennt den Beginn einer Lastspitze 10-15 Minuten bevor CPU-Limits greifen
  • Pod Restart Count: Haeufige Restarts deuten auf Memory Leaks oder fehlende Liveness Probes hin
  • HPA Current vs. Desired Replicas: Zeigt, ob der Autoscaler hinterherkommt oder staendig am Limit laeuft
  • Node Utilization: Wenn alle Nodes dauerhaft ueber 80% liegen, braucht ihr groessere maxReplicas im Cluster Autoscaler

Fuer einen tieferen Einstieg in Kubernetes Monitoring empfehle ich unseren Observability-Stack Guide.

Datenschutz und Compliance

Buchungssysteme verarbeiten personenbezogene Daten: Namen, E-Mail-Adressen, Zahlungsinformationen. Zwei Punkte sind beim Betrieb auf Kubernetes zentral:

Secrets-Management: Datenbank-Passwoerter und API-Keys gehoeren nicht in ConfigMaps oder gar ins Container-Image. Nutzt Kubernetes Secrets in Kombination mit einem externen Secret Store wie HashiCorp Vault. Details dazu in unserem Secrets-Management Guide.

Network Policies: Der Payment-Service sollte nur mit dem Booking-API-Service und dem externen Payment-Gateway kommunizieren koennen -- nicht mit dem Analytics-Collector. Network Policies setzen das auf Netzwerkebene durch:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: payment-service-policy
spec:
  podSelector:
    matchLabels:
      app: payment-service
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: booking-api
    ports:
    - protocol: TCP
      port: 8443
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: booking-api
    ports:
    - protocol: TCP
      port: 8080
  - to:
    - ipBlock:
        cidr: 203.0.113.0/24  # Payment Gateway IP Range
    ports:
    - protocol: TCP
      port: 443

Haeufige Fehler und wie ihr sie vermeidet

Kein Resource Request/Limit gesetzt: Ohne Requests kann der HPA nicht skalieren, weil er keine Baseline hat. Ohne Limits kann ein einzelner Pod einen ganzen Node lahmlegen.

Scale-Down zu aggressiv: Ein stabilizationWindowSeconds von 0 fuehrt dazu, dass Pods sofort nach einer Lastspitze terminiert werden -- nur um 30 Sekunden spaeter wieder hochgefahren zu werden. 5 Minuten Stabilisierung ist ein guter Startwert.

Keine PodDisruptionBudgets: Wenn der Cluster Autoscaler einen Node herunterfaehrt, werden alle Pods evicted. Ohne PDB kann das bedeuten, dass kurzzeitig 0 Replicas eures Booking-Service laufen.

Datenbank im selben Cluster ohne Backup-Strategie: PostgreSQL auf Kubernetes ist moeglich, erfordert aber einen Operator (z.B. CloudNativePG) und eine saubere Backup-Pipeline. Fuer die meisten KMU ist eine Managed Database die sichere Wahl.

Fazit

Docker und Kubernetes sind fuer Tourismus-KMU mit saisonalen Workloads keine Raketenwissenschaft, sondern eine pragmatische Loesung fuer ein reales Problem. Die Kombination aus HPA, KEDA und Cluster Autoscaler deckt das gesamte Spektrum ab -- von feingranularer Pod-Skalierung bis zur Node-Provisionierung.

Der Einstieg funktioniert am besten iterativ: Einen Service containerisieren, Autoscaling konfigurieren, Monitoring aufsetzen, lernen, den naechsten Service migrieren.

Wenn ihr Unterstuetzung bei der Planung oder Umsetzung einer Container-Strategie braucht, meldet euch gerne fuer ein unverbindliches Gespraech.

Kubernetes-Beratung gesucht?

Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen