Как работает kubelet в Windows Node?
Kubelet — это ключевой компонент Kubernetes, отвечающий за управление подами и контейнерами на узле (Node). Он работает на каждой ноде кластера, включая Windows-ноды, и обеспечивает взаимодействие между нодой и API-сервером Kubernetes.
Работа kubelet в Windows Node имеет ряд особенностей по сравнению с Linux, но основная функциональность остаётся той же. Давайте разберёмся, как он работает.
🔧 Основные задачи Kubelet
На любом узле (Linux или Windows), kubelet выполняет следующие функции: - Запускает и останавливает Pod'ы. - Следит за состоянием Pod'ов и сообщает об этом master-узлу. - Взаимодействует с CRI (Container Runtime Interface) для управления контейнерами. - Обеспечивает здоровье узла через liveness/readiness пробы. - Управляет томами (volume mounting). - Отправляет метрики и статус узла.
🖥️ Особенности работы Kubelet на Windows
1. Запуск Kubelet
- На Windows kubelet запускается как служба Windows (Windows Service).
- Обычно устанавливается через инструменты вроде
kubeadm
,kubespray
или вручную. - Бинарник
kubelet.exe
доступен в официальных релизах Kubernetes:
https://github.com/kubernetes/kubernetes/releases
Пример команды запуска:
kubelet.exe --kubeconfig=c:\k\config --hostname-override=$(hostname) --cloud-provider=external --feature-gates=...
⚠️ Обратите внимание: пути используют обратные слэши (
\
), а конфигурационные файлы должны быть в правильном формате.
2. Контейнерный runtime
На Windows используется Docker или containerd с поддержкой Windows Containers.
- Docker: Поддерживался ранее, сейчас считается устаревшим в Kubernetes (deprecated).
- containerd: Рекомендуемый вариант. Начиная с версии containerd 1.4+, есть полноценная поддержка Windows через CRI.
✅ На Windows node должен быть установлен и запущен containerd с включённым CRI-плагином.
3. Типы контейнеров
Windows поддерживает два типа изоляции контейнеров: - process isolation — легковесная изоляция (похоже на chroot). - hypervisor isolation — более безопасная, с использованием Hyper-V.
Kubelet выбирает тип на основе спецификации Pod.
4. Сетевые особенности
- Используется CNI (Container Network Interface) плагин, совместимый с Windows (например, Flannel, Calico, Antrea).
- На Windows CNI реализуется через WinPod и сетевые драйверы, такие как l2bridge или Overlay (VXLAN).
- Kubelet запускает CNI-плагин для настройки сетевых интерфейсов Pod'а.
Пример: Flannel использует
host-gw
илиvxlan
режимы на Windows.
5. Поддержка образов
- Kubelet скачивает образы через containerd/Docker.
- Образы должны быть собраны для Windows (платформа
windows/amd64
). - Совместимость версий ОС: образ должен соответствовать версии хоста (например, Windows Server 2019, 2022).
6. Интеграция с Windows Security
- Kubelet учитывает политики безопасности Windows.
- Поддержка gMSA (Group Managed Service Accounts) для доменных приложений.
- Возможность запуска Pod'ов с определёнными учётными записями (User/Group).
7. Логирование и мониторинг
- Логи kubelet пишутся в файл (например,
C:\k\logs\kubelet.log
) или в журнал событий Windows (Event Log). - Метрики доступны через
/metrics
endpoint (на порту 10250). - Интеграция с Metrics Server, Prometheus и kube-state-metrics возможна.
8. Ограничения и отличия от Linux
Функция | Linux | Windows |
---|---|---|
PID | Да | Нет (или ограничено) |
cgroups | cgroups v1/v2 | Job Objects (аналог) |
systemd | Да | Нет (используются службы Windows) |
init системы | systemd/upstart | Services + Task Scheduler |
Сигналы | SIGTERM, SIGKILL | Через API завершения процесса |
Поддержка всех CNI | Полная | Ограниченная (только Windows-совместимые) |
🛠️ Как проверить работу Kubelet на Windows?
# Проверить статус службы
Get-Service kubelet
# Посмотреть логи
Get-Content C:\k\logs\kubelet.log -Tail 50
# Проверить, что узел в Ready состоянии
kubectl get nodes -o wide
✅ Рекомендации
- Используйте containerd вместо Docker.
- Убедитесь, что версии Kubernetes, containerd и ОС совместимы.
- Настройте CNI перед запуском kubelet.
- Используйте
--windows-service
флаг при необходимости (для запуска как службы). - Включайте необходимые feature gates, например:
bash --feature-gates=WindowsHostNetwork=true