Что такое 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)

  1. Получает список Pod-ов для ноды (watch API-server).

  2. Для нового Pod: проверяет изображения, загружает image (pull) если нужно через CRI.

  3. Подготавливает и монтирует тома (Volume manager + CSI).

  4. Вызывает CNI для создания сетевого namespace и присвоения IP.

  5. Создаёт контейнеры через CRI (create/start).

  6. Запускает probes; при успехе помечает Pod как Ready и обновляет endpoints.

  7. Мониторит статус контейнеров, логи, возвращает статусы и события в API.

  8. При удалении: выполняет 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 и отчётность кластера.