Что такое Node в Kubernetes?
на какой Node посадить каждый Pod. В Kubernetes Node — это "рабочая лошадка", которая выполняет команды от управляющего центра (Control Plane).
Junior уровень
Простое объяснение
Node (Узел) — это рабочий сервер, на который K8s «сажает» Pod’ы. Scheduler решает, на какой Node посадить каждый Pod. В Kubernetes Node — это “рабочая лошадка”, которая выполняет команды от управляющего центра (Control Plane).
Простая аналогия
Если Kubernetes — это строительная компания, то:
- Control Plane — офис менеджеров (принимает решения)
- Node — строительная площадка (где реально идёт работа)
- Pod — бригада рабочих на площадке
Что есть на каждом Node?
- kubelet — агент, который следит за контейнерами и отчитывается перед Control Plane
- kube-proxy — отвечает за сетевые правила
- 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’ы:
- BestEffort (нет requests/limits) — удаляются первыми
- Burstable (requests < limits) — удаляются вторыми
- 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