Миграция от Docker Compose к Kubernetes: пошаговое
Как перейти от Docker Compose к Kubernetes: преобразование docker-compose.yml в манифесты, настройка кластера и деплой приложений — пошаговое руководство.
Понимание различий между Docker Compose и Kubernetes
Прежде чем начать миграцию, важно понять фундаментальные различия между этими двумя инструментами, включая масштабирование, управление сетями, хранение данных, обработку сервисов и конфигурацию.
Подготовка к миграции
- Аудит существующей инфраструктуры Docker Compose
- Оценка требований к ресурсам
- Выбор инструментов для миграции
- Планирование стратегии миграции
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
-
Проанализируйте ваш
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: -
Определите зависимости между сервисами
-
Составьте список всех томов данных
-
Выявите специфичные для Docker Compose функции, которые не имеют прямых аналогов в Kubernetes
Требования к ресурсам
-
Оцените минимальные требования к ресурсам для Kubernetes кластера:
- Минимум 3 узла для отказоустойчивого кластера
- Достаточно CPU и RAM для вашего приложения
- Поддержка контейнеризации (Docker, containerd и т.д.)
-
Выберите способ развертывания Kubernetes:
- Managed сервисы (GKE, EKS, AKS)
- Самостоятельное развертывание (kubeadm, kops)
Выбор инструментов для миграции
-
Kompose - инструмент для автоматического преобразования docker-compose.yml в Kubernetes манифесты:
kompose convert -f docker-compose.yml -
Docker Compose to Kubernetes Converter - онлайн инструмент для конвертации
-
Ручное преобразование - для сложных случаев
Планирование стратегии миграции
- Определите порядок миграции сервисов
- Спланируйте время простоя (если применимо)
- Подготовьте план отката в случае проблем
Преобразование 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
-
Развертываем 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 -
Создаем Service для Prometheus:
apiVersion: v1 kind: Service metadata: name: prometheus-service spec: selector: app: prometheus ports: - name: web port: 9090 targetPort: 9090 type: LoadBalancer -
Развертываем 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
Проблемы с масштабированием
Проблема: Приложение не масштабируется должным образом.
Решение:
-
Настройте 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 -
Убедитесь, что ваше приложение обрабатывает несколько экземпляров корректно.
Проблемы с конфигурацией
Проблема: Секреты и конфигурация не загружаются правильно.
Решение: Проверьте, что 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
Лучшие практики миграции
Поэтапная миграция
- Начните с миграции одного или двух сервисов
- Проверьте их работоспособность в Kubernetes
- Постепенно добавляйте остальные сервисы
- Используйте Service Mesh (например, Istio) для управления трафиком между старыми и новыми сервисами
Автоматизация
-
Используйте CI/CD пайплайны для автоматизации развертывания
-
Создайте скрипты для проверки манифестов Kubernetes:
# Пример скрипта проверки kubectl apply --dry-run=client -f deployment.yaml kubectl apply --dry-run=client -f service.yaml -
Используйте инструменты вроде Helm для управления сложными приложениями
Тестирование
- Создайте тестовую среду, идентичную производственной
- Проведите нагрузочное тестирование после миграции
- Проверьте сценарии отказоустойчивости
- Тестируйте процедуры отката
Документирование
- Документируйте все изменения в архитектуре
- Обновите документацию по API и взаимодействиям между сервисами
- Создайте чек-листы для развертывания и мониторинга
Обучение команды
- Проведите обучение по Kubernetes для разработчиков и операторов
- Создайте гайдлайны по работе с Kubernetes
- Назначьте ответственных за разные аспекты Kubernetes инфраструктуры
Заключение
Миграция с Docker Compose на Kubernetes — это сложный, но окупаемый процесс. Kubernetes предоставляет мощные возможности для масштабирования, отказоустойчивости и управления сложными приложениями.
Ключевые моменты для успеха миграции:
- Тщательное планирование и подготовка
- Поэтапное выполнение миграции
- Автоматизация процессов развертывания
- Тестирование на каждом этапе
- Мониторинг и обратная связь
Начните с малого, тестируйте каждую миграцию и постепенно переходите на Kubernetes. Это позволит вам использовать все преимущества контейнерной оркестрации без риска для вашего приложения.
Помните, что Kubernetes — это не просто инструмент, а новая парадигма управления приложениями. Уделите время изучения его принципов и лучших практик, и это окупится в долгосрочной перспективе более надежной и масштабируемой инфраструктурой.