Docker упакует приложение в контейнер. Но что делать, когда контейнеров сотни, они падают, нагрузка скачет, а один сервер уже не справляется?
Проблема: Docker Compose на одном сервере
Docker Compose отлично подходит для локальной разработки и небольших проектов. Но у него есть жёсткие ограничения:
- Работает только на одном хосте
- При падении сервера всё приложение недоступно
- Нет автоматического масштабирования под нагрузку
- Ручное обновление без zero-downtime требует скриптов
- Нет встроенного мониторинга и самовосстановления
Когда приложение растёт, эти ограничения становятся критичными.
Что такое Kubernetes
Kubernetes (K8s) — это оркестратор контейнеров с открытым исходным кодом, созданный Google. Он автоматически управляет развёртыванием, масштабированием и работоспособностью контейнеризованных приложений на кластере серверов.
Аналогия: если Docker — это грузовой контейнер, то Kubernetes — это портовый терминал с кранами, расписанием и диспетчером. Он решает, куда поставить контейнер, следит за его состоянием и заменяет повреждённые.
Ключевые возможности
Self-healing — если контейнер упал, K8s автоматически перезапустит его. Если узел кластера вышел из строя, поды переедут на живые узлы.
Auto-scaling — HorizontalPodAutoscaler автоматически увеличивает число реплик при росте нагрузки и уменьшает при её спаде.
Rolling updates — обновление без простоя: новые поды поднимаются, старые гасятся постепенно. При ошибке — автоматический откат.
Multi-node — кластер из нескольких серверов. Нагрузка распределяется по всем узлам, нет единой точки отказа.
Declarative configuration — описываешь желаемое состояние в YAML, K8s сам приводит систему к нему и поддерживает.
Когда использовать K8s, а когда Docker Compose
| Критерий | Docker Compose | Kubernetes |
|---|---|---|
| Размер команды | 1–5 человек | 5+ человек |
| Серверов | 1 | 3+ |
| Нагрузка | Стабильная | Переменная |
| Требования к доступности | Нет | 99.9%+ |
| Сложность | Низкая | Высокая |
Используй Docker Compose, если это стартап, пет-проект или staging-окружение. Kubernetes нужен, когда важны отказоустойчивость, масштабирование и CI/CD в production.
Архитектура кластера
Кластер K8s состоит из двух типов узлов: Control Plane (управляющий слой) и Worker Nodes (рабочие узлы).
Control Plane
Мозг кластера. Принимает решения о планировании и отвечает за состояние системы.
- API Server — единая точка входа. Все команды
kubectlидут сюда. REST API, который принимает и валидирует запросы. - etcd — распределённое key-value хранилище. Здесь хранится всё состояние кластера. Самый критичный компонент — потеря etcd = потеря кластера.
- Scheduler — решает, на какой Worker Node запустить новый Pod, учитывая ресурсы, affinity-правила и ограничения.
- Controller Manager — набор контроллеров, которые следят за текущим состоянием и приводят его к желаемому (ReplicaSet, Deployment, Node controllers).
Worker Nodes
Рабочие лошадки. Здесь запускаются контейнеры с приложениями.
- kubelet — агент на каждом узле. Получает задания от API Server и управляет подами через container runtime.
- kube-proxy — сетевой прокси. Обеспечивает сетевые правила и балансировку нагрузки внутри кластера.
- Container Runtime — движок для запуска контейнеров (containerd, CRI-O).
┌─────────────────────────────────┐
│ Control Plane │
│ API Server ← kubectl │
│ etcd (state storage) │
│ Scheduler │
│ Controller Manager │
└──────────────┬──────────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│Node 1 │ │Node 2 │ │Node 3 │
│kubelet│ │kubelet│ │kubelet│
│ Pod │ │ Pod │ │ Pod │
│ Pod │ │ Pod │ │ │
└───────┘ └───────┘ └───────┘
Первый шаг: установка kubectl
# macOS
brew install kubectl
# Проверка подключения к кластеру
kubectl cluster-info
kubectl get nodes
Для локального кластера используй minikube или kind:
# Установка и запуск minikube
brew install minikube
minikube start
# Проверка
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# minikube Ready control-plane 1m v1.29.0
Kubernetes — это не просто инструмент, это платформа. Сложность оправдана только когда задачи реально требуют оркестрации.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!