22 нояб. 2025 г.·7 мин

Минимальная архитектура Kubernetes on-prem без подписок

Разбираем минимальная архитектура Kubernetes on-prem: CNI, Ingress, registry, мониторинг, а также требования к серверам и сети для стабильной работы.

Минимальная архитектура Kubernetes on-prem без подписок

Задача: поднять Kubernetes on-prem без платных подписок

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

Платные подписки чаще всего дают не «магию», а набор готовых ответов на типовые вопросы. Обычно это проверенная сеть (CNI), балансировка для сервисов, Ingress и TLS, приватный registry, мониторинг и алерты, политики безопасности, обновления и поддержка. Почти все это можно закрыть бесплатными компонентами, если заранее принять, что интеграция и эксплуатационные правила - ваша зона ответственности.

Для первого релиза важно не распыляться. Достаточно базового набора, который делает кластер пригодным для ежедневной работы: CNI, Ingress и внешний IP, приватный registry, мониторинг с метриками и алертами.

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

Минимальный стек: что должно быть в кластере

Минимальная архитектура Kubernetes on-prem - это не «поставить Kubernetes», а собрать небольшой набор обязательных деталей, без которых кластер быстро становится хрупким.

База всегда состоит из control plane и worker-узлов. Для устойчивости control plane лучше планировать не «один сервер на все», а хотя бы 3 узла control plane (или 1 на старте, но с понятным планом расширения). Worker-узлы на старте обычно делают 2-3, чтобы переживать отказ одного.

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

  • CNI - сеть подов и сетевые политики.
  • Ingress - публикация сервисов и управление TLS.
  • Registry - хранение образов и контроль версий.
  • Мониторинг - понимание, что происходит с узлами, подами и control plane.

То, что часто пытаются добавить сразу, но обычно можно отложить до появления реальной потребности: service mesh, GitOps-платформа, распределенная СХД, сложный IAM и тонкая многоарендность. На старте они чаще добавляют новые точки отказа, чем пользу.

Где on-prem чаще всего теряет устойчивость: сеть (MTU, маршрутизация, «флапающие» порты), DNS (внутренние резолвы и кэш), storage (непонятные классы томов и нехватка IOPS), обновления (когда нет тестового контура и процедуры отката). Минимальный стек стоит выбирать так, чтобы каждую часть можно было обновлять и диагностировать отдельно.

Хороший ориентир: если компонент нельзя быстро объяснить дежурному инженеру и нельзя одной командой проверить, что он жив, значит сейчас он лишний.

Требования к серверам: базовые ориентиры для кластера

Главный риск on-prem - не «мало железа», а то, что один сбой выключает половину платформы. Поэтому минимальный вариант для устойчивости - 3 узла control plane (etcd и компоненты управления) и 2-3 worker-узла под приложения. Один control plane допустим только для стенда.

По CPU и RAM проще всего считать от реальности: сколько сервисов запускается одновременно и где пик нагрузки (например, отчеты в конце месяца). Как стартовая точка для небольшого продакшена:

  • Control plane: 4-8 vCPU и 16-32 ГБ RAM на узел.
  • Worker: 8-16 vCPU и 32-64 ГБ RAM на узел.
  • Запас: держите 20-30% свободных ресурсов, чтобы кластер переживал перезапуски и плановые работы.

Диск часто становится узким местом, особенно когда появляются метрики и логи. Желательно разделять хотя бы логически (а лучше физически) роли дисков: ОС отдельно, контейнерные данные (containerd/Docker) отдельно, и отдельный быстрый том под данные мониторинга. Если используете локальное хранилище для stateful-нагрузок, требования к дискам резко растут: NVMe и понятная стратегия бэкапов становятся обязательными.

RAID важен, потому что «в облаке заменили диск» тут нет. Для системных дисков обычно хватает RAID1, для данных и метрик - RAID10 (или аналог по надежности и скорости). Отдельно проверьте, как вы переживете выход из строя диска на узле с важными данными.

