Docker запускает контейнеры, Kubernetes ими управляет — на десятках машин, сам, круглосуточно
Kubernetes (k8s) — система оркестрации контейнеров: она запускает и держит в рабочем состоянии множество контейнеров на кластере машин, сама перезапускает упавшие, масштабирует под нагрузку и балансирует трафик. Если Docker отвечает на вопрос «как упаковать и запустить один контейнер», то Kubernetes — «как надёжно крутить сотни контейнеров в проде». Проект родился в Google (из системы Borg), сейчас развивается под эгидой CNCF и стал отраслевым стандартом.
Docker Compose поднимает связку сервисов на одной машине — этого хватает для разработки. В проде появляются задачи, которых Compose не решает:
- контейнер упал ночью — кто его перезапустит?
- нагрузка выросла — кто добавит копии и распределит трафик?
- обновляем версию — как выкатить без простоя и откатить при сбое?
- сервисов десятки на десятке серверов — как ими управлять как одним целым?
Kubernetes делает это автоматически: ты описываешь желаемое состояние, а он постоянно приводит реальность к нему.
КЛАСТЕР
┌──────────────────────────────────────────┐
│ Control Plane (управление) │
│ API server · scheduler · controllers · etcd │
├──────────────────────────────────────────┤
│ Node 1 Node 2 Node 3│
│ ┌──────┐ ┌──────┐ ┌──────┐│
│ │ Pod │ │ Pod │ │ Pod ││
│ └──────┘ └──────┘ └──────┘│
└──────────────────────────────────────────┘
- Кластер — набор машин, управляемых как одно целое.
- Node (узел) — машина (VM или физическая), где реально крутятся контейнеры.
- Control Plane — «мозг»: API-сервер (точка входа,
kubectlходит сюда), scheduler (раскладывает поды по узлам), controllers (следят за желаемым состоянием), etcd (хранилище состояния кластера).
- Pod — наименьшая единица развёртывания: один (обычно) или несколько контейнеров, разделяющих сеть и хранилище. Поды эфемерны — умирают и пересоздаются, IP меняется.
- Deployment — декларирует желаемое состояние: сколько реплик пода держать, какой образ. Сам пересоздаёт упавшие поды (self-healing), катит новые версии и откатывает (rollout/rollback). Под капотом управляет ReplicaSet (поддерживает N копий).
- Service — стабильный сетевой адрес и балансировщик для группы подов. Поды меняются — Service остаётся точкой входа (решает проблему эфемерных IP).
- Ingress — HTTP(S)-маршрутизация снаружи в сервисы (по хосту/пути), TLS.
- ConfigMap / Secret — конфигурация и секреты отдельно от образа (secret — для паролей/токенов).
- Namespace — логическое разделение кластера (dev/prod, команды).
Главная идея: ты не командуешь «запусти контейнер», а описываешь, что хочешь, в YAML — Kubernetes сам приводит кластер к этому состоянию и удерживает его (reconciliation loop).
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3 # держать 3 копии пода
selector:
matchLabels: { app: web }
template: # шаблон пода
metadata:
labels: { app: web }
spec:
containers:
- name: web
image: myapp:1.2
ports: [{ containerPort: 8000 }]apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector: { app: web } # какие поды обслуживать (по метке)
ports:
- port: 80
targetPort: 8000
type: ClusterIP # ClusterIP (внутри) / NodePort / LoadBalancer (наружу)kubectl apply -f deployment.yaml # применить желаемое состояниеУбил один под руками — Deployment тут же поднимет новый: реальность всегда стремится к описанному.
- Self-healing — упавший под/узел заменяется автоматически.
- Масштабирование — вручную (
kubectl scale) или авто (HPA — по нагрузке CPU/памяти). - Rolling update — выкатка новой версии по одному поду без простоя; сбой — автоматический откат.
- Service discovery + балансировка — сервисы находят друг друга по имени, трафик делится между подами.
- Декларативная инфраструктура — весь кластер описан в YAML под гитом (GitOps).
| Docker Compose | Kubernetes | |
|---|---|---|
| Масштаб | один хост | кластер из многих узлов |
| Назначение | разработка, простой прод | продакшн под нагрузкой |
| Self-healing | restart политики |
полноценный (поды, узлы) |
| Масштабирование | вручную | ручное и авто (HPA) |
| Обновления без простоя | нет | rolling update + откат |
| Сложность | низкая | высокая |
- Нужен: много сервисов (микросервисы), высокая нагрузка/доступность, авто-масштабирование, несколько команд и окружений.
- Не нужен: один-два сервиса, небольшой проект, стартап на старте — Compose или PaaS проще и дешевле. Kubernetes сложен в эксплуатации; не тащи его «на вырост» (та же ошибка, что с микросервисами на вырост).
kubectl apply -f app.yaml # применить/обновить манифесты
kubectl get pods # список подов (-A — во всех namespace)
kubectl get deploy,svc # деплойменты и сервисы
kubectl describe pod <имя> # детали и события пода (диагностика)
kubectl logs -f <имя> # логи пода потоком
kubectl exec -it <имя> -- bash # войти внутрь пода
kubectl scale deployment/web --replicas=5
kubectl rollout status deployment/web # статус выкатки
kubectl rollout undo deployment/web # откатить к прошлой версииKubernetes «на вырост». Он решает проблемы масштаба, которых у маленького проекта нет, зато добавляет огромную операционную сложность (кластер, сеть, мониторинг). Пока Compose/PaaS справляются — не переходи.
Под ≠ контейнер. Под — обёртка над одним (обычно) контейнером; масштабируют и пересоздают именно поды. Не клади в один под несвязанные сервисы «чтобы рядом».
Секреты в манифестах. Secret в base64 — это не шифрование; не коммить секреты в гит открыто, используй внешние хранилища/шифрование (Веб-безопасность).
Поды эфемерны. Локальные данные пода исчезают при пересоздании — состояние держат во внешней БД или в persistent volume, не в поде.
- Docker — упаковка приложения в образ/контейнер; Kubernetes оркеструет эти контейнеры;
- Монолит и микросервисы — k8s — типичная среда для микросервисов (масштаб, изоляция);
- CI CD — пайплайн собирает образ и выкатывает его в кластер (
kubectl apply); - Развертывание проекта — деплой приложения; k8s — прод-уровень оркестрации;
- RabbitMQ · Redis · PostgreSQL — сервисы, которые в проде часто крутятся рядом (или как managed);
- YAML — язык манифестов Kubernetes.