Архитектура Kubernetes

TL;DR: Кластер = Control Plane (мозг) + Worker Nodes (мышцы). API Server — единственная точка входа. Etcd — source of truth. Scheduler выбирает ноду, Kubelet запускает контейнеры.

Kubernetes — распределённая система из множества компонентов, работающих согласованно. Кластер делится на две части: Control Plane (управление) и Worker Nodes (выполнение).

Control Plane (Управляющий слой)

Компоненты, принимающие решения. В production дублируются для отказоустойчивости (обычно 3 или 5 экземпляров).

API Server (kube-apiserver)

Центральная точка входа. Единственный компонент, с которым вы взаимодействуете через kubectl.

  • Принимает REST-запросы, проверяет авторизацию (RBAC), валидирует данные
  • Единственный, кто имеет право писать в Etcd
  • Все остальные компоненты общаются только через API Server

Etcd

Распределённое key-value хранилище. Хранит всё состояние кластера: какие поды запущены, конфиги, секреты, RBAC-правила.

  • Source of truth — если потеряете Etcd, потеряете кластер
  • Raft-консенсус — для отказоустойчивости нужно нечётное число узлов (3, 5)
  • Бэкап Etcd — критически важная операция в production

Scheduler (kube-scheduler)

Планировщик — решает, где запустить новый под.

  • Следит за подами без назначенной ноды (nodeName: "")
  • Учитывает: requests/limits ресурсов, affinity/anti-affinity, taints/tolerations, topology spread
  • Не запускает поды — только назначает ноду

Controller Manager (kube-controller-manager)

Набор контроллеров, приводящих текущее состояние к желаемому (reconciliation loop).

КонтроллерЧто делает
ReplicaSetПоддерживает нужное количество реплик
DeploymentУправляет rolling update и rollback
NodeСледит за здоровьем нод
JobЗапускает задачи до успешного завершения
ServiceAccountСоздаёт дефолтные SA для namespace

Worker Nodes (Рабочие узлы)

Машины, на которых запускаются ваши приложения.

Kubelet

Агент на каждой ноде.

  • Получает от API Server список подов для запуска
  • Управляет Container Runtime (containerd, CRI-O)
  • Выполняет health-проверки (liveness, readiness, startup probes)
  • Рапортует статус обратно в API Server

Kube-proxy

Сетевой компонент на каждой ноде.

  • Реализует абстракцию Service (iptables/IPVS правила)
  • Обеспечивает балансировку трафика между подами
  • Поддерживает ClusterIP, NodePort, LoadBalancer

Container Runtime

Непосредственный запуск контейнеров.

  • containerd — стандарт де-факто (с K8s 1.24)
  • CRI-O — минималистичная альтернатива
  • Docker Engine — не поддерживается напрямую с 1.24 (только через containerd)

Как это работает вместе

Когда вы выполняете kubectl apply -f deployment.yaml:

1. kubectl        → HTTP POST → API Server
2. API Server     → валидация + RBAC → сохранение в Etcd
3. Scheduler      → watch: новый под без ноды → назначает node-1
4. Kubelet (node-1) → watch: назначен новый под → Container Runtime
5. Container Runtime → pull image → start container
6. Kubelet        → рапортует статус → API Server → Etcd
┌─────────────────── Control Plane ───────────────────┐
│                                                       │
│  ┌──────────┐  ┌──────────┐  ┌─────────────────────┐ │
│  │  Etcd    │  │ Scheduler│  │  Controller Manager  │ │
│  └────┬─────┘  └────┬─────┘  └──────────┬──────────┘ │
│       │              │                   │             │
│       └──────────────┼───────────────────┘             │
│                      │                                 │
│              ┌───────┴────────┐                        │
│              │   API Server   │ ← kubectl / CI/CD      │
│              └───────┬────────┘                        │
└──────────────────────┼────────────────────────────────┘
                       │
          ┌────────────┼────────────┐
          │            │            │
   ┌──────┴──────┐ ┌──┴──────┐ ┌──┴──────┐
   │  Worker 1   │ │ Worker 2│ │ Worker 3│
   │  ┌───────┐  │ │         │ │         │
   │  │Kubelet│  │ │         │ │         │
   │  │Kube-  │  │ │  ...    │ │  ...    │
   │  │proxy  │  │ │         │ │         │
   │  │Runtime│  │ │         │ │         │
   │  └───────┘  │ │         │ │         │
   └─────────────┘ └─────────┘ └─────────┘

Kubernetes vs Docker Compose

СвойствоDocker ComposeKubernetes
Масштаб1 серверКластер (1-1000+ нод)
Self-healingrestart: alwaysScheduler перемещает под на другую ноду
ScalingВручнуюkubectl scale, HPA (автоматически)
Networkingbridge networkOverlay network (CNI), Service Discovery
Storagebind mounts, volumesPV/PVC, StorageClass, dynamic provisioning
Rolling updatedocker compose up -dDeployment strategy, zero-downtime
Secrets.env файлыEncrypted Secrets, RBAC

Подводные камни

ЗаблуждениеРеальность
«K8s нужен для любого проекта»Для 1-3 серверов Docker Compose проще и дешевле. K8s оправдан при масштабировании и высокой доступности
«Pod = контейнер»Pod — группа контейнеров с общей сетью и storage. Обычно 1 контейнер, но бывают sidecar-паттерны
«Etcd можно не бэкапить»Потеря Etcd = потеря кластера. etcdctl snapshot save — обязательная процедура
«kubectl = единственный клиент»API Server принимает любые HTTP-запросы. CI/CD, Terraform, Ansible — все работают через REST API