Архитектура Kubernetes и глубокий разбор компонентов Control Plane
Архитектура Kubernetes и глубокий разбор компонентов Control Plane
Парадокс Kubernetes заключается в том, что сам оркестратор не запускает ни одного контейнера и не маршрутизирует ни одного байта пользовательского трафика. По своей сути Kubernetes — это гигантская, распределенная машина состояний. Вы просто описываете желаемое состояние системы (Desired State), а компоненты кластера бесконечно сверяют его с текущим состоянием (Actual State) и пытаются устранить разницу.
Для успешной сдачи CKA и прохождения технических интервью недостаточно знать, как создать Pod. Вы должны понимать, кто именно в кластере принимает решение о его создании, где хранится информация об этом и как компоненты общаются между собой.
Две половины мозга: Control Plane и Worker Nodes
Архитектуру Kubernetes можно разделить на две фундаментальные части.
- Control Plane (Управляющий слой) — мозг кластера. Он принимает глобальные решения (например, на каком узле запустить приложение), обнаруживает события и реагирует на них.
- Worker Nodes (Рабочие узлы) — мускулы кластера. Это серверы, на которых физически работают ваши контейнеры.
Чтобы кластер работал как единый механизм, компоненты должны иметь строгую специализацию. Давайте разберем Control Plane под микроскопом.
Анатомия Control Plane
В классическом кластере (созданном через kubeadm) компоненты Control Plane запускаются в виде статических подов (Static Pods) в пространстве имен kube-system.
CKA Cheat: Манифесты статических подов Control Plane по умолчанию лежат в директории
/etc/kubernetes/manifests/. Если вы измените YAML-файл в этой папке,kubeletавтоматически перезапустит соответствующий компонент. Это ключевой навык для траблшутинга на экзамене.
1. kube-apiserver (Центральный коммутатор)
kube-apiserver — это единственный компонент кластера, с которым взаимодействуете вы (через kubectl) и все остальные компоненты системы.
Ключевые особенности:
- Stateless (не хранит состояние): Сам API-сервер не запоминает данные. Он масштабируется горизонтально простым добавлением новых реплик за балансировщиком нагрузки.
- Единая точка входа: Ни один компонент кластера (кроме API-сервера) не имеет прямого доступа к базе данных
etcd. - Функции: Аутентификация, авторизация (RBAC), валидация запросов (Admission Control) и маршрутизация манифестов.
2. etcd (Абсолютная память)
etcd — это высокодоступное распределенное хранилище пар «ключ-значение» (key-value store). Это единственный stateful-компонент в Control Plane.
Если kube-apiserver — это коммутатор, то etcd — это единственный источник истины (Single Source of Truth). В нем хранятся все конфигурации, секреты и состояния объектов.
Что нужно помнить для CKA:
etcdиспользует алгоритм консенсуса Raft. Для обеспечения отказоустойчивости кластерetcdдолжен состоять из нечетного количества узлов (обычно 3 или 5).- Если данные в
etcdпотеряны, кластер Kubernetes фактически перестает существовать, даже если контейнеры все еще работают на узлах. - На экзамене CKA обязательно будет задача на резервное копирование и восстановление (Backup & Restore)
etcdс использованием утилитыetcdctl.
3. kube-scheduler (Распределитель ресурсов)
Многие думают, что scheduler запускает поды на узлах. Это ошибка, на которой часто ловят на интервью.
kube-scheduler ничего не запускает. Его единственная задача — заметить новый Pod без назначенного узла (nodeName пустое), проанализировать доступные ресурсы кластера и выбрать оптимальный узел для этого пода.
Процесс принятия решения состоит из двух этапов:
- Filtering (Фильтрация): Отсеиваются узлы, которые не подходят аппаратно (не хватает CPU/RAM) или логически (Taints, Node Selectors).
- Scoring (Оценка): Оставшимся узлам выставляются баллы по ряду критериев (например, приоритет отдается узлу, где уже есть нужные образы контейнеров). Узел с максимальным баллом побеждает.
После выбора узла scheduler просто отправляет запрос в kube-apiserver с сообщением: "Привяжи Pod X к Узлу Y".
4. kube-controller-manager (Неутомимый надзиратель)
Это набор фоновых процессов (контроллеров), которые непрерывно следят за состоянием кластера через kube-apiserver. Их задача — приводить Actual State к Desired State.
Внутри kube-controller-manager работают десятки контроллеров. Вот основные:
- Node Controller: Следит за тем, живы ли рабочие узлы.
- ReplicaSet Controller: Гарантирует, что работает ровно столько реплик пода, сколько указано в конфигурации.
- EndpointSlice Controller: Связывает сервисы с подами (заполняет списки IP-адресов).
- ServiceAccount & Token Controllers: Создают стандартные аккаунты и токены доступа для новых пространств имен.
Сводная таблица компонентов
| Компонент | Роль в кластере | Порт по умолчанию | Состояние |
|---|---|---|---|
| kube-apiserver | Интерфейс взаимодействия и валидации | 6443 | Stateless |
| etcd | База данных, источник истины | 2379, 2380 | Stateful |
| kube-scheduler | Выбор узла для запуска Pod | 10259 | Stateless |
| kube-controller-manager | Поддержание желаемого состояния | 10257 | Stateless |
Коротко о Worker Nodes
Хотя фокус этой статьи — Control Plane, для понимания общей картины необходимо упомянуть агентов, работающих на рабочих узлах:
- kubelet: "Капитан" узла. Он получает от
kube-apiserverспецификации подов (PodSpecs) и приказывает Container Runtime запустить или остановить контейнеры. Также он постоянно рапортует API-серверу о состоянии узла. - kube-proxy: Сетевой прокси-сервер. Он обновляет правила маршрутизации операционной системы (через
iptablesилиIPVS), чтобы сетевой трафик правильно доходил до подов. - Container Runtime: Программное обеспечение, ответственное за непосредственный запуск контейнеров (containerd, CRI-O).
Жизненный цикл создания Pod: Как они общаются?
Понимание того, как компоненты взаимодействуют между собой — это ключ к успешному траблшутингу. Рассмотрим классический сценарий: вы выполняете команду kubectl apply -f pod.yaml.
Вот текстовая расшифровка этого процесса (идеальный ответ на техническом интервью):
- kubectl валидирует YAML локально и отправляет HTTP POST запрос в kube-apiserver.
- kube-apiserver аутентифицирует вас, проверяет права (RBAC), валидирует манифест и записывает объект Pod в etcd со статусом
Pending(узел еще не назначен). - kube-apiserver подтверждает
kubectl, что Pod успешно создан в базе. - kube-scheduler непрерывно опрашивает API-сервер. Он замечает новый Pod без привязки к узлу.
- kube-scheduler вычисляет лучший узел для пода и отправляет запрос
Bindingобратно в kube-apiserver. - kube-apiserver обновляет запись в etcd, добавляя имя узла в спецификацию пода.
- kubelet на выбранном узле (который тоже непрерывно слушает API-сервер) замечает, что ему назначен новый Pod.
- kubelet обращается к Container Runtime (например, containerd) с командой скачать образ и запустить контейнер.
- После успешного запуска kubelet отправляет статус
Runningобратно в kube-apiserver, который финально обновляет данные в etcd.
В этой цепочке никто не общается друг с другом напрямую. Все коммуникации происходят исключительно через подписки (watches) на изменения в kube-apiserver.
Понимание этой архитектуры позволит вам на экзамене CKA быстро локализовать проблему. Если Pod висит в статусе Pending, проблема, скорее всего, в scheduler или нехватке ресурсов. Если Pod создается, но контейнер не стартует (статус ContainerCreating или CrashLoopBackOff), проблема на стороне kubelet или Container Runtime на конкретном узле.