MAATRIX / Блог / Managed Kubernetes против своего k3s: цена удобства в месяц

Managed Kubernetes против своего k3s: цена удобства в месяц

MAATRIX

Когда команда выбирает между managed Kubernetes и своим кластером на VPS, разговор обычно быстро скатывается к сравнению тарифов на вычислительные узлы — а это неверная точка сравнения. Узлы стоят примерно одинаково что там, что там, потому что это просто CPU, RAM и диск. Разница в цене — это control plane: в managed-варианте за него платят отдельно и каждый месяц, в self-hosted k3s его поднимаете и чините сами. Разберём честно, из чего складывается эта доплата, что она реально покупает и когда её платить бессмысленно.

Что вы на самом деле покупаете в managed Kubernetes

Control plane кластера — это API-сервер, etcd (или его аналог для хранения состояния), scheduler и controller-manager. Именно эти компоненты решают, куда поставить под, следят за состоянием кластера и отвечают на запросы kubectl. В managed-предложении провайдер берёт на себя:

  • развёртывание control plane в отказоустойчивой конфигурации (обычно три реплики etcd в разных зонах доступности);
  • резервное копирование etcd и восстановление при сбое;
  • обновление версии Kubernetes на control plane без вашего участия;
  • ротацию TLS-сертификатов между компонентами control plane;
  • мониторинг здоровья API-сервера и автоматический рестарт при деградации.

Вы получаете доступ к API кластера — kubectl get nodes просто работает — но никогда не видите и не администрируете сами control-plane-узлы. Это принципиально другая модель ответственности по сравнению с обычным VPS, где вы администрируете всё сверху вниз.

Здесь и рождается доплата: провайдер эксплуатирует для вас три (иногда больше) отказоустойчивых узла control plane, но не выставляет их вам как отдельные VPS — вы платите за услугу «работающий API кластера», а не за железо под ней. Это и есть цена удобства, вынесенная в отдельную строку счёта поверх стоимости worker-узлов, которые вы всё равно оплачиваете как обычные вычислительные мощности.

Из чего складывается разница в счёте

Если сравнивать управляемый Kubernetes и самостоятельный k3s построчно, разница обычно набирается из нескольких статей, а не из одной:

Статья расходовManaged KubernetesСвой k3s на VPS
Control planeОтдельная плата за кластер (почасовая или фиксированная)Не выделяется — либо совмещён с воркером, либо отдельные VPS под него
Worker-узлыОбычные VPS/инстансы по тарифу провайдераОбычные VPS/инстансы по тарифу провайдера
Балансировщик нагрузкиЧасто отдельная платная услуга (managed LB)Свой (MetalLB, ingress на NodePort, внешний L4-балансировщик)
Хранилище (PV)Managed block storage с наценкой за IOPS/снапшотыТо же самое хранилище, но вы выбираете тариф сами
Обновления control planeВключены в платуВаше время (или время подрядчика)
Резервное копирование etcdВключено или отдельная опцияНастраиваете и мониторите сами
Трафик между узлами и наружуТарификация провайдера, иногда льготная внутри регионаТарификация провайдера, иногда льготная внутри региона

Важный нюанс: сама по себе доплата за control plane у крупных managed-провайдеров обычно не главная статья расходов в абсолютных цифрах — гораздо больше денег уходит на managed-балансировщики, managed-диски с повышенными IOPS и трафик. Но именно доплата за control plane — это плата принципиально «за удобство», а не за ресурсы: вы платите не за вычисления, а за то, что кто-то другой не спит по ночам, если etcd теряет кворум.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Что реально закрывает эта доплата

Прежде чем экономить на control plane, стоит понимать, что именно вы берёте на себя, отказываясь от managed-варианта:

Отказоустойчивость etcd. etcd — это распределённая база данных с консенсусом по Raft. Для отказоустойчивости нужно нечётное число узлов (минимум три), размещённых так, чтобы отказ одной зоны не убил кворум. Если кворум потерян, кластер перестаёт принимать изменения — поды, которые уже запущены, продолжат работать, но задеплоить что-то новое или обработать сбой ноды вы не сможете, пока не восстановите etcd.

Своевременные обновления. Kubernetes выпускает минорные версии примерно раз в четыре месяца, и каждая версия поддерживается ограниченное время. Если control plane отстаёт на несколько минорных версий, апгрейд превращается в отдельный проект: нужно проходить версии последовательно, читать changelog на deprecated API, тестировать на стейджинге. Managed-провайдер обычно даёт хотя бы предупреждение о скором end-of-life версии и делает апгрейд управляемым процессом с одной кнопкой.