Перед установкой проверьте питание и охлаждение: два блока питания в серверах, UPS хотя бы на корректное завершение работы, нормальная вентиляция стойки. Для организаций в Казахстане иногда критично, чтобы оборудование и поддержка были доступны локально, без долгих пауз в поставках и ремонте.

Требования к сети: DNS, NTP, MTU и план IP

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

Для балансировки и публикации сервисов заранее решите, какой у вас уровень сети. MetalLB в L2-режиме проще всего, но обычно требует, чтобы ноды и клиенты были в одном L2-сегменте (один VLAN, без маршрутизации между ними). Если сеть L3 и сегментирована, чаще выбирают BGP-режим MetalLB, где маршруты до VIP объявляются через роутеры. Это сложнее на старте, зато лучше ложится на корпоративные сети.

MTU стоит проверить до установки CNI. Если где-то по пути MTU 1500, а CNI добавляет оверхед (например, VXLAN), пакеты начинают фрагментироваться или тихо теряться. Симптомы типичные: часть сервисов «иногда» не открывается, readiness-проверки падают, а дебаг ничего не показывает. Практичное правило: один MTU для всех линков и заранее выбранный подход - оверлей или без него.

DNS и NTP - два сервиса, без которых кластер ведет себя странно. DNS нужен не только подам, но и компонентам кластера (CoreDNS ходит в upstream). NTP важен для TLS: сертификаты, токены и аудит зависят от времени.

Перед запуском зафиксируйте:

  • Pod CIDR и Service CIDR, чтобы не пересекались с корпоративными диапазонами и VPN.
  • Диапазон адресов LoadBalancer (если используете MetalLB).
  • Кто и откуда имеет доступ к Kubernetes API (6443) и к Ingress (обычно 80/443).
  • Сегментацию: админские сети отдельно, приложения отдельно, доступы только по нужным портам.

Хороший быстрый тест: разверните пробный namespace и проверьте, что из офисной сети открывается Ingress, а к API доступ есть только с админских хостов. Ошибки маршрутизации и правил доступа проявляются сразу.

CNI: как выбрать и настроить без лишней сложности

CNI отвечает за то, как поды видят друг друга по сети: маршрутизацию, раздачу IP, работу Service, а также сетевые политики (NetworkPolicy). В on-prem именно CNI часто становится источником «странных» обрывов и долгих расследований, поэтому лучше выбирать простое и предсказуемое решение.

Если вам нужна только связность подов и сервисов без сегментации, часто хватает Flannel. Он легкий и понятный, но почти не помогает с NetworkPolicy. Если нужен контроль доступа между неймспейсами и сервисами, чаще выбирают Calico: он зрелый, хорошо закрывает сетевые политики и обычно без сюрпризов на стандартных ядрах Linux. Cilium стоит рассматривать, если важны расширенная наблюдаемость и более гибкие политики, но он требовательнее к ядру и аккуратности при обновлениях.

Что включить из NetworkPolicy в первом релизе

Не пытайтесь сразу «закрыть все». Начните с минимального набора правил и проверяйте, что сервисы не ломаются:

  • Запрет трафика по умолчанию в «прод» namespace и явные разрешения на нужные порты.
  • Разрешение DNS (обычно kube-dns/CoreDNS) для всех подов.
  • Разрешение входа только от Ingress-контроллера к веб-сервисам.
  • Разрешение доступа к базам данных только от конкретных приложений.

Совместимость и быстрые тесты

Перед установкой проверьте требования CNI к ядру и режимам (нужны ли модули, eBPF, iptables/nftables). Лучше зафиксировать это в стандарте образа ОС для всех узлов.

До запуска «боевых» сервисов прогоните простые проверки: pod-под (внутри и между нодами), доступ к DNS, работа Service/NodePort, применение NetworkPolicy. Практичный сценарий: развернуть два тестовых приложения (frontend и backend) и убедиться, что политика действительно блокирует лишнее.

Ingress на on-prem: публикация сервисов и TLS

