Миграция от Docker Compose к Kubernetes: пошаговое

Как перейти от Docker Compose к Kubernetes: преобразование docker-compose.yml в манифесты, настройка кластера и деплой приложений — пошаговое руководство.

Не указано
Алексей Кузнецов
Алексей Кузнецов
Системный администратор3 февраля 2026 г.

Понимание различий между Docker Compose и Kubernetes

Прежде чем начать миграцию, важно понять фундаментальные различия между этими двумя инструментами, включая масштабирование, управление сетями, хранение данных, обработку сервисов и конфигурацию.

Подготовка к миграции

  1. Аудит существующей инфраструктуры Docker Compose
  2. Оценка требований к ресурсам
  3. Выбор инструментов для миграции
  4. Планирование стратегии миграции
kompose convert -f docker-compose.yml

Преобразование docker-compose.yml в Kubernetes манифесты

Конвертация сервисов, сетей, томов данных, переменных окружения и секретов из Docker Compose в соответствующие Kubernetes объекты.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

Реализация Kubernetes объектов

Создание и настройка основных Kubernetes объектов: Pod, Deployment, Service, ConfigMap, Secret, Ingress, PersistentVolume и PersistentVolumeClaim.

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

Стратегии развертывания

Выбор и реализация стратегии развертывания: Rolling Update, Blue/Green или Canary развертывание для минимизации времени простоя и рисков.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: myapp
  template:
    # ...

Мониторинг и логирование в Kubernetes

Настройка интеграции с Prometheus и Grafana для мониторинга, использование Fluentd или Logstash для сбора логов, настройка алертинга и дашбордов.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        ports:
        - containerPort: 9090

Распространенные проблемы и решения

Решение типичных проблем при работе с Kubernetes: проблемы с сетями, хранением данных, масштабированием и конфигурацией.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Лучшие практики миграции

Рекомендации по успешной миграции: поэтапная миграция, автоматизация процессов, тщательное тестирование, документирование и обучение команды.

kubectl apply --dry-run=client -f deployment.yaml
kubectl apply --dry-run=client -f service.yaml

От Docker Compose к Kubernetes: Пошаговое руководство по миграции

Введение

Docker Compose стал стандартом для локальной разработки и развертывания небольших и средних приложений. Однако по мере роста сложности приложения и требований к масштабируемости, многие разработчики и инженеры сталкиваются с необходимостью перехода на более мощную оркестровочную платформу, такую как Kubernetes.

Это руководство проведет вас через весь процесс миграции с Docker Compose на Kubernetes, от подготовки до развертывания, и поможет избежать распространенных ошибок.

Понимание различий между Docker Compose и Kubernetes

Прежде чем начать миграцию, важно понять фундаментальные различия между этими двумя инструментами:

Масштабирование

  • Docker Compose: Масштабирование ограничено одним хостом, выполняется командой docker-compose up --scale <service>=<count>
  • Kubernetes: Предоставляет автоматическое вертикальное и горизонтальное масштабирование на кластере из множества узлов

Управление сетями

  • Docker Compose: Создает изолтированную сеть для всех контейнеров в проекте
  • Kubernetes: Использует более сложную модель сетей с возможностью создания нескольких сетей и правил маршрутизации

Хранение данных

  • Docker Compose: Использует тома Docker для постоянного хранения данных
  • Kubernetes: Предоставляет PersistentVolume и PersistentVolumeClaim для более гибкого управления хранилищами

Обработка сервисов

  • Docker Compose: Упрощенное объявление сервисов в одном файле
  • Kubernetes: Использует множество объектов (Pod, Deployment, Service, Ingress и др.) для описания приложения

Конфигурация и секреты

  • Docker Compose: Переменные окружения и секреты хранятся в .env файлах или прямо в docker-compose.yml
  • Kubernetes: Использует ConfigMaps и Secrets для управления конфигурацией и секретами

Подготовка к миграции

Аудит существующей инфраструктуры Docker Compose

  1. Проанализируйте ваш docker-compose.yml файл:

    version: '3.8'
    services:
      web:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./html:/usr/share/nginx/html
      db:
        image: postgres:13
        environment:
          POSTGRES_PASSWORD: example
        volumes:
          - postgres_data:/var/lib/postgresql/data
    volumes:
      postgres_data:
    
  2. Определите зависимости между сервисами

  3. Составьте список всех томов данных

  4. Выявите специфичные для Docker Compose функции, которые не имеют прямых аналогов в Kubernetes

Требования к ресурсам

  1. Оцените минимальные требования к ресурсам для Kubernetes кластера:

    • Минимум 3 узла для отказоустойчивого кластера
    • Достаточно CPU и RAM для вашего приложения
    • Поддержка контейнеризации (Docker, containerd и т.д.)
  2. Выберите способ развертывания Kubernetes:

    • Managed сервисы (GKE, EKS, AKS)
    • Самостоятельное развертывание (kubeadm, kops)

