Veröffentlicht am

Legacy-Anwendungen auf Kubernetes migrieren: Anleitung

Teilen:
Authors

TL;DR

  • Vier Migrationsmuster: Lift-and-Shift (schnell), Replatform (Cloud-Services nutzen), Refactor (Microservices) und Rebuild (komplett neu)
  • Lift-and-Shift ist der schnellste Weg: Legacy-App in Container packen, Kubernetes-Deployment erstellen, Datenbank migrieren
  • Fuenf Phasen: Assessment, Planning, Preparation, Migration und Optimization -- mit Blue-Green oder Canary Deployment fuer Zero-Downtime
  • Rollback-Strategie ist Pflicht: Blue-Green Deployments erlauben sofortiges Zurueckschalten per Service-Selector-Aenderung
  • Praxis-Ergebnisse: 80% schnellere Deployments, 60% Kosteneinsparung und 99,9% Verfuegbarkeit nach Migration

Legacy auf Kubernetes migrieren: Der komplette Guide

Sie wollen Ihre Legacy-Anwendungen auf Kubernetes migrieren? Dieser Guide zeigt Ihnen Schritt für Schritt, wie deutsche Unternehmen erfolgreich von Monolith zu Microservices wechseln.

Warum Legacy auf Kubernetes migrieren?

Viele deutsche Unternehmen betreiben noch Legacy-Anwendungen auf veralteten Infrastrukturen. Die Migration auf Kubernetes bietet enorme Vorteile für Modernisierung, Skalierbarkeit und Betriebseffizienz:

  • Modernisierung - Cloud-Native Architekturen
  • Skalierbarkeit - Horizontale und vertikale Skalierung
  • Kosteneinsparung - Optimierte Ressourcen-Nutzung
  • Agilität - Schnellere Deployments und Updates
  • Sicherheit - Moderne Security-Features

Migration Strategien

Migration Patterns

Legacy Migration Patterns
├── Lift and Shift
│   ├── Containerization
│   ├── Minimal Changes
│   └── Quick Migration
├── Replatform
│   ├── Cloud-Native Services
│   ├── Managed Databases
│   └── Modern Middleware
├── Refactor
│   ├── Microservices
│   ├── API-First Design
│   └── Event-Driven Architecture
└── Rebuild
    ├── Cloud-Native
    ├── Serverless
    └── Modern Frameworks

Migration Phases

  • Phase 1: Assessment - Anwendungsanalyse und -inventur
  • Phase 2: Planning - Migrationsstrategie und -planung
  • Phase 3: Preparation - Infrastruktur und Tooling
  • Phase 4: Migration - Schrittweise Migration
  • Phase 5: Optimization - Performance und Kostenoptimierung

Assessment und Planning

Application Inventory

# Application Assessment Template
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-assessment
data:
  assessment.yaml: |
    applications:
      - name: "legacy-app-1"
        type: "monolith"
        technology: "Java Spring"
        database: "Oracle"
        dependencies:
          - "Active Directory"
          - "File System"
          - "Message Queue"
        migration_complexity: "medium"
        business_criticality: "high"
        estimated_effort: "8 weeks"
      
      - name: "legacy-app-2"
        type: "web-application"
        technology: "PHP"
        database: "MySQL"
        dependencies:
          - "Apache"
          - "File Upload"
        migration_complexity: "low"
        business_criticality: "medium"
        estimated_effort: "4 weeks"

Migration Strategy Matrix

# Migration Strategy Decision Matrix
apiVersion: v1
kind: ConfigMap
metadata:
  name: migration-strategy
data:
  strategy.yaml: |
    decision_factors:
      business_criticality:
        high: "lift_and_shift"
        medium: "replatform"
        low: "refactor"
      
      technical_debt:
        high: "refactor"
        medium: "replatform"
        low: "lift_and_shift"
      
      time_constraints:
        urgent: "lift_and_shift"
        moderate: "replatform"
        flexible: "refactor"
      
      budget:
        limited: "lift_and_shift"
        moderate: "replatform"
        generous: "refactor"

Lift and Shift Migration

Containerization Strategy

# Dockerfile für Legacy Java Application
FROM openjdk:11-jre-slim

# Install dependencies
RUN apt-get update && apt-get install -y \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Create app directory
WORKDIR /app