Диски и RAID под нагрузку
Подскажем, как разнести диски и RAID под ОС, контейнеры, registry и мониторинг.
Получить расчет

Ingress нужен почти всем, даже в закрытой сети. Он дает единый вход в кластер по HTTP(S): один адрес и набор правил вместо десятков NodePort, а также понятный контроль маршрутизации. Это удобно для внутренних порталов, API, мониторинга и любых сервисов, где важны домены и TLS.

Для старта чаще всего выбирают Ingress Controller на базе NGINX. Он закрывает 80-90% задач без экзотики: хосты, пути, редиректы, лимиты, простая аутентификация. Альтернативы (Traefik, HAProxy Ingress) тоже рабочие, но NGINX обычно проще для команды, которая не хочет тратить неделю на тонкую настройку.

TLS лучше сразу делать «как в проде», иначе потом будет больно мигрировать.

TLS: хранение и обновление сертификатов

Сертификаты обычно лежат в Kubernetes Secrets, а приложения получают их через Ingress. Чтобы не обновлять руками каждую неделю, заведите единый процесс: определите источник сертификатов (внутренний УЦ или публичный), настройте автоматическое обновление (например, через cert-manager), храните приватные ключи только в нужных namespace и заранее проверьте политики доступа.

Как дать Ingress внешний IP в on-prem

На bare metal нужен способ получить стабильный IP для входа. Обычно выбирают одно из решений: MetalLB, существующий аппаратный L4 или балансировщик от провайдера площадки (если он есть в контуре).

Полезная практика: разделить внешний и внутренний трафик разными IngressClass. Например, internal для сервисов сотрудников и external для ограниченного набора публичных endpoints. В небольшой организации в Казахстане это часто означает внутренний доступ для офисных систем, а внешний - только для пары сервисов через DMZ.

Registry: где хранить образы и как жить в закрытом контуре

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

Для минимальной архитектуры обычно хватает одного внутреннего реестра, к которому имеют доступ все ноды и CI. Практичный вариант для старта - Harbor: проекты, роли, базовая интеграция с LDAP/AD, политики хранения и удобный интерфейс. Если нужно совсем просто, подойдет и стандартный Docker Registry с basic auth, но тогда права, уборку и зеркалирование придется собирать вручную.

Хранилище образов проще всего начать с локального диска на отдельной VM или на выделенном сервере: меньше зависимостей, быстрее запуск. Когда объем растет или нужен отказоустойчивый storage, смотрите в сторону S3-совместимого хранилища (on-prem). Это удобнее для масштабирования, но добавляет еще один сервис в поддержку.

Сканирование уязвимостей и подписи образов полезны, но не обязательны в первый день. Часто достаточно базовой гигиены: фиксировать теги, хранить SBOM где возможно и иметь понятный процесс обновлений. Подписи (например, cosign) логично включать, когда появляется регулярный выпуск и требования безопасности.

Если интернета нет или он нестабилен, заранее готовят набор зависимостей: образы Kubernetes-аддонов, базовые образы приложений, Helm charts. Удобно держать «зеркальные» проекты в Harbor и обновлять их по расписанию из изолированной зоны.

Перед запуском зафиксируйте хотя бы четыре решения: где живет registry, какой storage используется, кто имеет права push/pull, и как вы чистите старые теги, чтобы не закончился диск.

Мониторинг и логи: минимально достаточный набор

Без мониторинга и логов on-prem кластер быстро превращается в лотерею. Базовый набор можно поднять без подписок и без лишней нагрузки.

Минимум, который закрывает большинство проблем: Prometheus для метрик, Alertmanager для уведомлений, Grafana для дашбордов. Этого достаточно, чтобы видеть деградации и получать сигнал до того, как пользователи заметят сбой.

В первую очередь следите не за всем подряд, а за тем, что ломается чаще всего: состояние нод и kubelet, заполнение дисков и задержки, здоровье etcd и API, DNS и потери пакетов, ошибки 4xx/5xx и время ответа на Ingress.

