Главная

7 мин

Серверы для Kubernetes on-prem: память, NVMe, сеть, ядра

Серверы для Kubernetes on-prem: как выбрать память, NVMe, сеть и запас по ядрам, а также план обновлений, чтобы кластер не уперся в узкие места.

Серверы для Kubernetes on-prem: память, NVMe, сеть, ядра

Какие узкие места чаще всего всплывают после запуска

Проблемы обычно появляются не в день запуска, а через 1-3 месяца. Команда добавляет новые сервисы, включает больше логирования и метрик, растет число пользователей, а фоновые задачи начинают жить своей жизнью. В этот момент выясняется: «в пилоте работало» не значит «в продакшене будет стабильно».

Пилот обычно короткий и аккуратный: меньше данных и интеграций, редкие деплои, нет пиковых периодов (отчетность, закрытие месяца, массовые рассылки). В продакшене микросервисы легко создают непредсказуемые всплески. Один сервис замедлился, очередь выросла, ретраи умножили нагрузку, и дальше цепочка разъезжается по всему кластеру.

Чаще всего очереди и задержки упираются в четыре зоны:

  • CPU: лимиты выставлены «на глаз», планировщик упирается в нехватку ядер, а соседние поды начинают мешать друг другу на пиках.
  • Память: OOM-kill, частые рестарты, выселение подов и потеря кэшей. Проблема часто не в среднем потреблении, а в коротких всплесках.
  • Диски: тормозят операции с контейнерными слоями, логами, базами и очередями. IOPS заканчиваются раньше, чем место.
  • Сеть: узкие места на east-west трафике между сервисами, нехватка пропускной способности для storage и бэкапов, рост задержки из-за перегруженных коммутаторов.

Простой пример: вы подключили трассировку и увеличили retention метрик. Запись на диск резко выросла, а параллельно в часы пик усилился межсервисный трафик. В итоге «проседает» не один компонент, а сразу несколько. Поэтому серверы для Kubernetes on-prem стоит выбирать с запасом по самым чувствительным ресурсам и с пониманием, что нагрузка в кластере почти никогда не бывает ровной.

Опишите нагрузку перед выбором железа

Железо под кластер часто выбирают «на глаз», а потом удивляются: то не хватает памяти, то диски «упираются», то сеть забита служебным трафиком. Чтобы серверы для Kubernetes on-prem не стали проблемой через месяц после запуска, начните с описания нагрузки простыми словами, как для человека, который будет это поддерживать.

Сначала перечислите, что именно вы запускаете и где. Количество микросервисов само по себе мало что говорит: важнее число окружений (prod, stage, dev) и их похожесть. Частая ситуация: staging «почти как prod», но живет на тех же узлах, и во время нагрузочного теста начинает вытеснять рабочие поды.

Дальше отметьте stateful части. Базы данных, очереди, хранилища логов, мониторинг и трассировка обычно создают постоянный I/O и чувствительны к задержкам. Если они будут внутри кластера, требования к дискам и сети резко растут. Если снаружи, вы переносите риски в сеть и внешнее хранилище.

Полезно зафиксировать это как короткое «почти ТЗ»:

  • сколько сервисов и окружений вы поддерживаете сейчас и что планируется через год;
  • что у вас stateful, а что stateless;
  • какой профиль нагрузки преобладает (CPU, память, диски);
  • какие SLO важнее всего (задержка запросов, время деплоя, скорость восстановления);
  • ожидаемый рост на 12-24 месяца (пользователи, трафик, данные).

Пример: 40 сервисов в prod и 40 в stage, внутри кластера Prometheus и Loki, база вынесена наружу. Тогда узкие места чаще всего будут в памяти (метрики и кэши), в I/O для логов и в сети между нодами во время раскатки.

Память на узел: как не попасть в OOM и выселение подов

В Kubernetes память обычно заканчивается раньше CPU. Процессор можно «поджать» лимитами, и планировщик распределит нагрузку. А вот память при реальном перерасходе приводит к OOMKilled или к eviction (выселению) подов. Дальше они переезжают на другие узлы и запускают лавину проблем.

Частая ловушка: считать RAM по сумме requests, хотя фактическое потребление ближе к limits (или вообще безлимитное, если limits не заданы). Плюс есть память, которую кластер забирает себе. Node Allocatable всегда меньше «RAM в сервере». Поэтому один и тот же узел на 256 ГБ может оказаться «полезным» только на 200-220 ГБ, в зависимости от настроек и нагрузки.

Думайте о памяти как о трех слоях: приложения, системные компоненты (kubelet, контейнерный runtime, CNI) и сервисы вокруг (логирование, мониторинг, агенты безопасности). Даже если они по отдельности «маленькие», в сумме это заметно. И растет вместе с кластером.

На двухсокетных серверах появляется нюанс NUMA: память физически привязана к сокету. Если podу нужно много RAM и CPU, но NUMA-политику не учли, можно получить задержки и нестабильную производительность, хотя «по цифрам» памяти вроде хватает.

Практические правила перед закупкой:

  • держите постоянный запас 15-30% RAM под систему и пики;
  • задайте requests и разумные limits для всех важных сервисов;
  • отдельно учитывайте кэши, очереди и JVM/Go heap (они часто растут неожиданно);
  • для крупных stateful компонентов планируйте узлы с большим RAM, а для множества мелких сервисов часто выгоднее больше узлов поменьше.

Если платформа ожидает рост, проще жить, когда на каждом узле есть запас по памяти. Тогда добавление новых микросервисов не превращается в ежедневную игру в переселение подов.

CPU и запас по ядрам: планировщик любит предсказуемость

CPU в Kubernetes - это не только «сколько ядер». Важно, насколько предсказуемо они доступны подам. При выборе серверов для Kubernetes on-prem закладывайте запас не «на сейчас», а на пики, фоновые задачи и рост.

Самая частая ошибка - агрессивный oversubscription, когда лимиты CPU сильно выше реальных ресурсов узла. На графиках средняя загрузка может выглядеть красиво, но в момент пика начинается борьба за процессорное время. Итог - рост задержек, скачки latency у API, таймауты и цепная реакция повторов запросов, которая добивает кластер.

Когда важнее частота, а когда количество ядер? Для сервисов с короткими запросами и строгими SLO (gateway, авторизация, онлайн-платежи) часто выигрывает более высокая частота и стабильная производительность на ядро. Для параллельных задач (очереди, фоновые воркеры, batch, CI) важнее больше ядер и понятная политика лимитов.

Хорошая практика - выделить отдельные узлы под инфраструктуру кластера. Тогда CPU не «съедают» те, кого вы не видите в бизнес-метриках: DNS, ingress-контроллеры, логирование, мониторинг, service mesh, контроллеры хранения.

Что стоит проверить заранее: какой запас по CPU нужен, какой oversubscription допустим без лотереи с задержками, как влияет SMT/Hyper-Threading на ваш профиль нагрузки, и нужен ли пул инфраструктурных узлов хотя бы минимального размера.

Простой ориентир: если после запуска сервисы «вроде живы», но хвосты по задержкам растут в часы нагрузки, чаще всего это не «баги», а нехватка предсказуемого CPU и слишком смелые лимиты.

NVMe и диски: где реально нужна высокая скорость

Для микросервисов важны не только «цифры IOPS», но и задержка. IOPS показывает, сколько операций в секунду выдержит диск, а задержка - как быстро каждая операция завершается. Для Kubernetes обычно критичнее низкая задержка: много мелких запросов (метаданные, журналы, небольшие записи) чувствительны к «подвисаниям», даже если средние IOPS выглядят неплохо.

NVMe имеет смысл там, где узкое место - случайный доступ и быстрое подтверждение записи. Чаще всего это etcd (если control plane не вынесен и вы уверены в схеме отказоустойчивости), горячие части баз данных и очередей, поисковые индексы, буферы логов и метрик, а также кэши CI (артефакты, слои контейнеров, зависимости).

