Как ответить
Архитектура Kubernetes строится вокруг двух ключевых ролей: control plane (управляющая плоскость) и worker nodes (рабочие узлы). Control plane принимает решения и управляет состоянием кластера, а worker nodes запускают контейнеры. Если коротко — control plane решает, что и где запускать, а worker nodes это выполняют.
Control plane компоненты:
- kube-apiserver — единственная точка входа для всех компонентов и CLI (kubectl). Это REST API, который валидирует и обрабатывает запросы. Без него кластер не работает. В production обычно ставят за балансировщиком, чтобы не было единой точки отказа.
- etcd — распределённое key-value хранилище, где лежит всё состояние кластера: поды, сервисы, конфиги, секреты. etcd — мозг кластера. Если etcd упадёт, кластер перестанет быть согласованным. Важно: etcd — единственный stateful компонент, его нужно бэкапить.
- kube-scheduler — решает, на какой worker node запустить новый под. Учитывает ресурсы (CPU, memory), affinity/anti-affinity правила, taints/tolerations, и распределение подов по нодам. По умолчанию — round-robin с учётом занятости.
- kube-controller-manager — набор контроллеров, которые следят за состоянием кластера. Например, ReplicaSet controller проверяет, что нужное количество подов запущено, Node controller реагирует на падение нод, Endpoint controller обновляет endpoint’ы сервисов.
- cloud-controller-manager (опционально) — интеграция с облачным провайдером: создаёт балансировщики, диски, роутит трафик. В bare-metal не нужен.
Worker node компоненты:
- kubelet — агент на каждой ноде. Получает от apiserver’а описание подов и гарантирует, что контейнеры запущены и работают. Если под упал — kubelet перезапускает его. Основной исполнитель на ноде.
- kube-proxy — обрабатывает сетевые правила на ноде: iptables или IPVS. Обеспечивает балансировку трафика между подами сервиса. Без него Service’ы не будут работать.
- Container runtime — программа, которая запускает контейнеры. Раньше по умолчанию был Docker, сейчас чаще containerd или CRI-O. kubelet общается с runtime через CRI (Container Runtime Interface).
Дополнительно:
- Pod — минимальная единица, группа из одного или нескольких контейнеров с общим storage и сетью. В production обычно один контейнер на под.
- Service — абстракция, которая даёт стабильный IP и DNS для группы подов. Бывают ClusterIP (внутри кластера), NodePort (доступ снаружи через порт ноды), LoadBalancer (облачный балансировщик).
- Ingress — HTTP/HTTPS маршрутизация снаружи внутрь кластера. Часто используют nginx-ingress или traefik.
На практике для middle-разработчика важно понимать: при деплое приложения ты работаешь с манифестами (Deployment, Service, ConfigMap), а kube-apiserver и scheduler уже решают, где и как это запустить. Если под не стартует — первым делом смотришь логи kubelet на ноде и статус etcd.