Ротация сертификатов. Внутри control plane компоненты общаются друг с другом по TLS с сертификатами, у которых есть срок действия (типично год). Просроченный сертификат — классическая причина внезапной недоступности кластера у тех, кто настроил control plane один раз и забыл о нём. В managed-варианте это не ваша забота.

SLA на доступность API. Большинство managed-провайдеров дают формальный SLA на доступность API-сервера кластера (обычно в терминах digits after the decimal point «девяток» доступности в месяц) с компенсацией при нарушении. Это не защищает от простоя ваших приложений, но защищает от ситуации «мы не можем задеплоить фикс, потому что API кластера лежит».

Если у вас в команде нет человека, который может внятно объяснить разницу между etcdctl snapshot save и etcdctl member list, эта доплата, скорее всего, окупается — вы покупаете экспертизу, которой нет внутри команды, а не абстрактное удобство.

k3s на своих VPS: тот же API, другая модель ответственности

k3s — это open-source дистрибутив Kubernetes от Rancher (сейчас часть SUSE), собранный в один бинарник и урезанный по сравнению с ванильным Kubernetes: убраны cloud-provider-специфичные интеграции, устаревшие alpha-фичи, вместо etcd по умолчанию используется встроенный SQLite (для single-node) или тот же etcd в кластерном режиме. API остаётся полностью совместимым — тот же kubectl, те же манифесты, те же CRD.

Поднять single-node k3s — вопрос одной команды:

curl -sfL https://get.k3s.io | sh -

Через минуту у вас рабочий control plane и worker в одном процессе на одной VPS. Это отличный вариант для разработки, стейджинга или небольшого прод-проекта, где простой control plane на несколько минут раз в год — не катастрофа.

Для отказоустойчивого прод-кластера нужен HA-режим с embedded etcd — минимум три узла с ролью server:

# первый server-узел, инициализирует кластер
curl -sfL https://get.k3s.io | sh -s - server \
  --cluster-init \
  --tls-san=k8s-api.example.com

# второй и третий server-узлы присоединяются к первому
curl -sfL https://get.k3s.io | K3S_TOKEN=<токен-с-первого-узла> sh -s - server \
  --server https://<ip-первого-узла>:6443 \
  --tls-san=k8s-api.example.com

Дальше worker-узлы (роль agent) присоединяются отдельной командой с K3S_URL и токеном. С этого момента вы — тот самый «managed-провайдер» для своего кластера: именно вы отвечаете за то, что было в предыдущем разделе — кворум etcd, обновления, сертификаты, бэкапы.

Сколько стоит self-hosted control plane на самом деле

Прямых расходов на control plane в self-hosted варианте формально нет — вы платите только за три VPS под server-роль (их можно взять минимальной конфигурации, control plane для небольшого кластера не требователен к ресурсам: 2 vCPU и 4 ГБ RAM на узел обычно достаточно для кластеров до нескольких десятков нод). Но «бесплатно» здесь означает «время инженера вместо счёта провайдера», и это время стоит посчитать:

  • Бэкапы etcd. Нужно настроить регулярный снапшот и хранение вне кластера:
# ручной снапшот через k3s (embedded etcd)
k3s etcd-snapshot save --name backup-$(date +%Y%m%d)

# список снапшотов
k3s etcd-snapshot ls

В проде это должно быть по расписанию (systemd timer или cron) с выгрузкой в отдельное S3-совместимое хранилище — и кто-то должен раз в квартал реально проверять, что восстановление из снапшота работает, а не просто верить, что файл лежит.

  • Обновления версии. k3s можно обновлять вручную (повторный запуск install-скрипта с INSTALL_K3S_VERSION) или через system-upgrade-controller, который катит апгрейд по кластеру узел за узлом с учётом drain. Настройка контроллера обновлений — разовая работа на несколько часов, но она должна быть сделана заранее, а не в момент, когда версия становится unsupported.
  • Мониторинг кворума и алерты. Нужно знать о потере кворума раньше, чем об этом узнают пользователи — то есть завести метрики etcd (etcd_server_has_leader, задержки консенсуса) в Prometheus/Grafana и алерты в Telegram или почту.
  • Сетевой слой снаружи. Без managed-балансировщика внешний доступ к сервисам организуется через MetalLB (в режиме L2 или BGP) или через ingress-контроллер на NodePort за внешним reverse-proxy. Это несколько часов настройки один раз, а не постоянные расходы, но требует понимания сетевой топологии.