Компромисс между локальным NVMe и внешним хранилищем простой. Локальный NVMe быстрее по задержке и обычно дешевле «в ощущениях», но сложнее с сохранностью данных на уровне узла: диск умер - данные на узле пропали. Внешнее хранилище проще защищать и масштабировать, но оно добавляет сеть и задержку и может стать новым узким местом.

RAID тоже не «бесплатный». Контроллер и его кэш могут ограничить скорость, особенно на NVMe, где сам диск быстрее контроллера. Поэтому схемы для локальных NVMe лучше выбирать осознанно и проверять под реальной нагрузкой.

Не забывайте про ресурс дисков (TBW) и план замены без простоя: мониторинг износа, запасные диски и понятный сценарий пересоздания подов и переноса данных.

Сеть: пропускная способность, задержка и резервирование

В Kubernetes сеть редко бывает «просто сетью». После запуска быстро растет east-west трафик: сервисы общаются друг с другом, sidecar-прокси в сервис-меше добавляют обмен, а наблюдаемость (логи, метрики, трассировки) постоянно отправляет данные. Внешняя нагрузка может выглядеть умеренной, а внутренняя сеть уже на пределе.

Выбор 10/25/100GbE лучше привязывать не к «сколько сейчас», а к тому, как кластер будет жить через год. 10GbE часто хватает для небольших кластеров без тяжелого сервис-меша и с умеренной репликацией данных. 25GbE обычно дает хороший баланс для микросервисных платформ. 100GbE имеет смысл, когда много узлов, интенсивные CI/CD, большие объемы данных, распределенные хранилища или сеть уже становится главным ограничением.

Важно сразу посчитать порты. Частая ошибка: взять «быструю» сетевую карту, но с одним портом и без разделения потоков. Практичный минимум для узла - два порта для отказоустойчивости, плюс отдельные сегменты (через VLAN или физически), если вы разводите storage/репликацию и управление.

MTU и jumbo frames помогают только когда сеть и оборудование настроены одинаково на всем пути. Если хотя бы один сегмент не поддерживает выбранный MTU, получите «плавающие» проблемы, которые сложно ловить. Меняйте MTU осознанно и проверяйте end-to-end.

Для отказоустойчивости на узлах обычно используют bonding с LACP, а на уровне коммутаторов - разнесение по двум устройствам. Это особенно важно в on-prem, где один сетевой элемент легко превращается в узкое горлышко.

Надежность кластера: контрольная плоскость и запас емкости

Надежность Kubernetes чаще ломается не из-за «падения всего», а из-за мелких отказов: одна нода ушла в ребут, один диск стал медленным, один блок питания умер. Если кластер собран без запаса, любой такой сбой превращается в цепочку проблем: поды переселяются, нагрузка растет, начинается деградация.

Минимальный практичный базис для продакшена - три узла control-plane и отдельные worker-узлы. Три control-plane дают кворум и переживают отказ одного узла без остановки управления. Если смешивать control-plane и рабочие нагрузки на тех же серверах, «случайный» пик по CPU или диску от приложения может ударить по самому управлению кластером.

Где хранить etcd и почему важна задержка

etcd чувствителен не к объему диска, а к задержке и стабильности I/O. Даже при умеренной нагрузке медленные или «плавающие» диски дают задержки на записи, а это отражается на всей контрольной плоскости. Обычно лучший вариант - локальные быстрые диски с низкой задержкой на узлах control-plane. Важно не гнаться за скоростью на бумаге, а добиваться предсказуемости.

Запас емкости: что останется после отказа

Планируйте кластер так, будто одна нода уже потеряна. Для критичных платформ часто закладывают сценарий «минус 1-2 узла» (перезагрузка, обновление, авария).

Проверьте несколько вещей: хватит ли CPU и памяти, если один worker недоступен; останется ли место под переселение подов без OOM и сильного throttling; выдержат ли хранилище и сеть всплеск трафика при миграции; сможете ли обновлять ноды по очереди без простоя.

Есть и «железные» риски, которые легко пропустить. Плохое охлаждение вызывает троттлинг CPU: формально ядра есть, но они не дают ожидаемую производительность. Питание тоже важно: резервирование блоков питания в серверах и коммутаторах плюс раздельные линии питания заметно снижают вероятность внезапного простоя.

