Вопрос 10 · Раздел 14

Что такое Node в Kubernetes?

на какой Node посадить каждый Pod. В Kubernetes Node — это "рабочая лошадка", которая выполняет команды от управляющего центра (Control Plane).

Версии по языкам: English Russian Ukrainian

Junior уровень

Простое объяснение

Node (Узел) — это рабочий сервер, на который K8s «сажает» Pod’ы. Scheduler решает, на какой Node посадить каждый Pod. В Kubernetes Node — это “рабочая лошадка”, которая выполняет команды от управляющего центра (Control Plane).

Простая аналогия

Если Kubernetes — это строительная компания, то:

  • Control Plane — офис менеджеров (принимает решения)
  • Node — строительная площадка (где реально идёт работа)
  • Pod — бригада рабочих на площадке

Что есть на каждом Node?

  1. kubelet — агент, который следит за контейнерами и отчитывается перед Control Plane
  2. kube-proxy — отвечает за сетевые правила
  3. Container Runtime — программа для запуска контейнеров (обычно containerd)

Типы Node

  • Worker Node — запускает приложения (Pod’ы)
  • Control Plane Node — управляет кластером (обычно не запускает приложения)

Что делает Node?

  • Получает команды от Control Plane
  • Запускает Pod’ы
  • Следит за их здоровьем
  • Отправляет информацию о ресурсах (CPU, RAM)

Что запомнить Junior-разработчику

  • Node — это сервер, на котором работают контейнеры
  • На каждом Node: kubelet, kube-proxy, container runtime
  • Worker Nodes запускают приложения
  • Control Plane Nodes управляют кластером
  • Если Node падает, K8s ждёт ~5 минут (pod-eviction-timeout), чтобы убедиться, что Node действительно мёртв, а не временно потерял сеть. Только потом переносит Pod’ы.

Middle уровень

Внутренние компоненты Node

kubelet

kubelet – агент на каждом Node, который «докладывает» Control Plane о состоянии контейнеров.

Самый важный агент на Node:

  • Следит за Pod’ами, назначенными этому Node
  • Общается с API-сервером
  • Запускает и останавливает контейнеры
  • Выполняет health checks
  • Отправляет статус Node (Ready, NotReady)

kube-proxy

Сетевой прокси:

  • Поддерживает правила маршрутизации (iptables/IPVS)
  • Обеспечивает работу Services (балансировка трафика)
  • Перенаправляет трафик к нужным Pod’ам

Container Runtime

Среда запуска контейнеров:

  • Современный стандарт: containerd или CRI-O
  • Docker-shim удалён в K8s v1.24+. Вместо Docker используются containerd или CRI-O.

Ресурсы Node

Capacity:          8 CPU, 32 GiB RAM    (физические ресурсы)
kube-reserved:     1 CPU, 2 GiB RAM     (резерв для K8s)
system-reserved:   0.5 CPU, 1 GiB RAM   (резерв для ОС)
─────────────────────────────────────────
Allocatable:       6.5 CPU, 29 GiB RAM  (доступно для Pod'ов)

Pod’ы могут использовать только Allocatable ресурсы.

Состояния Node (Conditions)

Condition Что означает
Ready Node здоров и может принимать Pod’ы
MemoryPressure Мало свободной RAM
DiskPressure Мало места на диске
PIDPressure Слишком много процессов
NetworkUnavailable Проблема с сетью

Eviction (Вытеснение Pod’ов)

Когда ресурсы Node заканчиваются, kubelet начинает удалять Pod’ы:

  1. BestEffort (нет requests/limits) — удаляются первыми
  2. Burstable (requests < limits) — удаляются вторыми
  3. Guaranteed (requests == limits) — удаляются последними

Диагностика

# Информация о Node
kubectl describe node <name>

# Потребление ресурсов
kubectl top node

# Логи kubelet
journalctl -u kubelet

Что запомнить Middle-разработчику

  • kubelet — ключевой процесс, его падение парализует Node
  • Всегда задавайте Resources Requests & Limits
  • Allocatable < Capacity (часть резервируется для ОС и K8s)
  • Eviction защищает Node от перегрузки
  • kubectl describe node — основная команда диагностики

Когда НЕ управлять Node вручную

НЕ управляйте Node вручную в продакшене – используйте managed node groups (EKS, GKE) или IaC (Terraform).


Senior уровень

Node как абстракция инфраструктуры

Node — это мост между физической инфраструктурой и абстрактным миром Kubernetes. Понимание его работы критично для capacity planning, troubleshooting и оптимизации.

Node Pressure и Eviction: глубокий анализ

Thresholds

Kubelet использует пороги для перехода в режим давления:

memory.available < 100Mi       → MemoryPressure
nodefs.available < 15%         → DiskPressure
nodefs.inodesFree < 10%        → DiskPressure (Inodes)
pid.available < 5%             → PIDPressure

Eviction алгоритм

1. Kubelet обнаруживает pressure condition
2. Помечает Node с соответствующим Condition
3. Начинает eviction process:
   a. Находит Pod'ы для удаления (по QoS классу)
   b. Graceful termination (SIGTERM → wait → SIGKILL)
   c. Освобождает ресурсы
4. Если pressure сохраняется — повторяет

Graceful vs Forceful Eviction

  • Graceful: kubelet отправляет SIGTERM, ждёт terminationGracePeriodSeconds
  • Forceful: Если Node NotReady > pod-eviction-timeout (5 мин по умолчанию), Control Forcefully удаляет Pod’ы

Node Allocatable: детальный анализ

# kubelet конфигурация
kubeReserved:
  cpu: "500m"
  memory: "1Gi"
  ephemeral-storage: "1Gi"
systemReserved:
  cpu: "200m"
  memory: "500Mi"
evictionHard:
  memory.available: "200Mi"
  nodefs.available: "10%"

Важно: kubeReserved и systemReserved не обеспечивают реальное резервирование — это только информационные значения для schedulera. Для жёсткого ограничения нужны cgroups.

Highload considerations

Density (Плотность Pod’ов)

  • По умолчанию K8s ограничивает ~110 Pod’ов на Node
  • Ограничения:
    • Количество IP в VPC (AWS)
    • Нагрузка на kube-proxy (iptables rules)
    • Нагрузка на etcd (больше Pod’ов = больше объектов)
    • CPU overhead от kubelet

HugePages

Для тяжёлых приложений (БД, in-memory caches):

resources:
  limits:
    hugepages-2Mi: 1Gi
    memory: 4Gi

Требует настройки на уровне ОС:

sysctl -w vm.nr_hugepages=512

Edge Cases

NotReady Node

Timeline:
T+0s:    Node перестаёт слать heartbeats
T+40s:   Node condition = NotReady
T+5m:    Pod eviction начинается
T+5m+:   Pod'ы пересоздаются на других Node

Tuning:

# kube-controller-manager flags
--node-monitor-period=5s
--node-monitor-grace-period=40s
--pod-eviction-timeout=5m

Kernel Panic

Если ядро падает — kubelet не может сообщить об этом. Control Plane ждёт heartbeat timeout. Это самый сложный случай для автоматизации.

Node Affinity и Taints

Taints (Отталкивание)

# Пометить Node
kubectl taint nodes node1 gpu=true:NoSchedule

# Только Pod с toleration запустится
tolerations:
- key: "gpu"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

Node Affinity (Притяжение)

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values: [ssd]

Node Problem Detector

DaemonSet для мониторинга здоровья Node:

  • Мониторит ядро, диски, сеть
  • Сообщает о проблемах в API
  • Интегрируется с Prometheus

Autoscaling Node

Cluster Autoscaler:

  • Добавляет Node при Pending Pod’ах
  • Удаляет недогруженные Node
  • Интегрируется с cloud provider

Karpenter (AWS):

  • Более быстрый и гибкий
  • Выбирает оптимальный тип инстанса
  • Поддержка Spot instances

Резюме для Senior

  • Node — абстракция над “железом”. kubelet — ключевой процесс.
  • Always configure Resources Requests & Limits для корректного eviction.
  • Различайте Capacity (физический ресурс) и Allocatable (доступный для Pod’ов).
  • Eviction алгоритм приоритизирует по QoS классам.
  • На highload: density limits, HugePages, node affinity.
  • NotReady timeout (5 min) — tunable параметр для критичных систем.
  • Taints/Tolerations + Node Affinity — инструменты для специализированных Node.

🎯 Шпаргалка для интервью

Обязательно знать:

  • Node — рабочий сервер K8s; Worker Node запускает Pod’ы, Control Plane управляет кластером
  • Компоненты Node: kubelet (агент), kube-proxy (сеть), container runtime (containerd)
  • Allocatable < Capacity — часть ресурсов резервируется для ОС и K8s
  • Eviction удаляет Pod’ы по QoS классу: BestEffort → Burstable → Guaranteed
  • NotReady Node: K8s ждёт ~5 минут (pod-eviction-timeout) перед переносом Pod’ов
  • Taints (отталкивание) + Tolerations (допуск) + Node Affinity (притяжение) — scheduling
  • Cluster Autoscaler / Karpenter — автоматическое добавление/удаление Node

Частые уточняющие вопросы:

  • «Что будет если kubelet упадёт?» — Pod’ы на Node перестают управляться; Node → NotReady
  • «Что такое Allocatable?» — Resources доступные для Pod’ов (Capacity минус резерв ОС и K8s)
  • «Когда Pod eviction срабатывает?» — При MemoryPressure, DiskPressure, PIDPressure на Node
  • «Чем Cluster Autoscaler отличается от Karpenter?» — Karpenter быстрее, умнее выбирает инстансы

Красные флаги (НЕ говорить):

  • «Node = Pod» (Node — сервер, Pod — единица запуска на нём)
  • «kubelet на Control Plane» (kubelet только на Worker Nodes)
  • «Capacity = ресурсы для Pod’ов» (Allocatable, не Capacity)
  • «Docker-shim всё ещё используется» (удалён в K8s v1.24; containerd/CRI-O)

Связанные темы:

  • [[Что такое Pod в Kubernetes]] — что запускается на Node
  • [[Что такое Kubernetes и зачем он нужен]] — общая архитектура
  • [[Как происходит масштабирование в Kubernetes]] — Cluster Autoscaler