С логами лучше стартовать просто. Для небольшого кластера часто хватает Loki (логи из pods плюс поиск в Grafana). Если нужна «классика» и сложные фильтры, можно взять EFK, но он заметно тяжелее по ресурсам.

Алерты делайте короткими и полезными, иначе их начнут игнорировать. Обычно спасают ночью несколько сигналов: диск почти заполнен, etcd недоступен или растет задержка, API возвращает много 5xx, узел стал NotReady, Ingress резко увеличил 5xx.

Про хранение метрик договоритесь сразу. Для старта часто хватает ретеншна 7-15 дней, чтобы разбирать инциденты и видеть тренды. Диск под метрики обычно заканчивается неожиданно, поэтому лучше заранее задать лимит и проверить расход места при вашей частоте скрейпа и количестве подов.

Пошаговый план: поднять базовый стек за несколько итераций

Оснастить команду инфраструктуры
Подберем рабочие станции и ПК для команд администрирования и разработки.
Уточнить варианты

Чтобы минимальная архитектура Kubernetes on-prem не превратилась в набор разрозненных установок, двигайтесь короткими итерациями и фиксируйте результат после каждой. Главное правило: один выбранный способ установки и максимальная повторяемость (одни и те же версии, одинаковые настройки на всех узлах).

Начните с подготовки. Сведите в одну таблицу сервера (CPU, RAM, диски), роли (control plane и workers), IP-адреса и доступы. Проверьте базу сети: DNS резолвит имена, NTP синхронизирует время, MTU одинаковый между узлами.

Дальше удобно идти так:

  • Итерация 1: устанавливаете Kubernetes (часто kubeadm) и проверяете, что узлы в состоянии Ready, а перезагрузка узла не ломает кластер.
  • Итерация 2: подключаете CNI и проверяете связность: pod с одной ноды ходит в pod на другой, сервис доступен по ClusterIP.
  • Итерация 3: поднимаете Ingress и проверяете тестовый сервис с TLS: запрос снаружи доходит до приложения, сертификат корректный.
  • Итерация 4: разворачиваете registry (например, Harbor), настраиваете pull secret и проверяете, что namespace тянет образ без доступа в интернет.
  • Итерация 5: ставите мониторинг (Prometheus и Grafana) и проверяете алерты на искусственной проблеме, например временно заполняете диск на тестовом узле.

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

Частые ошибки и ловушки в on-prem Kubernetes

Самая частая ошибка - собрать все на одном узле и ждать устойчивости. Для теста это терпимо, но в работе любая перезагрузка превращается в простой: control plane и workloads падают вместе.

Вторая ловушка - не продумать резервирование control plane и etcd. Если etcd живет на одном сервере или на тех же дисках, что и рабочие нагрузки, кластер становится трудно восстановить даже после мелкой аварии.

Сеть тоже часто ломает запуск. Диапазоны Pod/Service берут «на глаз», а потом они пересекаются с корпоративными подсетями, VPN или филиалами. Итог - странные таймауты и пропадающие маршруты при простой причине: конфликт адресов.

Еще одна типовая проблема - оставить Kubernetes API и админские панели доступными из широкой сети. Даже без внешнего интернета это риск: достаточно одной скомпрометированной машины в офисном сегменте.

И наконец, многие не ставят лимиты на рост данных. Логи, метрики и временные файлы быстро забивают диск, после чего начинаются падения kubelet и неожиданные рестарты.

Набор проверок, который чаще всего спасает:

  • Разнести роли: минимум 3 control plane и отдельные worker, если нужна устойчивость.
  • Зафиксировать Pod/Service CIDR и проверить, что они не пересекаются с корпоративными сетями.
  • Закрыть доступ к API: отдельная подсеть, firewall, минимум прав для пользователей.
  • Настроить ретеншн и квоты для логов и метрик, следить за заполнением дисков.
  • Обновляться только с тестовым контуром и понятным планом отката.