Пример: в микросервисной платформе для банка вы обновляете worker-узлы ночью по одному. Если запас рассчитан «впритык», то уже на втором узле начнутся очереди, рост задержек и падение SLO. С запасом кластер переживет обновление так же спокойно, как и реальный отказ.

План обновлений и роста: чтобы железо не устарело раньше времени

On-prem Kubernetes редко живет «как поставили». Через 6-12 месяцев появляются новые версии кластера, меняются требования безопасности, растет число сервисов. И внезапно выясняется, что уперлись не в CPU, а в сеть, порты или адреса.

Зафиксируйте календарь обновлений Kubernetes и совместимость зависимостей. Обновляется не только Kubernetes, но и container runtime, CNI (сеть), CSI (хранилище), драйверы, прошивки и ОС. Если один компонент «отстает», обновление кластера превращается в риск.

Практика, которая обычно работает: rolling update узлов через cordon/drain и короткие окна изменений. Узел выводят из планирования, переселяют поды, обновляют ОС и компоненты, возвращают в пул. Так проблемы проявляются по одному узлу, а не разом.

Чтобы заранее понять, не упрется ли новый релиз в ресурсы, держите простой порядок проверки: прогон в тестовом кластере или на отдельном пуле, сравнение фактических пиков CPU и RAM с requests/limits, проверка диска (IOPS и p99 задержка) и сетевого запаса (east-west трафик, p95 задержки, ошибки), плюс оценка того, выдержат ли мониторинг и логи рост ретеншна.

План расширения лучше записать в виде правил. Например: добавляем узлы при 60-70% устойчивой загрузки пула, а замену поколения планируем раз в 3-5 лет с «перекрытием», чтобы старые и новые серверы некоторое время работали вместе.

Не забывайте про физику и адресацию: место в стойках, питание, свободные порты на коммутаторах, запас по 25/100GbE, IP и адресные пространства Pod/Service. На практике именно они чаще тормозят рост быстрее, чем выбор между NVMe и SATA.

Как подобрать конфигурацию: простой пошаговый подход

Начните не с модели сервера, а с карты ваших сервисов. Для кластеров важно, чтобы железо подходило под профиль нагрузки: где-то упираются в память и выселение подов, где-то в диск, а иногда в сеть между нодами и хранилищем.

Соберите исходные данные по каждому окружению (dev, stage, prod) и по ключевым сервисам: сколько реплик, есть ли очереди и кэш, какое логирование и мониторинг. Прикиньте requests и limits, но опирайтесь на измерения, а не на ожидания.

Дальше помогает короткий чеклист:

  • сведите общий бюджет ресурсов (CPU, RAM, диск по задержке и IOPS, сеть внутри кластера и к хранилищу) по окружениям;
  • разделите ноды на 2-3 типа (универсальные, CPU-ориентированные, RAM-ориентированные), а storage-ноды выделяйте только если действительно нужны NVMe и высокие IOPS;
  • продумайте сеть и резервирование (два порта на ноду, два коммутатора, понятная схема отказа, сегментация для storage при необходимости);
  • заложите запас и правило N-1: кластер должен продолжать работать при потере одного узла;
  • определите план расширения: как быстро вы сможете добавить ноды и как будете переходить на более быструю сеть, если трафик вырастет.

Так вы избегаете ситуации, когда серверы для Kubernetes on-prem куплены «впритык», а через 2-3 месяца вы упираетесь в OOM, очереди на диске или перегруз сети.

Что протестировать до закупки

Перед финальным заказом прогоните короткий тест-план на пилотных узлах: раскатайте типовые сервисы, включите HPA, дайте нагрузку на базу и логирование, проверьте время переселения подов при отключении ноды и поведение при деградации диска. Важно смотреть на метрики вашего стека, а не на «средние по рынку».

Пример сценария: on-prem платформа микросервисов для компании

Представим компанию, у которой 50-80 микросервисов, ежедневные релизы через CI/CD, плюс обязательные мониторинг, логирование и трассировка. Все это живет on-prem, потому что важны контроль данных и предсказуемая стоимость.