# Copy application JAR
COPY target/legacy-app.jar app.jar

# Copy configuration
COPY config/application.properties /app/config/

# Expose port
EXPOSE 8080

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

# Run application
CMD ["java", "-jar", "app.jar"]

Kubernetes Deployment

# Legacy Application Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: legacy-app
  labels:
    app: legacy-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: legacy-app
  template:
    metadata:
      labels:
        app: legacy-app
    spec:
      containers:
        - name: legacy-app
          image: company/legacy-app:latest
          ports:
            - containerPort: 8080
          env:
            - name: SPRING_PROFILES_ACTIVE
              value: 'kubernetes'
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: database-secret
                  key: url
            - name: DATABASE_USERNAME
              valueFrom:
                secretKeyRef:
                  name: database-secret
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: database-secret
                  key: password
          resources:
            requests:
              memory: '512Mi'
              cpu: '500m'
            limits:
              memory: '1Gi'
              cpu: '1000m'
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 5

Database Migration

# Database Migration Job
apiVersion: batch/v1
kind: Job
metadata:
  name: database-migration
spec:
  template:
    spec:
      containers:
        - name: migration
          image: migration-tool:latest
          command: ['python', 'migrate.py']
          env:
            - name: SOURCE_DB_HOST
              value: 'legacy-db.company.local'
            - name: SOURCE_DB_PORT
              value: '1521'
            - name: SOURCE_DB_NAME
              value: 'LEGACY_DB'
            - name: TARGET_DB_HOST
              value: 'kubernetes-db-service'
            - name: TARGET_DB_PORT
              value: '5432'
            - name: TARGET_DB_NAME
              value: 'kubernetes_db'
          volumeMounts:
            - name: migration-scripts
              mountPath: /scripts
            - name: migration-data
              mountPath: /data
      volumes:
        - name: migration-scripts
          configMap:
            name: migration-scripts
        - name: migration-data
          persistentVolumeClaim:
            claimName: migration-data-pvc
      restartPolicy: Never
  backoffLimit: 3

Replatform Migration

Cloud-Native Services

# Cloud-Native Service Migration
apiVersion: apps/v1
kind: Deployment
metadata:
  name: modernized-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: modernized-app
  template:
    metadata:
      labels:
        app: modernized-app
    spec:
      containers:
        - name: app
          image: company/modernized-app:latest
          env:
            # Replace file system with S3
            - name: S3_BUCKET
              value: 'app-storage'
            - name: S3_ENDPOINT
              value: 'http://minio-service:9000'

            # Replace message queue with Kafka
            - name: KAFKA_BOOTSTRAP_SERVERS
              value: 'kafka-service:9092'
            - name: KAFKA_TOPIC
              value: 'app-events'

            # Replace LDAP with OAuth
            - name: OAUTH_PROVIDER
              value: 'keycloak'
            - name: OAUTH_CLIENT_ID
              valueFrom:
                secretKeyRef:
                  name: oauth-secret
                  key: client-id

Managed Database Integration

# PostgreSQL StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
spec:
  serviceName: postgresql
  replicas: 3
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
        - name: postgresql
          image: postgres:13
          env:
            - name: POSTGRES_DB
              value: 'app_database'
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgresql-secret
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgresql-secret
                  key: password
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgresql-data
              mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
    - metadata:
        name: postgresql-data
      spec:
        accessModes: ['ReadWriteOnce']
        resources:
          requests:
            storage: 10Gi

Refactor zu Microservices

Service Decomposition

# Microservices Architecture
apiVersion: v1
kind: ConfigMap
metadata:
  name: microservices-architecture
data:
  architecture.yaml: |
    services:
      user-service:
        responsibility: "User Management"
        database: "user-db"
        api: "/api/users"
        dependencies: []
      
      order-service:
        responsibility: "Order Processing"
        database: "order-db"
        api: "/api/orders"
        dependencies:
          - "user-service"
          - "inventory-service"
      
      inventory-service:
        responsibility: "Inventory Management"
        database: "inventory-db"
        api: "/api/inventory"
        dependencies: []
      
      payment-service:
        responsibility: "Payment Processing"
        database: "payment-db"
        api: "/api/payments"
        dependencies:
          - "user-service"
          - "order-service"

API Gateway

# Kong API Gateway
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kong-gateway
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kong-gateway
  template:
    metadata:
      labels:
        app: kong-gateway
    spec:
      containers:
        - name: kong
          image: kong:2.8
          env:
            - name: KONG_DATABASE
              value: 'postgres'
            - name: KONG_PG_HOST
              value: 'postgresql-service'
            - name: KONG_PG_DATABASE
              value: 'kong'
          ports:
            - containerPort: 8000
            - containerPort: 8443
            - containerPort: 8001
            - containerPort: 8444

Service Mesh mit Istio

# Istio Service Mesh Configuration
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: app-virtual-service
spec:
  hosts:
    - 'app.company.com'
  gateways:
    - app-gateway
  http:
    - route:
        - destination:
            host: user-service
            port:
              number: 8080
          weight: 50
        - destination:
            host: user-service-v2
            port:
              number: 8080
          weight: 50
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service-rule
spec:
  host: user-service
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

Migration Tools und Automation

Migration Pipeline

# Migration CI/CD Pipeline
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: migration-pipeline
spec:
  entrypoint: migration-workflow
  templates:
    - name: migration-workflow
      steps:
        - - name: analyze
            template: analyze-legacy
        - - name: containerize
            template: containerize-app
        - - name: test
            template: test-migration
        - - name: deploy
            template: deploy-kubernetes
            when: "{{steps.test.outputs.result}} == 'success'"

    - name: analyze-legacy
      container:
        image: analysis-tool:latest
        command: ['python', 'analyze.py']

    - name: containerize-app
      container:
        image: containerization-tool:latest
        command: ['python', 'containerize.py']

    - name: test-migration
      container:
        image: test-tool:latest
        command: ['python', 'test.py']

    - name: deploy-kubernetes
      container:
        image: deployment-tool:latest
        command: ['kubectl', 'apply', '-f', '/manifests']

Automated Testing

# Migration Testing Strategy
apiVersion: v1
kind: ConfigMap
metadata:
  name: migration-testing
data:
  testing.yaml: |
    test_phases:
      unit_tests:
        - "Component Tests"
        - "Integration Tests"
        - "API Tests"
      
      functional_tests:
        - "End-to-End Tests"
        - "User Acceptance Tests"
        - "Performance Tests"
      
      migration_tests:
        - "Data Integrity Tests"
        - "Backward Compatibility Tests"
        - "Rollback Tests"

    test_automation:
      tools:
        - "JUnit"
        - "TestNG"
        - "Selenium"
        - "Postman"
        - "JMeter"

Rollback Strategien

Blue-Green Deployment

# Blue-Green Deployment Strategy
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: app-blue # Initially points to blue
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app-blue
  template:
    metadata:
      labels:
        app: app-blue
    spec:
      containers:
        - name: app
          image: company/app:blue
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-green
spec:
  replicas: 0 # Initially scaled to 0
  selector:
    matchLabels:
      app: app-green
  template:
    metadata:
      labels:
        app: app-green
    spec:
      containers:
        - name: app
          image: company/app:green

Canary Deployment

# Canary Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-canary
spec:
  replicas: 1 # Small number for canary
  selector:
    matchLabels:
      app: app-canary
  template:
    metadata:
      labels:
        app: app-canary
    spec:
      containers:
        - name: app
          image: company/app:new-version
          env:
            - name: CANARY_FLAG
              value: 'true'

Monitoring und Observability

Migration Monitoring

# Migration Monitoring Dashboard
apiVersion: v1
kind: ConfigMap
metadata:
  name: migration-monitoring
data:
  dashboard.yaml: |
    metrics:
      - name: "Migration Progress"
        query: "migration_progress_percentage"
        alert_threshold: 90
      
      - name: "Application Performance"
        query: "application_response_time"
        alert_threshold: 1000ms
      
      - name: "Error Rate"
        query: "application_error_rate"
        alert_threshold: 5%
      
      - name: "Data Integrity"
        query: "data_integrity_score"
        alert_threshold: 99.9%

    alerts:
      - name: "Migration Stalled"
        condition: "migration_progress < 10% for 1h"
        severity: "critical"
      
      - name: "Performance Degradation"
        condition: "response_time > 2000ms for 5m"
        severity: "warning"
      
      - name: "High Error Rate"
        condition: "error_rate > 10% for 2m"
        severity: "critical"

