Привет, Хабр!

Kubelet — это агент, который работает на каждом узле в кластере Kubernetes. Он отвечает за то, чтобы контейнеры в Pod'ах были запущены и функционировали в соответствии с предоставленными спецификациями PodSpec. Kubelet непрерывно общается с сервером API Kubernetes, чтобы проверять и поддерживать состояние узлов и контейнеров. Без Kubelet, управление контейнерами стало бы нестабильным и непредсказуемым, так как он обеспечивает регулярную проверку состояния и восстановление контейнеров, управляет их жизненным циклом и реагирует на изменения в конфигурации.

Как работает Kubelet

Kubelet функционирует как основной агент узла, который запускается на каждом узле кластера Kubernetes. Он регистрирует узел в API сервере Kubernetes, используя либо имя хоста, либо флаг для переопределения имени хоста, либо специальную логику для облачного провайдера.

Основная задача Kubelet — следить за тем, чтобы контейнеры в подах были запущены и работали в соответствии с PodSpecs, которые предоставляются через API сервер. Kubelet получает эти спецификации и обеспечивает выполнение контейнеров, описанных в них. Поды могут быть предоставлены Kubelet через файлы на диске или HTTP-эндпоинт, и Kubelet периодически проверяет эти места на наличие обновлений.

Kubelet использует различные конфигурации и флаги для настройки своей работы: IP-адрес для обслуживания, параметры безопасности и тайм-ауты для кеширования ответов аутентификационных веб-хуков.

Настройка

Процесс настройки начинается с создания файла конфигурации в форматах JSON или YAML, который представляет собой структурированное описание параметров, которые должен использовать Kubelet.

Основные параметры конфигурации:

Address и Port: указывают IP-адрес и порт, на которых Kubelet будет слушать входящие запросы.

Eviction policies: параметры вытеснения помогают управлять поведением Kubelet при нехватке ресурсов, например, определяя пороги для доступной памяти memory.available, доступного места на файловой системе узла nodefs.available и файловой системе образов imagefs.available.

Resource management: включает настройки, касающиеся распределения и лимитов ресурсов, таких как CPU и память для контейнеров.

Пример:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: "192.168.0.8"
port: 20250
serializeImagePulls: false
evictionHard:
    memory.available: "100Mi"
    nodefs.available: "10%"
    nodefs.inodesFree: "5%"
    imagefs.available: "15%"

Здесь Kubelet настроен на работу по IP-адресу 192.168.0.8 и порту 20250, с дополнительными настройками для параллельной загрузки изображений и политик вытеснения.

Можно также настроить более специфические аспекты поведения Kubelet, такие как:

Также есть такие настройки:

  1. hairpinMode - определяет, как Kubelet должен настраивать сетевой мост контейнера для обработки пакетов hairpin, может принимать значения: promiscuous-bridge, hairpin-veth или none. По умолчанию используется promiscuous-bridge, что предполагает наличие моста контейнеров cbr0.

  2. maxPods - максимальное количество подов, которое может быть запущено на данном Kubelet. Значение по умолчанию — 110.

  3. podPidsLimit - ограничение на количество PID в любом поде. По умолчанию не установлено (-1), что означает отсутствие ограничения.

  4. resolvConf - файл конфигурации резолвера, используемый в качестве основы для настройки разрешения DNS в контейнерах. По умолчанию используется /etc/resolv.conf.

  5. cpuCFSQuota - включает или отключает квоты CPU CFS для контейнеров, которые указывают лимиты CPU. По умолчанию включено.

  6. runtimeRequestTimeout - таймаут для всех запросов к runtime, кроме длительных запросов, таких как pull, logs, exec и attach. Значение по умолчанию — 2 минуты.

  7. contentType - MIME-тип содержимого запросов, отправляемых на apiserver. По умолчанию используется application/vnd.kubernetes.protobuf.

  8. kubeAPIQPS и kubeAPIBurst - эти параметры контролируют скорость и интенсивность запросов к API Kubernetes.

  9. cpuManagerPolicy: определяет политику управления CPU, которая может быть настроена для оптимизации использования CPU в зависимости от типа задач.

  10. topologyManagerPolicy: управляет распределением ресурсов с учетом топологии оборудования.

При использовании kubeadm для инициализации кластера параметры Kubelet могут быть заданы непосредственно через команду kubeadm init с использованием флага --config для указания пути к файлу конфигурации.

Мониторинг и логирование Kubelet

Prometheus и Grafana юзают для мониторинга в Kubernetes. Prometheus собирает метрики с помощью HTTP(S), обходя узлы и собирая информацию, которую затем можно визуализировать с помощью Grafana. Prometheus может мониторить различные компоненты Kubernetes, включая Kubelet, с помощью exporters, таких как Node exporter и Kube-state-metrics, которые собирают инфу о состоянии узлов и кластера соответственно.

Для логирования Kubelet в Kubernetes обычно используются стандартные потоки вывода и ошибок. Kubernetes автоматом агрегирует эти логи и перенаправляет их во внешние системы логирования.

В Kubernetes также есть возможность запроса логов узлов с помощью Kubelet API. Например, можно запросить логи Kubelet с определенного узла, используя команды типа:

kubectl get --raw "/api/v1/nodes/<node-name>/proxy/logs/?query=kubelet"

Про инструменты инфраструктуры подробнее рассказывают преподаватели OTUS в рамках практических онлайн курсов. С полным списком курсов можно ознакомиться в каталоге.

Комментарии (0)