Ответ
Расчет строится от требований рабочих нагрузок (подов) с добавлением ресурсов для системных компонентов и буфера. Вот пошаговый подход:
1. Суммируем запросы (requests) всех подов, которые должны работать на ноде:
- Это минимальные гарантированные ресурсы для каждого пода.
- Используйте
kubectl describe nodeили инструменты мониторинга (Prometheus), чтобы понять текущее использование.
2. Добавляем ресурсы для системных демонов (System Daemons):
- Kubelet & Container Runtime (containerd/docker): Обычно 0.1-0.25 CPU и 300-500Mi памяти.
- Kube-proxy, сетевой плагин (Calico/Cilium), DaemonSets (логгинг, мониторинг): Может потреблять 0.1-0.3 CPU и 100-300Mi памяти каждый.
- Операционная система: Рекомендуется резерв 0.5-1Gi памяти и 0.05-0.1 CPU.
3. Добавляем "буфер безопасности" (Eviction Threshold):
- Kubernetes резервирует память и disk space для обработки ситуации, когда нода исчерпывает ресурсы, чтобы корректно выселить (evict) поды. Обычно это 100Mi-500Mi памяти.
4. Формула для оценки:
Требуемая емкость ноды (Capacity) ≈
[Сумма Requests всех планируемых подов] +
[Ресурсы системных демонов] +
[Буфер безопасности (Eviction Threshold)] +
[Запас для пиковой нагрузки (20-30%)]
5. Практический пример расчета для ноды, где планируется 15 подов:
Предположим, каждый под имеет requests: cpu: 200m, memory: 256Mi.
1. Сумма подов: 15 * (200m cpu, 256Mi mem) = 3000m CPU, 3840Mi Mem.
2. Системные демоны: ~500m CPU, 1200Mi Mem.
3. Буфер eviction: 200Mi Mem.
4. Итого без запаса: 3500m CPU, 5240Mi Mem.
5. Добавляем запас 25%: ~4400m CPU, 6550Mi Mem.
Итоговая рекомендация: выбираем ноду с конфигурацией не менее 4.5 CPU и 7Gi RAM.
Важно: Используйте LimitRange и ResourceQuotas на уровне namespace, чтобы разработчики указывали реалистичные requests и limits в манифестах подов. Без этого любой расчет будет неточным.