Выбор инструментов для миграции

  1. Kompose - инструмент для автоматического преобразования docker-compose.yml в Kubernetes манифесты:

    kompose convert -f docker-compose.yml
    
  2. Docker Compose to Kubernetes Converter - онлайн инструмент для конвертации

  3. Ручное преобразование - для сложных случаев

Планирование стратегии миграции

  1. Определите порядок миграции сервисов
  2. Спланируйте время простоя (если применимо)
  3. Подготовьте план отката в случае проблем

Преобразование docker-compose.yml в Kubernetes манифесты

Конвертация сервисов

Каждый сервис в Docker Compose преобразуется в Deployment в Kubernetes:

# Deployment для веб-сервиса
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

Преобразование сетей

Docker Compose сети преобразуются в Kubernetes Services:

# Service для веб-приложения
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Мапинг томов данных

Тома Docker Compose преобразуются в PersistentVolumeClaims:

# PersistentVolumeClaim для базы данных
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

И Deployment с использованием PVC:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: db
  template:
    metadata:
      labels:
        app: db
    spec:
      containers:
      - name: db
        image: postgres:13
        env:
        - name: POSTGRES_PASSWORD
          value: "example"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-data-pvc

Обработка переменных окружения и секретов

Переменные окружения из Docker Compose преобразуются в ConfigMaps:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  POSTGRES_HOST: "db-service"
  POSTGRES_DB: "myapp"

Секреты должны храниться в виде Kubernetes Secrets:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  POSTGRES_PASSWORD: ZXhhbXBsZQ==  # Base64 encoded "example"

Реализация Kubernetes объектов

Pod

Основной единицей развертывания в Kubernetes является Pod. Обычно Deployment управляет набором Pod'ов:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: myapp:latest
    ports:
    - containerPort: 8080

Deployment

Deployment управляет ReplicaSet, который обеспечивает работу указанного количества Pod'ов:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

Service

Service обеспечивает сетевой доступ к Pod'ам:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

ConfigMap и Secret

ConfigMap для конфигурации:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "info"
  API_ENDPOINT: "https://api.example.com"

Secret для конфиденциальных данных:

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  API_KEY: c2VjcmV0X2FwaV9rZXk=  # Base64 encoded "secret_api_key"

Ingress

Ingress управляет внешним доступом к сервисам:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

PersistentVolume и PersistentVolumeClaim

PersistentVolume для выделения хранилища:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-0001
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /data/pv-0001

PersistentVolumeClaim для запроса хранилища:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Стратегии развертывания

Rolling Update

По умолчанию Kubernetes использует стратегию Rolling Update для обновления приложений:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: myapp
  template:
    # ...

Blue/Green развертывание

Для развертывания Blue/Green создаем два Deployment с разными метками:

# Blue deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: blue
  template:
    metadata:
      labels:
        app: myapp
        version: blue
    # ...

# Green deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-green
spec:
  replicas: 0  # Initially zero replicas
  selector:
    matchLabels:
      app: myapp
      version: green
  template:
    metadata:
      labels:
        app: myapp
        version: green
    # ...

Canary развертывание

Для Canary развертывания используем два Deployment с разным количеством реплик:

# Production deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-prod
spec:
  replicas: 9  # 90% трафика
  selector:
    matchLabels:
      app: myapp
      version: prod
  # ...

# Canary deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
spec:
  replicas: 1  # 10% трафика
  selector:
    matchLabels:
      app: myapp
      version: canary
  # ...

Мониторинг и логирование в Kubernetes

Интеграция с Prometheus и Grafana

  1. Развертываем Prometheus:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: prometheus
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: prometheus
      template:
        metadata:
          labels:
            app: prometheus
        spec:
          containers:
          - name: prometheus
            image: prom/prometheus:latest
            ports:
            - containerPort: 9090
            volumeMounts:
            - name: prometheus-config
              mountPath: /etc/prometheus
          volumes:
          - name: prometheus-config
            configMap:
              name: prometheus-config
    
  2. Создаем Service для Prometheus:

    apiVersion: v1
    kind: Service
    metadata:
      name: prometheus-service
    spec:
      selector:
        app: prometheus
      ports:
        - name: web
          port: 9090
          targetPort: 9090
      type: LoadBalancer
    
  3. Развертываем Grafana:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grafana
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grafana
      template:
        metadata:
          labels:
            app: grafana
        spec:
          containers:
          - name: grafana
            image: grafana/grafana:latest
            ports:
            - containerPort: 3000
    

Сбор логов с Fluentd или Logstash

