В чем отличие ноды, пода и сервиса в Kubernetes
Что проверяют
Понимаете ли вы, где физически работает ваш Node.js-сервис и как до него доходит трафик. Следом спрашивают, почему нельзя ходить в под по IP и чем Deployment отличается от пода.
Как отвечать
Три уровня, от железа к сети:
- нода: виртуальная или физическая машина кластера. На ней работают
kubelet(запускает поды и следит за ними), среда выполнения контейнеров вроде containerd иkube-proxyили его замена в CNI. Планировщик выбирает ноду по запросам ресурсов, taints и affinity; - под: минимальная единица развёртывания, один или несколько контейнеров с общей сетью (один IP, общий
localhost) и общими томами. Под смертен и при пересоздании получает новый IP. Вручную поды почти не создают, ими управляет Deployment через ReplicaSet; - сервис: стабильное DNS-имя и виртуальный IP перед группой подов, которую выбирает
selectorпо меткам. Трафик идёт только на готовые поды. Типы:ClusterIPпо умолчанию,NodePort,LoadBalancer,ExternalName. HTTP снаружи обычно заходит через Ingress или Gateway API.
Привяжите к Node.js. JavaScript в процессе Node выполняется на одном ядре, поэтому вместо cluster внутри контейнера обычно масштабируют число подов. Кучу V8 при необходимости выравнивают под лимит памяти контейнера флагом --max-old-space-size, иначе под убьют по OOM. На SIGTERM сервис закрывает сервер через server.close() и дожидается текущих запросов, потому что из сервиса под убирается не мгновенно. readinessProbe смотрит на готовность, livenessProbe отдельно и без проверки внешних зависимостей.
Где спотыкаются
Говорят, что сервис это приложение или контейнер. Сервис не запускает код, это правило маршрутизации с DNS-именем.
Путают под с контейнером и не могут объяснить, зачем в одном поде два контейнера. Пример: sidecar с прокси или сборщиком логов.
Не обрабатывают SIGTERM. Процесс с PID 1 без своего обработчика сигнал игнорирует, и под убивается принудительно по истечении terminationGracePeriodSeconds, по умолчанию 30 секунд. Запуск через npm start добавляет лишнюю прослойку, надёжнее node server.js напрямую.