Быстрый чеклист перед запуском в работу

Расчет железа под кластер
Соберем спецификацию серверов и сети под ваш минимальный on-prem Kubernetes.
Запросить расчет

Перед тем как отдавать кластер командам и включать боевые нагрузки, полезно сделать короткую проверку. Она занимает час-два и часто экономит ночи.

Проверьте базовые опоры:

  • Control plane не в одиночку: минимум 3 узла control plane, а worker вынесены отдельно.
  • DNS и NTP стабильны: имена резолвятся одинаково со всех нод, время синхронизировано.
  • Сеть без сюрпризов: MTU одинаковый, нет потерь пакетов и странной фрагментации.
  • Есть резервные копии критичного: регулярный backup etcd, данных registry и конфигураций мониторинга.
  • Алерты не «для галочки»: есть хотя бы несколько базовых сигналов и понятный канал уведомлений.

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

Пример: небольшой устойчивый кластер для организации в Казахстане

Типичный сценарий для ведомства, клиники или учебного учреждения: 15-30 внутренних сервисов (порталы, интеграции, очереди, несколько баз, отчеты), доступ из локальной сети и иногда через VPN. Контур закрытый, обновления возможны раз в месяц или реже. Нередко есть требование по локальному происхождению оборудования и прозрачности поставок.

Минимально устойчивый вариант начинается не с количества сервисов, а с разведения ролей по узлам. Когда control plane, Ingress и мониторинг живут на одних и тех же машинах, любая нагрузка или сбой превращаются в каскад.

Понятная раскладка для небольшого on-prem кластера:

  • 3 узла control plane (только управление кластером, без прикладных подов)
  • 2 узла Ingress (выделенные, с фиксированными IP через MetalLB)
  • 3-6 рабочих узлов под сервисы (с запасом по CPU и памяти)
  • 1 узел под registry (Harbor) и артефакты, с отдельным диском/RAID
  • 1 узел под мониторинг (Prometheus + Grafana), тоже с отдельным диском

В первый месяц стоит поставить то, что снижает риск простоя: CNI, Ingress, DNS/NTP, registry для закрытого контура, базовый мониторинг и алерты. На квартал вперед обычно переносят более тяжелые вещи: централизованные логи, HA для registry и мониторинга, регулярный процесс обновлений.

Понять, что кластер стал стабильнее, помогают простые метрики: число инцидентов за месяц, среднее время восстановления, доля успешных деплоев, перезапуски подов, заполнение дисков и время ответа API Kubernetes.

Следующие шаги: от плана к закупке и эксплуатации

Когда базовый стек понятен, его нужно превратить в короткий, проверяемый план. Зафиксируйте компоненты первой очереди: CNI, Ingress, балансировка (если нужна), registry, мониторинг, резервное копирование etcd и правила обновлений. Чем меньше «на потом», тем меньше сюрпризов в пилоте.

Дальше составьте спецификацию под ваш размер кластера. Удобнее идти от нагрузки к ресурсам, а не наоборот. Отдельно проговорите сеть: IP-план, VLAN/сегментацию, доступ к DNS/NTP, MTU и точки выхода в интернет или в закрытый контур.

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

Минимальный набор решений до запуска в эксплуатацию:

  • кто владелец кластера и кто делает обновления (Kubernetes и аддоны)
  • как вы храните секреты и кто имеет доступ
  • где лежат бэкапы (etcd, registry, конфигурации) и как часто вы проверяете восстановление
  • какие метрики и алерты обязательны
  • график техокон и правила внесения изменений

Если нужен локальный поставщик «под ключ» - от серверов до системной интеграции и поддержки, имеет смысл смотреть в сторону GSE.kz (gse.kz). Это казахстанский производитель и системный интегратор: в портфеле есть рабочие станции, ПК и серверы, а также услуги по построению инфраструктуры и 24/7 техподдержка через сервисную сеть.

Минимальная архитектура Kubernetes on-prem без подписок | GSE