Привет, Хабр!
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, такие как:
Также есть такие настройки:
hairpinMode
- определяет, как Kubelet должен настраивать сетевой мост контейнера для обработки пакетов hairpin, может принимать значения:promiscuous-bridge,
hairpin-veth
илиnone
. По умолчанию используетсяpromiscuous-bridge
, что предполагает наличие моста контейнеров cbr0.maxPods
- максимальное количество подов, которое может быть запущено на данном Kubelet. Значение по умолчанию — 110.podPidsLimit
- ограничение на количество PID в любом поде. По умолчанию не установлено (-1), что означает отсутствие ограничения.resolvConf
- файл конфигурации резолвера, используемый в качестве основы для настройки разрешения DNS в контейнерах. По умолчанию используется /etc/resolv.conf.cpuCFSQuota
- включает или отключает квоты CPU CFS для контейнеров, которые указывают лимиты CPU. По умолчанию включено.runtimeRequestTimeout
- таймаут для всех запросов к runtime, кроме длительных запросов, таких как pull, logs, exec и attach. Значение по умолчанию — 2 минуты.contentType
- MIME-тип содержимого запросов, отправляемых на apiserver. По умолчанию используется application/vnd.kubernetes.protobuf.kubeAPIQPS
иkubeAPIBurst
- эти параметры контролируют скорость и интенсивность запросов к API Kubernetes.cpuManagerPolicy
: определяет политику управления CPU, которая может быть настроена для оптимизации использования CPU в зависимости от типа задач.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 в рамках практических онлайн курсов. С полным списком курсов можно ознакомиться в каталоге.