Data Validation

# Data Validation Job
apiVersion: batch/v1
kind: CronJob
metadata:
  name: data-validation
spec:
  schedule: '*/30 * * * *' # Every 30 minutes
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: validation
              image: validation-tool:latest
              command: ['python', 'validate_data.py']
              env:
                - name: SOURCE_DB
                  value: 'legacy-database'
                - name: TARGET_DB
                  value: 'kubernetes-database'
                - name: VALIDATION_RULES
                  value: '/rules/validation.yaml'
          restartPolicy: OnFailure

Erfolgsgeschichten

Fallstudie: E-Commerce Migration

Ausgangssituation:

  • Monolithische PHP-Anwendung
  • MySQL-Datenbank
  • Manuelle Deployments
  • Hohe Wartungskosten

Lösung:

  • Containerisierung mit Docker
  • Kubernetes-Cluster Setup
  • Microservices-Architektur
  • CI/CD Pipeline

Ergebnisse:

  • 80% schnellere Deployments
  • 60% Kosteneinsparung
  • 99.9% Verfügbarkeit
  • Vollständige Automatisierung

Fallstudie: Banking Application

Ausgangssituation:

  • Legacy Java-Anwendung
  • Oracle-Datenbank
  • Komplexe Abhängigkeiten
  • Compliance-Anforderungen

Lösung:

  • Schrittweise Migration
  • Blue-Green Deployments
  • Advanced Monitoring
  • Security Hardening

Ergebnisse:

  • Zero-Downtime Migration
  • 100% Compliance
  • 50% Performance-Verbesserung
  • Reduzierte Betriebskosten

Migration Best Practices

Planning und Preparation

  • Thorough Assessment - Umfassende Anwendungsanalyse
  • Risk Mitigation - Risikominimierung
  • Stakeholder Buy-in - Stakeholder-Unterstützung
  • Team Training - Team-Schulungen
  • Testing Strategy - Umfassende Teststrategie

Execution

  • Phased Approach - Schrittweise Migration
  • Rollback Plan - Rollback-Plan
  • Monitoring - Kontinuierliche Überwachung
  • Communication - Regelmäßige Kommunikation
  • Documentation - Vollständige Dokumentation

Post-Migration

  • Performance Optimization - Performance-Optimierung
  • Cost Optimization - Kostenoptimierung
  • Team Training - Weiterbildung
  • Process Improvement - Prozessverbesserung
  • Knowledge Transfer - Wissenstransfer

Zukunft der Migration

Emerging Technologies

  • AI/ML Integration - KI-gestützte Migration
  • Automated Analysis - Automatisierte Analyse
  • Cloud-Native Patterns - Cloud-Native Muster
  • Serverless Migration - Serverless-Migration
  • Edge Computing - Edge-Computing
  • GitOps Migration - GitOps-basierte Migration
  • Infrastructure as Code - Infrastructure as Code
  • Observability - Erweiterte Observability
  • Security - Security-First Migration
  • Automation - Vollständige Automatisierung

Fazit

Kubernetes Migration bietet deutschen Unternehmen enorme Chancen für Modernisierung und Wettbewerbsvorteile:

  • Modernisierung - Cloud-Native Architekturen
  • Skalierbarkeit - Horizontale und vertikale Skalierung
  • Kosteneinsparung - Optimierte Ressourcen-Nutzung
  • Agilität - Schnellere Deployments
  • Sicherheit - Moderne Security-Features

Wichtige Erfolgsfaktoren:

  • Proper Planning - Umfassende Migrationsplanung
  • Risk Management - Risikomanagement
  • Team Skills - Kubernetes-Kompetenzen
  • Testing - Umfassende Tests

Nächste Schritte:

  1. Assessment - Anwendungsanalyse durchführen
  2. Strategy - Migrationsstrategie entwickeln
  3. Pilot - Pilot-Migration starten
  4. Execution - Schrittweise Migration
  5. Optimization - Performance und Kosten optimieren

Mit Kubernetes Migration können deutsche Unternehmen Legacy-Anwendungen modernisieren und langfristige Wettbewerbsvorteile erzielen.


Weiterführende Artikel:

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