Такой кластер удобно разделить на пулы по роли: инфраструктура (ingress, DNS, метрики, логирование, CI runners), stateless (основная масса сервисов и воркеры) и stateful (базы, очереди, кэш, хранилища).

Где реально нужен NVMe: на stateful-узлах и на узлах под тяжелое логирование, индексацию и хранение метрик. Там важны не только мегабайты в секунду, но и низкая задержка при большом количестве мелких операций. Для stateless-пула часто хватает качественных SSD: сервисы в основном упираются в CPU и память, а диск нужен для образов и временных файлов.

Если межсервисный трафик активный (много запросов между микросервисами, сервис-меш, частые деплои), сеть быстро становится ограничением. На практике минимумом часто оказывается 25GbE на узел, а для плотных кластеров имеет смысл закладывать более быстрые аплинки и резервирование по двум сетевым путям.

Запас емкости считайте так, чтобы пережить выход одного узла без паники: держите N+1 по мощности в каждом пуле и не забивайте узлы «впритык». Например, если на stateless-пуле нужно 120 vCPU по запросам, планируйте так, чтобы при потере одного сервера оставалось хотя бы 120 vCPU, а не 90.

Частые ошибки при выборе серверов под Kubernetes

Главная проблема с железом под Kubernetes в том, что ошибки проявляются не на этапе закупки, а через пару месяцев, когда добавляются новые сервисы и растет трафик. И тогда «падает» не один компонент, а предсказуемость кластера: планировщик начинает переселять поды, растут задержки, а обновления превращаются в ночной марафон.

Одна из частых ловушек - купить много CPU и сэкономить на памяти. В итоге requests выставлены «на глаз», контейнеры ловят OOM, а узлы перегреваются по RAM задолго до загрузки по ядрам. Для серверов под Kubernetes on-prem почти всегда важнее сбалансировать CPU и память, чем гнаться за частотой.

Еще несколько ошибок, которые встречаются регулярно: ставят NVMe «везде», хотя быстрый диск нужен точечно; оставляют 10GbE и удивляются росту east-west трафика; смешивают control-plane и тяжелые ворклоады на одних узлах; не закладывают запас под drain и ремонт, из-за чего обновления требуют простоя; игнорируют питание, охлаждение и лимиты стойки, и реальная конфигурация «не помещается» в дата-центр.

Простой пример: компания запускает on-prem платформу с CI, мониторингом и несколькими API. Через 3 месяца добавляет аналитический сервис и больше логов. Если сеть осталась 10GbE и нет запаса по памяти, начнутся таймауты и выселение подов, хотя «по CPU все еще свободно».

Короткий чеклист и следующие шаги

Перед закупкой железа полезно на одной странице зафиксировать, что для кластера важнее всего: запас по CPU под пики и обновления, запас по RAM под рабочие наборы данных и всплески, понятная схема дисков (где нужны NVMe, а где достаточно SSD), сеть с резервированием и план роста с учетом N-1.

Чтобы серверы не «разошлись» с реальной нагрузкой, заранее уточните у команды разработки: какие сервисы stateful, какие критичны к задержке, какой ожидается RPS и рост, какой размер образов и частота деплоев, какие SLO по времени ответа.

Дальше проверьте гипотезы на пилотном узле или небольшом стенде. Достаточно нескольких тестов: где начинается троттлинг CPU и OOM, как выглядит p99 задержка диска под профиль БД или очереди, что происходит с сетью east-west (задержка, потери, поведение при отказе одного линка), и сколько времени занимает drain узла и восстановление.

План обновлений на год вперед лучше оформить как календарь: квартальные обновления Kubernetes и базовых аддонов, окна для прошивок/BIOS и точка пересмотра емкости (например, раз в полгода).

Если вы хотите упростить этап подбора и дальнейшего сопровождения, имеет смысл обсуждать конфигурации и план расширения с интегратором, который закрывает и поставку, и поддержку. Например, GSE.kz (gse.kz) в Казахстане производит серверы S200 и предоставляет 24/7 техническую поддержку, что удобно, когда важны быстрые замены компонентов и единый контур ответственности.