Совокупно на поддержание HA k3s-кластера в адекватном состоянии команда с опытом тратит от нескольких часов в месяц (плановые проверки, обновления patch-версий) до заметно больше в месяцы мажорных апгрейдов. Если это время оценить по ставке инженера и сравнить с доплатой за managed control plane — иногда self-hosted выходит дороже по факту, просто эти расходы не видны в одном счёте.

Кому доплата оправдана, а кому — нет

Доплата за managed Kubernetes оправдана, если:

  • в команде нет отдельного человека, который регулярно администрирует Kubernetes control plane (не путать с написанием манифестов — это другой навык);
  • простой control plane критичен для бизнеса и обходится дороже ежемесячной доплаты за пару часов disruption;
  • кластер большой и разнородный (десятки узлов, много namespace, несколько команд) — тогда операционная нагрузка на control plane растёт нелинейно;
  • нужна формальная compliance-история (аудит доступа, SLA как часть договора с провайдером).

Self-hosted k3s экономически и технически разумнее, если:

  • проект небольшой или средний, кластер из нескольких узлов, нагрузка предсказуема;
  • в команде уже есть опыт с Kubernetes — тогда администрирование control plane не абстрактный риск, а понятная рутинная задача;
  • важен полный контроль над версией Kubernetes, конфигурацией API-сервера, admission-контроллерами — managed-провайдеры часто ограничивают эти настройки;
  • инфраструктура и так строится на собственных VPS (например, из соображений локации данных или стоимости) — тогда добавить k3s поверх уже администрируемых серверов дешевле, чем переезжать на managed-платформу целиком.

Промежуточный вариант тоже существует: часть команд держит staging и небольшие внутренние сервисы на self-hosted k3s, а прод с высокими требованиями к доступности — на managed control plane. Это разумный компромисс, если инженерное время ограничено, но не хочется полностью отказываться от практики.

Если вы ещё не уверены, что вашему проекту вообще нужен Kubernetes в каком-либо виде, стоит сначала честно ответить на этот вопрос — среди частых заблуждений разбор того, нужен ли Kubernetes каждому проекту, и отдельно — когда переход с docker compose на Kubernetes действительно оправдан. Если ответ «да, k3s», дальше пригодится пошаговая установка k3s на Ubuntu 24.04 и расчёт того, сколько RAM реально нужно под k3s на разных ролях узлов.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

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

Можно ли начать с self-hosted k3s, а потом перейти на managed Kubernetes?

Да, миграция возможна, потому что API совместим — манифесты и Helm-чарты переносятся почти без изменений. Сложнее с данными в PersistentVolume и специфичными для k3s компонентами (например, встроенным Traefik или Klipper LB), которые в managed-кластере нужно будет заменить на аналоги провайдера.

Управляемый Kubernetes всегда дороже self-hosted k3s?

Не всегда в абсолютных цифрах, если честно посчитать время инженера на администрирование control plane, резервное копирование и обновления. Managed-вариант почти всегда дороже в деньгах здесь и сейчас, но self-hosted не бесплатен — он просто переносит расходы из счёта провайдера в рабочие часы команды.

Нужен ли отдельный VPS под каждый server-узел k3s в HA-режиме или можно совместить с worker-нагрузкой?

Технически server-узлы могут одновременно нести обычные поды, k3s не запрещает это по умолчанию. Но в проде server-роль лучше изолировать от тяжёлой пользовательской нагрузки с помощью taint (k3s server --node-taint CriticalAddonsOnly=true:NoExecute), чтобы всплеск нагрузки на приложении не мешал стабильности control plane.

Что произойдёт с воркер-нодами, если control plane временно недоступен?

Уже запущенные поды продолжат работать — kubelet на worker-узлах не зависит от постоянной связи с API-сервером для поддержания текущего состояния. Но новые деплои, изменение реплик, обработка отказа ноды и любые операции через kubectl будут недоступны до восстановления control plane.

Есть ли смысл в managed Kubernetes для одного маленького сервиса?

Обычно нет — накладные расходы на доплату за control plane и на саму сложность Kubernetes для единственного сервиса не окупаются. Для одного-двух контейнеров чаще разумнее обычный VPS с Docker Compose или systemd-юнитами, без Kubernetes в любом виде.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →