1. Архитектура Kubernetes: глубокое погружение во взаимодействие компонентов Control Plane и Worker Nodes
Архитектура Kubernetes: глубокое погружение во взаимодействие компонентов Control Plane и Worker Nodes
Когда вы выполняете команду kubectl apply -f deployment.yaml, в кластере запускается сложнейшая цепочка событий, напоминающая работу слаженного оркестра. Но задумывались ли вы, почему Kubernetes называют «декларативным»? В отличие от императивных систем, где вы приказываете «создай виртуальную машину», в Kubernetes вы описываете желаемое состояние: «я хочу, чтобы всегда работало три копии этого приложения». Магия системы заключается в том, как компоненты Control Plane и Worker Nodes договариваются между собой, чтобы это желание стало реальностью, даже если прямо сейчас в дата-центре горит стойка с серверами.
Философия управления: Декларативность и Control Loop
Фундамент Kubernetes — это концепция петли управления (Control Loop). Это бесконечный цикл, который выполняет три действия:
Эта логика пронизывает всю архитектуру. Если вы удалите Pod вручную, система не «обидится», она просто увидит, что в базе данных числится три реплики, а по факту работают две. Контроллер немедленно отдаст команду на создание новой. Чтобы понять, как это работает на уровне «железа» и системных вызовов, нужно разделить кластер на две логические части: мозг (Control Plane) и руки (Worker Nodes).
Control Plane: Мозговой центр кластера
Control Plane отвечает за принятие глобальных решений (например, планирование задач) и обнаружение событий в кластере. Это не монолит, а набор специализированных сервисов.
kube-apiserver: Единственная точка истины
API Server — это «лицо» Control Plane и единственный компонент, который напрямую общается с хранилищем данных. Все остальные участники — будь то системный контроллер или администратор с kubectl — обязаны идти через него.
Работа API Server строится на REST-интерфейсе. Когда запрос поступает в систему, он проходит через строгий конвейер:
* Аутентификация: проверка, кто пришел (сертификаты, токены).
* Авторизация: проверка прав (RBAC — Role-Based Access Control). Имеет ли этот пользователь право создавать Pod в этом пространстве имен?
* Admission Control: специальные плагины, которые могут модифицировать или отклонить запрос. Например, ResourceQuota проверит, не превысили ли вы лимит по памяти в данном проекте.
Важнейшая особенность API Server — его «глупость» в хорошем смысле. Он не знает, как запускать контейнеры. Он умеет только валидировать данные, сохранять их и уведомлять подписчиков об изменениях через механизм Watch.
etcd: Память системы
Все состояние кластера хранится в etcd — высокодоступном распределенном хранилище типа «ключ-значение». Если API Server — это интерфейс, то etcd — это жесткий диск Kubernetes.
Здесь используется алгоритм консенсуса Raft. Это означает, что для записи данных необходимо подтверждение от большинства узлов (кворума). Если у вас три узла etcd и два из них вышли из строя, кластер перейдет в режим «только чтение», так как кворум () не будет достигнут.
> Важно понимать: Kubernetes не хранит состояние самих приложений (ваши базы данных или картинки пользователей), он хранит только метаданные о ресурсах кластера.
kube-scheduler: Мастер размещения
Когда в системе появляется новый Pod без указанного узла (nodeName пуст), за дело берется Scheduler. Его задача — найти наиболее подходящую ноду для запуска. Процесс выбора делится на два этапа:
nodeSelector, наличие Taints (запретов на размещение), которые Pod не может игнорировать.Результат работы планировщика — запись в API Server о том, что Pod "X" назначен на ноду "Y". Сам планировщик ничего не запускает — он просто ставит «штамп» в документах.
kube-controller-manager: Вечный страж
Это процесс, в котором запущены десятки различных контроллеров. Каждый из них следит за своим типом ресурсов. * Node Controller: следит за состоянием узлов. Если нода перестает отвечать, он помечает её как недоступную. * Replication Controller: обеспечивает работу нужного количества реплик Pod. * Endpoints Controller: связывает сервисы (Services) и конкретные Pod'ы, заполняя списки IP-адресов.
Контроллеры работают по принципу «Edge-driven» и «Level-driven». Они реагируют на события (изменение объекта), но также периодически сканируют состояние, чтобы убедиться, что ничего не было упущено.
Worker Nodes: Исполнители на местах
Worker Nodes — это серверы (виртуальные или физические), где фактически работают ваши контейнеры. Здесь также есть свои ключевые компоненты.
kubelet: Капитан корабля на ноде
kubelet — это агент, который запускается на каждом узле. Если API Server — это штаб, то kubelet — это командир на передовой. Он получает от API Server список Pod'ов, которые должны быть запущены на его узле (через тот самый механизм Watch).
Основные обязанности kubelet:
* Взаимодействие с Container Runtime для запуска и остановки контейнеров.
* Мониторинг состояния контейнеров и отправка отчетов (Liveness/Readiness status) обратно в API Server.
* Монтирование томов (Volumes) и управление секретами.
* Очистка узла от неиспользуемых образов и завершенных контейнеров.
Интересный нюанс: kubelet может работать и без API Server. Если положить манифест в специальную локальную директорию на диске узла, kubelet запустит так называемые Static Pods. Именно так часто запускаются сами компоненты Control Plane в инсталляциях типа kubeadm.
kube-proxy: Сетевой регулировщик
kube-proxy отвечает за сетевую связность. Он реализует концепцию Service — абстракцию, которая дает стабильный IP-адрес группе динамических Pod'ов.
В большинстве современных систем kube-proxy работает в режиме IPVS или iptables. Он не является прокси-сервером в классическом понимании (через который проходит весь трафик), а скорее «программистом» сетевого стека Linux. Он прописывает правила форвардинга: «если пакет идет на IP сервиса 10.96.0.10, перенаправь его на IP одного из живых Pod'ов».
Container Runtime: Двигатель
Kubernetes не умеет запускать контейнеры сам. Ему нужен посредник. Раньше это был Docker, но сейчас стандартом является использование среды, поддерживающей CRI (Container Runtime Interface), например containerd или CRI-O. Среда исполнения отвечает за: * Скачивание образов из реестра. * Создание изолированного окружения (Namespaces и Cgroups в Linux). * Запуск процесса внутри этого окружения.
Анатомия взаимодействия: Путь одного Pod
Чтобы закрепить понимание архитектуры, проследим путь создания приложения от команды пользователя до работающего процесса.
kubectl apply -f my-app.yaml. Утилита kubectl парсит YAML, проверяет его на базовые ошибки и отправляет HTTP POST запрос в kube-apiserver.kube-controller-manager) видит новый объект Deployment. Его логика говорит: «Для этого Deployment мне нужно создать объект ReplicaSet». Он отправляет запрос в API Server на создание ReplicaSet.etcd есть записи о трех Pod, но у них есть одна проблема — в поле nodeName пусто. Они находятся в статусе Pending.kubelet сообщает API Server, что Pod успешно запущен. Статус меняется на Running.Нюансы отказоустойчивости Control Plane
В промышленной эксплуатации (Production) Control Plane никогда не состоит из одного узла. Типичная схема — 3 или 5 мастеров.
| Компонент | Механизм отказоустойчивости | | :--- | :--- | | etcd | Кластеризация по протоколу Raft. Требуется нечетное количество узлов. | | kube-apiserver | Stateless-компонент. Можно ставить сколько угодно экземпляров за внешним Load Balancer. | | Scheduler & Controller Manager | Используют механизм Lease (аренда). В один момент времени активен только один экземпляр (Leader Election), остальные находятся в режиме ожидания. |
Если «умрет» активный Controller Manager, один из запасных заметит исчезновение записи об аренде в API Server и возьмет управление на себя. Это гарантирует, что в кластере не возникнет ситуации «двоевластия», когда два планировщика пытаются отправить один и тот же Pod на разные узлы.
Граничные случаи: Что будет, если...?
Разберем ситуации, которые часто встречаются в реальности и проверяют архитектуру на прочность.
Сценарий 1: API Server недоступен.
Если «голова» отключена, текущие Pod'ы продолжат работать на узлах. kubelet не будет их убивать. Однако вы не сможете вносить изменения: деплоить новые версии, масштабировать или удалять ресурсы. Если в этот момент упадет какой-то контейнер, система не сможет его пересоздать на другом узле, так как некому отдать команду.
Сценарий 2: etcd переполнен или тормозит.
Поскольку все операции проходят через etcd, его задержки (latency) напрямую влияют на скорость работы кластера. Если диск под etcd медленный, API Server будет долго отвечать на запросы, что может привести к тайм-аутам в контроллерах. В худшем случае кластер «развалится», так как компоненты не смогут подтвердить свое состояние.
Сценарий 3: Разрыв сети между Master и Worker.
Если узел теряет связь с Control Plane, Node Controller ждет определенное время (по умолчанию 5 минут, настраивается через pod-eviction-timeout). Если связь не восстанавливается, Control Plane считает узел мертвым и начинает процесс «эвакуации» — создания копий всех Pod'ов этого узла на других доступных нодах. При этом старый kubelet, если он жив, может продолжать крутить контейнеры в изоляции, пока не восстановится связь и он не получит команду на удаление.
Специфика взаимодействия через gRPC и HTTP/2
Внутренние коммуникации Kubernetes оптимизированы. API Server использует протокол HTTP/2, что позволяет держать открытыми длительные соединения для механизма Watch. Это гораздо эффективнее, чем если бы тысячи агентов каждую секунду опрашивали сервер (Polling).
Взаимодействие между kubelet и Container Runtime (CRI), а также сетевыми плагинами (CNI) и плагинами хранилищ (CSI) происходит через gRPC по Unix-сокетам. Это минимизирует накладные расходы на передачу данных внутри самой операционной системы узла.
Иерархия объектов и владение (Owner References)
Архитектура Kubernetes опирается на строгую иерархию. Deployment «владеет» ReplicaSet, а ReplicaSet «владеет» Pod'ами. В метаданных каждого дочернего объекта есть поле ownerReferences.
Это критически важно для процесса очистки (Garbage Collection). Когда вы удаляете Deployment, каскадный контроллер находит все связанные ReplicaSet и Pod'ы и удаляет их. Без этого механизма кластер быстро заполнился бы «сиротами» — ресурсами, которые работают, но никем не управляются.
Резюмируя устройство системы
Kubernetes — это не просто оркестратор, это распределенная база данных состояния с набором интеллектуальных агентов, которые стремятся привести реальность к этому состоянию.
* Control Plane — это хранилище (etcd), шлюз (API Server) и логика принятия решений (Scheduler, Controllers).
* Worker Nodes — это вычислительные мощности, где kubelet следит за порядком, а kube-proxy плетет сеть.
Понимание этого взаимодействия позволяет не только успешно дебажить проблемы (например, почему Pod завис в Pending — смотрим Scheduler; почему не обновляется конфиг — проверяем kubelet), но и проектировать по-настоящему отказоустойчивые системы, учитывая ограничения и возможности каждого компонента. В следующих главах мы перейдем от теории архитектуры к практике управления ресурсами, где эти знания станут фундаментом для настройки Requests и Limits.