Что такое kubelet и какую роль он выполняет?
Что такое kubelet
kubelet — это агент, который запускается на каждой ноде Kubernetes. Его задача — привести локальный узел в соответствие с тем «желаемым состоянием», которое описано в API-сервере для этой ноды (Pod-ы, тома, конфигурации), и докладывать о состоянии обратно в кластер. Проще: kubelet — «локальный исполнитель» и наблюдатель за Pod-ами на конкретном хосте.
Основные обязанности
-
Наблюдает за Pod-объектами из API, назначенными на эту ноду, и создаёт/удаляет контейнеры согласно шаблону.
-
Запускает контейнеры через Container Runtime Interface (CRI) — например containerd, CRI-O.
-
Настраивает сеть для Pod (через CNI плагины) и монтирует тома/CSI-драйверы.
-
Выполняет liveness/readiness/startup-пробы и обновляет статус контейнеров и Pod в API.
-
Отчитывается о состоянии ноды (NodeStatus, heartbeat/NodeLease) — ресурсы, условия (Ready), давление памяти/диска.
-
Управляет ресурсами на ноде: контроль eviction, освобождение при давлении (OOM, diskPressure), применяет kube-reserved/system-reserved.
-
Обслуживает статические Pod-ы (файлы на диске) и создаёт mirror-Pods в API.
-
Экспонирует локальные эндпойнты: метрики (/metrics), health (/healthz), API для debug (/exec, /logs).
Жизненный цикл Pod — пошагово (что делает kubelet)
-
Получает список Pod-ов для ноды (watch API-server).
-
Для нового Pod: проверяет изображения, загружает image (pull) если нужно через CRI.
-
Подготавливает и монтирует тома (Volume manager + CSI).
-
Вызывает CNI для создания сетевого namespace и присвоения IP.
-
Создаёт контейнеры через CRI (create/start).
-
Запускает probes; при успехе помечает Pod как Ready и обновляет endpoints.
-
Мониторит статус контейнеров, логи, возвращает статусы и события в API.
-
При удалении: выполняет preStop hook, посылает SIGTERM в контейнеры, ждёт terminationGracePeriodSeconds, затем убивает и очищает ресурсы.
Взаимодействие с CRI/CNI/CSI
-
CRI: kubelet вызывает стандартные методы (PullImage, CreateContainer, StartContainer, etc.).
-
CNI: kubelet запускает CNI плагины для сетевой конфигурации Pod.
-
CSI: kubelet использует CSI-плагины для attach/mount/resize томов.
Ресурсный контроль и эвикшены
kubelet следит за локальными лимитами и порогами eviction. При давлении (memory/disk/inodes) он инициирует эвикшен Pod-ов по приоритету QoS (BestEffort → Burstable → Guaranteed) и по политике. Также поддерживает kube-reserved/system-reserved и настройки evictionHard/Soft.
Безопасность и аутентификация
kubelet использует TLS для общения с API и для собственного сервера (порт 10250). Реализованы механизмы аутентификации/авторизации, bootstrap TLS-сертификатов, RBAC ограничение доступа к kubelet API. Рекомендуется отключать read-only или ограничивать доступ извне.
Наблюдаемость и отладка
kubelet экспортирует Prometheus-метрики, журналы (systemd/journal или stdout контейнеров), события Kubernetes (kube-events). Полезные команды: kubectl describe node, kubectl get pods -o wide, journalctl -u kubelet.
Особые режимы
-
Static Pods: kubelet следит за .yaml файлами на диске и запускает их локально; создает mirror-Pods в API.
-
Pod eviction & graceful shutdown: kubelet контролирует порядок завершения, выполняет preStop, обеспечивает drain/nodectl behavior.
Конфигурация
kubelet настраивается флагами и kubelet.config (kubelet config file): адреса API, eviction thresholds, cgroup driver, feature gates, node labels/taints, authentication settings и т.п.
Kubelet — критический компонент операционной плоскости: он связывает контроллеры и scheduler с реальным исполнением на хосте, управляет контейнерным рантаймом, сетью и локальными ресурсами, обеспечивая self-healing и отчётность кластера.