Пример конфигурации Fluentd для сбора логов:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  labels:
    app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:v1.16-1
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: fluentd-config
          mountPath: /fluentd/etc
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: fluentd-config
        configMap:
          name: fluentd-config

Алертинг

Пример конфигурации Alertmanager:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alertmanager
  template:
    metadata:
      labels:
        app: alertmanager
    spec:
      containers:
      - name: alertmanager
        image: prom/alertmanager:latest
        ports:
        - containerPort: 9093
        volumeMounts:
        - name: alertmanager-config
          mountPath: /etc/alertmanager
      volumes:
      - name: alertmanager-config
        configMap:
          name: alertmanager-config

Dashboard для мониторинга

Пример Prometheus Dashboard для Kubernetes:

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-dashboard
data:
  dashboard.json: |
    {
      "dashboard": {
        "title": "Kubernetes Cluster Monitoring",
        "panels": [
          {
            "title": "CPU Usage",
            "targets": [
              {
                "expr": "sum(rate(container_cpu_usage_seconds_total[5m])) by (pod)",
                "legendFormat": "{{ pod }}"
              }
            ]
          },
          {
            "title": "Memory Usage",
            "targets": [
              {
                "expr": "container_memory_working_set_bytes",
                "legendFormat": "{{ pod }}"
              }
            ]
          }
        ]
      }
    }

Распространенные проблемы и решения

Проблемы с сетями

Проблема: Сервисы не могут связаться друг с другом.

Решение: Убедитесь, что Services правильно настроены с правильными селекторами и портами:

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend  # Должен соответствовать меткам Pod'ов
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

Проблемы с хранением данных

Проблема: Данные теряются при перезапуске Pod'ов.

Решение: Используйте PersistentVolumeClaims для хранения данных:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

И монтируйте этот PVC в Pod:

spec:
  containers:
  - name: app
    image: myapp:latest
    volumeMounts:
    - name: app-data
      mountPath: /app/data
  volumes:
  - name: app-data
    persistentVolumeClaim:
      claimName: app-data-pvc

Проблемы с масштабированием

Проблема: Приложение не масштабируется должным образом.

Решение:

  1. Настройте Horizontal Pod Autoscaler (HPA):

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: myapp-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: myapp
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 70
    
  2. Убедитесь, что ваше приложение обрабатывает несколько экземпляров корректно.

Проблемы с конфигурацией

Проблема: Секреты и конфигурация не загружаются правильно.

Решение: Проверьте, что ConfigMaps и Secrets созданы правильно и смонтированы в Pod:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    env:
    - name: CONFIG_VALUE
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: config-value
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: app-secret

Лучшие практики миграции

Поэтапная миграция

  1. Начните с миграции одного или двух сервисов
  2. Проверьте их работоспособность в Kubernetes
  3. Постепенно добавляйте остальные сервисы
  4. Используйте Service Mesh (например, Istio) для управления трафиком между старыми и новыми сервисами

Автоматизация

  1. Используйте CI/CD пайплайны для автоматизации развертывания

  2. Создайте скрипты для проверки манифестов Kubernetes:

    # Пример скрипта проверки
    kubectl apply --dry-run=client -f deployment.yaml
    kubectl apply --dry-run=client -f service.yaml
    
  3. Используйте инструменты вроде Helm для управления сложными приложениями

Тестирование

  1. Создайте тестовую среду, идентичную производственной
  2. Проведите нагрузочное тестирование после миграции
  3. Проверьте сценарии отказоустойчивости
  4. Тестируйте процедуры отката

Документирование

  1. Документируйте все изменения в архитектуре
  2. Обновите документацию по API и взаимодействиям между сервисами
  3. Создайте чек-листы для развертывания и мониторинга

Обучение команды

  1. Проведите обучение по Kubernetes для разработчиков и операторов
  2. Создайте гайдлайны по работе с Kubernetes
  3. Назначьте ответственных за разные аспекты Kubernetes инфраструктуры

Заключение

Миграция с Docker Compose на Kubernetes — это сложный, но окупаемый процесс. Kubernetes предоставляет мощные возможности для масштабирования, отказоустойчивости и управления сложными приложениями.

Ключевые моменты для успеха миграции:

  • Тщательное планирование и подготовка
  • Поэтапное выполнение миграции
  • Автоматизация процессов развертывания
  • Тестирование на каждом этапе
  • Мониторинг и обратная связь

Начните с малого, тестируйте каждую миграцию и постепенно переходите на Kubernetes. Это позволит вам использовать все преимущества контейнерной оркестрации без риска для вашего приложения.

Помните, что Kubernetes — это не просто инструмент, а новая парадигма управления приложениями. Уделите время изучения его принципов и лучших практик, и это окупится в долгосрочной перспективе более надежной и масштабируемой инфраструктурой.

Поделиться:TelegramX / TwitterVK