Частые вопросы

Какие узкие места обычно проявляются через пару месяцев после запуска Kubernetes-кластера?

Чаще всего всплывают четыре места: CPU, память, диски и сеть. В продакшене добавляются метрики и логи, растет east-west трафик между сервисами, включаются ретраи и фоновые джобы — и «ровная» нагрузка превращается в пики, которые быстро съедают запас.

С чего начать подбор серверов под Kubernetes on-prem, чтобы не ошибиться «на глаз»?

Опишите нагрузку простыми категориями: сколько окружений (prod/stage/dev), какие компоненты stateful, какие SLO важнее (задержки, время деплоя, восстановление), и какой рост ожидается на 12–24 месяца. Это дает понятную картину, где нужен запас: по памяти, по I/O диска или по сети.

Почему в Kubernetes чаще упираются в RAM, а не в CPU?

Память в кластере заканчивается не по среднему, а по коротким всплескам. Если limits не заданы или слишком высокие, контейнеры могут резко вырасти и уйти в OOMKilled, а при давлении на узел начнутся eviction и переселение подов, что усугубляет ситуацию по всему пулу.

Как правильно прикинуть «полезную» память на узле, а не просто объем RAM в сервере?

Считайте не только requests ваших приложений, а реальное потребление, близкое к limits, плюс системную часть узла. Node Allocatable всегда меньше физической RAM, потому что память нужна kubelet, runtime, CNI, логированию, мониторингу и агентам безопасности; без запаса узел быстро становится нестабильным на пиках.

Какой запас по памяти закладывать, чтобы избежать OOM и выселения подов?

Держите постоянный запас по памяти на узле, чтобы переживать пики и переселение подов при ремонте или обновлениях. Практичный ориентир — не заполнять RAM «впритык» и заранее навести порядок с requests и limits у критичных сервисов, иначе любое расширение платформы превратится в регулярные перезапуски и eviction.

Что не так с сильным oversubscription по CPU в Kubernetes?

Агрессивный oversubscription выглядит красиво по средней загрузке, но на пиках вызывает конкуренцию за процессорное время и рост задержек. В результате таймауты запускают ретраи, нагрузка умножается, и проблема быстро выходит за рамки одного сервиса.

Когда важнее частота CPU, а когда — больше ядер для кластера?

Если важны короткие запросы и строгие задержки, обычно выигрывает высокая частота и стабильная производительность на ядро. Для параллельных воркеров, очередей, batch и CI важнее количество ядер и предсказуемые лимиты, чтобы не устраивать «лотерею» в часы нагрузки.

Где в Kubernetes действительно оправдан NVMe, а где хватит обычных SSD?

NVMe нужен там, где критична низкая задержка при большом числе мелких операций: для горячих данных баз и очередей, индексов, буферов логов и метрик, кэшей CI и быстрых временных хранилищ. Для большинства stateless-сервисов часто достаточно хороших SSD, потому что они больше зависят от CPU и RAM, чем от диска.

Почему сеть в микросервисном кластере часто становится бутылочным горлышком?

В кластере быстро растет внутренний трафик между сервисами, а наблюдаемость постоянно отправляет логи, метрики и трассировки. Выбирайте скорость с запасом на год вперед и сразу планируйте отказоустойчивость: два порта на узел и понятная схема резервирования, иначе сеть станет скрытым ограничением даже при умеренной внешней нагрузке.

Как спроектировать надежность кластера, чтобы обновления и отказ одной ноды не ломали продакшен?

Минимальная база для продакшена — три узла control-plane для кворума и отдельные worker-узлы, чтобы пики приложений не били по управлению кластером. Емкость стоит считать по правилу N-1: кластер должен пережить недоступность одного узла и при этом сохранять нормальные задержки и возможность обновляться через drain без простоя.

Запрос

Пришлите спецификацию. Остальное сделаем мы

Одна позиция или объект под ключ, любое направление. Вашу поставку от первого звонка до акта ввода ведёт один менеджер.

Расчёт бесплатноДокументы для госзакупок и тендеровОдин договор и одна гарантия