Что такое Kubernetes и зачем он нужен?
(«хочу 3 копии приложения»), а K8s автоматически его поддерживает.
🟢 Junior Level
Простое объяснение
Kubernetes (K8s) — это оркестратор контейнеров. Вы описываете желаемое состояние («хочу 3 копии приложения»), а K8s автоматически его поддерживает.
Если Pod падает – K8s создаёт новый. Если нагрузка растёт – K8s добавляет копии. Это и есть «самолечение» (self-healing). Если Docker — это упаковка, то Kubernetes — это конвейер и логистический центр.
K8s НЕ нужен для: одного приложения на одном сервере, простой статичной страницы, прототипа на выходные.
Аналогия
Представьте оркестр (от греческого «kybernetes» — кормчий, управляющий):
- Docker-контейнер = один музыкант
- Kubernetes = дирижёр, который знает, кто когда играет, заменяет заболевших музыкантов и добавляет новых при росте аудитории
Основные задачи Kubernetes
- Service Discovery — K8s даёт каждому контейнеру IP-адрес и DNS-имя, распределяет трафик.
- Масштабирование — автоматически добавляет копии приложения при росте нагрузки.
- Самолечение — перезапускает упавшие контейнеры, заменяет и переносит их при сбое.
- Rolling updates и откаты — обновляет приложение без простоя, может откатить при проблемах.
- Управление секретами — хранит пароли и токены без пересборки образов.
Архитектура простыми словами
Control Plane (Голова):
- kube-apiserver — точка входа для всех команд
- etcd – база данных кластера, хранит все настройки и состояния.
- scheduler – решает, на какой Node посадить каждый Pod.
- controller-manager — следит за состоянием кластера
Worker Nodes (Рабочие серверы):
- kubelet – агент на каждом Node, докладывает Control Plane о состоянии контейнеров.
- kube-proxy — отвечает за сеть и трафик
- Container Runtime — среда запуска контейнеров (containerd)
Зачем K8s нужен бизнесу?
- Масштабируемость – K8s мониторит CPU/RAM Pod’ов и автоматически создаёт новые копии при превышении порогов (Horizontal Pod Autoscaler).
- Оптимизация ресурсов — плотная «упаковка» контейнеров для экономии денег
- Cloud Agnostic — легко переезжать между провайдерами (GCP, Azure, AWS)
Что запомнить
- Kubernetes — стандарт управления облачной инфраструктурой
- Главные преимущества: Self-healing, Auto-scaling, Declarative management
- В основе — архитектура с разделением на Control Plane и Worker Nodes
- Self-hosted K8s требует глубоких знаний. Managed K8s (GKE, EKS, AKS) значительно упрощает эксплуатацию.
🟡 Middle Level
Архитектура Kubernetes
Control Plane (Control Plane)
| Компонент | Роль | Что будет если упадёт |
|---|---|---|
| kube-apiserver | REST API, точка входа | Нельзя управлять кластером, работающие поды продолжают работать |
| etcd | Хранилище всех данных | Потеря состояния кластера. Критичный компонент! |
| kube-scheduler | Выбор Node для Pod’ов | Новые поды не запускаются, существующие работают |
| kube-controller-manager | Поддержание желаемого состояния | Pod’ы не восстанавливаются при падении |
Worker Nodes
| Компонент | Роль | Что будет если упадёт |
|---|---|---|
| kubelet | Агент на Node, управляет Pod’ами | Поды на этой Node перестают управляться |
| kube-proxy | Сетевые правила (iptables/IPVS) | Нарушается сетевая связь между сервисами |
| containerd | Runtime контейнеров | Все контейнеры на Node останавливаются |
Типичные ошибки
| Ошибка | Последствие | Как избежать |
|---|---|---|
| Нет requests/limits у Pod’ов | Один Pod забирает все ресурсы, остальные Killed | Всегда указывайте resources.requests и resources.limits |
Использование latest тега |
Невозможно откатить, недетерминизм | Фиксируйте теги образов |
| Один реплик Pod’а | Нет HA, downtime при обновлении | Минимум 2 реплики, PodDisruptionBudget |
| Без liveness/readiness probes | K8s не знает, живо ли приложение | Настройте оба probe |
| Хранение состояния в Pod’ах | Данные теряются при перезапуске | Используйте StatefulSet + PersistentVolume |
Основные объекты Kubernetes
| Объект | Назначение |
|---|---|
| Pod | Минимальная единица — один или несколько контейнеров |
| Deployment | Управление stateless Pod’ами, rolling updates |
| Service | Стабильный IP/DNS для группы Pod’ов (L4 балансировка) |
| Ingress | HTTP-маршрутизация (L7), SSL termination |
| ConfigMap | Конфигурация (ключ-значение) |
| Secret | Секреты (закодированные в base64) |
| PersistentVolume | Постоянное хранилище данных |
| Namespace | Логическое разделение ресурсов |
Когда K8s — избыточен?
- Простые монолиты на 1-2 серверах
- Небольшие команды без DevOps-инженеров
- Лучше подходят: Heroku, AWS Elastic Beanstalk, Docker Swarm
Что запомнить
- Понимание архитектуры критично для траблшутинга
- etcd — самый критичный компонент, требует бэкапов
- Всегда настраивайте resources, probes, replicas
- K8s — избыточен для простых монолитов
- Для небольших команд лучше Managed K8s (GKE, EKS, AKS)
🔴 Senior Level
Глубокая архитектура Control Plane
kube-apiserver
- Stateless HTTP/HTTPS сервер, обрабатывает REST запросы
- Аутентификация (X.509, Bearer tokens, OIDC), авторизация (RBAC, ABAC, Webhook), Admission Controllers (Mutating + Validating)
- Масштабируется горизонтально за load balancer
- Все компоненты Control Plane общаются только через API Server
etcd
- Распределённое key-value хранилище на базе Raft consensus algorithm
- Требуется нечётное количество нод (3 или 5) для quorum
- Критичность: потеря etcd = потеря всего состояния кластера
- Бэкапы:
etcdctl snapshot save— обязательно в CI/CD и по расписанию - Performance: etcd чувствителен к latency disk. Используйте SSD. etcd хранит все изменения — компактирование (compaction) необходимо.
kube-scheduler
- Multi-pass scheduling: Filter (отсеивает неподходящие Node) → Score (ранжирует оставшиеся)
- Учитывает: resources requests, node selectors, taints/tolerations, affinity/anti-affinity, pod topology spread
- Можно кастомизировать через Scheduler Framework plugins
kube-controller-manager
- Набор контроллеров, каждый из которых следит за своим объектом:
- ReplicaSet Controller — поддерживает нужное число Pod’ов
- Node Controller — мониторит состояние Node
- Endpoint Controller — обновляет Endpoints для Service
- ServiceAccount Controller — создаёт default ServiceAccount
Control Plane HA (High Availability)
[Load Balancer]
/ | \
apiserver apiserver apiserver
| | |
etcd ------ etcd ------ etcd (Raft consensus)
- Multi-master: 3x API Server + 3/5 etcd + 2x scheduler (active-passive) + 2x controller-manager (active-passive)
- etcd quorum: при 3 нодах выдерживает 1 отказ, при 5 — 2 отказа
- etcd latency: < 10ms между нодами, иначе Raft consensus деградирует
Trade-offs
| Аспект | Self-hosted K8s | Managed K8s (GKE/EKS/AKS) |
|---|---|---|
| Контроль | Полный | Ограниченный (no API server tuning) |
| Сложность | Очень высокая | Средняя |
| Стоимость | Ниже (своя инфраструктура) | Выше (managed fee) |
| Обновления | Ручные | Автоматические |
| etcd management | Сам | Провайдер |
| SLA | Ваш | 99.95%+ |
Edge Cases
- etcd fragmentation: при частых обновлениях etcd фрагментируется. Нужна периодическая дефрагментация (
etcdctl defrag). - API Server overload: при 5000+ Pod’ов и частых обновлениях API Server может стать bottleneck. Решение: горизонтальное масштабирование, tuning
--max-requests-inflight. - NotReady Node timeout: Node перешла в NotReady. Control Plane ждёт 5 минут (
pod-eviction-timeout), прежде чем пересоздавать Pod’ы. В критических системах таймаут нужно тюнинговать. - Kernel Panic на Node: Kubelet перестаёт слать heartbeats. K8s не всегда отличает падение узла от проблем с сетью. Pod’ы могут «зависнуть» в Unknown статусе.
- Pod stuck in Terminating: Volume не может отмонтироваться, finalizer не завершается. Решение:
kubectl patch pod <name> -p '{"metadata":{"finalizers":null}}'.
Производительность и масштабирование
| Параметр | Default | Maximum (tested) |
|---|---|---|
| Pod’ов на Node | 110 | 250+ (зависит от CNI) |
| Pod’ов в кластере | - | 150,000 |
| Node в кластере | - | 5,000 |
| Namespace | - | Десятки тысяч |
| etcd размер | - | < 8GB (рекомендуется) |
Ограничения:
- Количество Pod’ов на Node ограничено доступными IP (CNI), нагрузкой на kubelet, количеством доступных PID.
- etcd хранит все объекты. При > 8GB размер базы деградирует performance.
- API Server throughput: tuning
--max-requests-inflightи--max-mutating-requests-inflight.
Безопасность
Defense in Depth:
- Network Policies — микросегментация, zero-trust networking
- RBAC — минимальные привилегии (least privilege)
- Pod Security Standards — restricted, baseline, privileged
- Admission Controllers — OPA/Gatekeeper для policy enforcement
- Image Policy — только подписанные образы из trusted registry
- Secrets encryption at rest — шифрование etcd данных
- Audit logging — все API запросы логируются
Production Story
Крупная fintech-компания развернула self-hosted K8s кластер (10 masters, 50 workers). Первые 6 месяцев — стабильная работа. Затем: etcd начал деградировать (fragmentation, latency > 50ms). Причина: частые обновления Deployment’ов (каждые 5 минут) + отсутствие компактирования. Решение: периодическая дефрагментация, batch updates, monitoring etcd latency. Второй инцидент: API Server overload из-за «watch storm» — 10,000 клиентов одновременно переподключились после network blip. Решение: tuning --max-requests-inflight, horizontal scaling API Server, connection multiplexing.
Monitoring
- Control Plane: API Server latency/p99, etcd disk latency, etcd leader elections, scheduler scheduling duration, controller-manager queue depth
- Nodes: CPU/Memory pressure, disk pressure, PID pressure, kubelet runtime operations, kube-proxy sync latency
- Pods: restart count, OOMKilled, CrashLoopBackOff, container waiting time, resource usage vs requests
- Stack: Prometheus + kube-prometheus-stack (AlertManager, Grafana), cAdvisor для контейнерных метрик
- Golden Signals: latency, traffic, errors, saturation — на уровне кластера, namespace, deployment, pod
Резюме
- Kubernetes — стандарт управления облачной инфраструктурой с разделением на Control Plane и Worker Nodes.
- etcd — самый критичный компонент. Бэкапы обязательны.
- Главные преимущества: Self-healing, Auto-scaling, Declarative management.
- Самохостящийся K8s требует команды из 3-5 SRE инженеров. Managed K8s снижает операционную нагрузку.
- Всегда настраивайте: resources requests/limits, liveness/readiness probes, PodDisruptionBudget, NetworkPolicies.
- K8s — избыточен для монолитов. Для микросервисов на масштабе — незаменим.
- Понимание внутренней архитектуры (API Server → etcd → Scheduler → Controller → Kubelet) критично для траблшутинга.
🎯 Шпаргалка для интервью
Обязательно знать:
- Kubernetes — оркестратор контейнеров: self-healing, auto-scaling, declarative management
- Control Plane: API Server (точка входа), etcd (хранилище), Scheduler, Controller Manager
- Worker Nodes: kubelet (агент), kube-proxy (сеть), container runtime (containerd)
- Pod — минимальная единица запуска; Service — стабильный адрес; Deployment — управление replicas
- etcd — самый критичный компонент; потеря etcd = потеря состояния кластера
- Self-hosted K8s требует SRE-команду; Managed (GKE/EKS/AKS) значительно проще
- K8s избыточен для монолитов; незаменим для микросервисов на масштабе
Частые уточняющие вопросы:
- «Что будет если упадёт etcd?» — Потеря всего состояния кластера; бэкапы обязательны
- «Почему kube-apiserver stateless?» — Можно масштабировать горизонтально за load balancer
- «K8s для одного приложения?» — Избыточен; лучше Heroku, ECS, или простой сервер
- «Что такое reconciliation loop?» — K8s постоянно сверяет desired state с actual и исправляет расхождения
Красные флаги (НЕ говорить):
- «K8s нужен каждому проекту» (избыточен для монолитов и маленьких команд)
- «etcd можно не бэкапить» (потеря etcd = полная потеря кластера)
- «Kubelet на Control Plane» (kubelet только на Worker Nodes)
- «K8s сам по себе безопасен» (требует RBAC, NetworkPolicies, Pod Security)
Связанные темы:
- [[Что такое Pod в Kubernetes]] — минимальная единица запуска
- [[Что такое Service в Kubernetes]] — сетевая абстракция
- [[Как происходит масштабирование в Kubernetes]] — HPA, VPA, Cluster Autoscaler