Изоляция данных между тенантами: Namespace, Network, DB

Когда на одной платформе живут несколько заказчиков, любая ошибка становится общей — и данные, и отказ. Мы разграничиваем пространства, сеть и доступ к базам под ключ, чтобы инцидент в одном контуре не задевал остальные. Вывод нового клиента на платформу ускоряется в разы.
Часто задаваемые вопросы

Где рвётся изоляция тенантов в общем кластере

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

Самая дорогая точка отказа — данные. Общая база с признаком арендатора в строках держится на одном условии: каждый запрос фильтрует по этому признаку. Один незакрытый отчёт, один общий кэш без префикса арендатора или один смонтированный том из соседнего пространства имён — и клиент видит чужие записи. Утечка вскрывается не сразу, а при разборе инцидента.

Конфликт ресурсов выглядит иначе. Без квот и ограничений пакетная выгрузка или переиндексация выедает дисковые операции и сеть на узле; соседние сервисы начинают отдавать ошибки по тайм-аутам, а планировщик под давлением вытесняет поды не того, кто шумит. Виновник продолжает работать, страдают остальные.

Отдельно рвутся границы сред. Тестовый контур в том же кластере с общим балансировщиком, очередями и хранилищем секретов означает, что прогон миграций на стенде проходит по рабочей базе. Дальше разбираем, как это закрывается — по уровням сети, доступа и данных.

Что меняется после разделения сред: эффект в показателях

Изоляция строится на трёх уровнях: отдельный namespace с квотами по процессору и памяти, сетевые политики с запретом по умолчанию и выделенная схема или инстанс базы у каждого тенанта. Kubernetes даёт для этого готовые примитивы, поэтому границы описываются декларативно и воспроизводятся без ручных правок.

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

Второе — время восстановления. Сбой локализован в одном namespace, поэтому откат образа или накат резервной копии базы касается только пострадавшего контура. Восстановление измеряется минутами и не зависит от того, сколько клиентов живёт рядом.

Третье — доля инцидентов с влиянием на соседей. Квоты срезают всплеск потребления, а политики не пропускают трафик между тенантами: «шумный сосед» перестаёт ронять общий узел. Заодно уходит целый класс отказов — конфликт версий схемы при миграции и доступ к чужой таблице через общее соединение.

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

Варианты изоляции тенантов: общие пространства или отдельные контуры

Изоляция тенантов — не бинарный выбор между «всё в одном» и «отдельная инфраструктура на каждого». Между этими крайностями есть рабочие уровни, и разница между ними в том, что именно разделяется: объекты, сеть, база данных или контур целиком. Ниже — три варианта, между которыми реально выбирают на старте проекта.

Самый лёгкий уровень — пространства имён в Kubernetes: они разделяют объекты, но не сеть и не базу данных, поэтому их обязательно дополняют политиками доступа и отдельными учётными записями. Такая схема держит десятки небольших тенантов, пока к разделению не предъявляют формальных требований.

Вариант Когда подходит Ограничения
Общие пространства имён десятки небольших тенантов в одном контуре, требования к разделению формальные лимиты ресурсов и политики доступа настраиваются вручную, ошибка в правилах открывает доступ к чужим данным, а активный сосед забирает ресурсы
Смешанная схема часть тенантов требует усиленной изоляции, часть — нет два набора шаблонов и регламентов: поддержка дороже, аудит ведётся раздельно
Выделенный контур регулируемые данные, крупные заказчики, отдельные требования к сети и базе выше стоимость эксплуатации: обновления и резервное копирование тиражируются на каждый контур

На практике смешанная схема чаще оказывается рабочим состоянием, а не компромиссом: ядро живёт в общем контуре под жёсткими политиками, чувствительные тенанты выносим в отдельные группы пространств с собственными лимитами. Переход между уровнями проектируем заранее — тогда вынос тенанта в выделенный контур становится плановой операцией, а не переписыванием инфраструктуры.

Порядок внедрения: от аудита до передачи в эксплуатацию

Порядок работ выстроен так, чтобы изоляция появлялась на живой системе без остановки продукта. Сначала фиксируем текущее состояние, затем проектируем целевую схему и проверяем её на стенде — рабочие нагрузки переносим только после этого. Каждый этап заканчивается артефактом, который можно проверить и передать дальше.

  1. Аудит конфигурации. Снимаем фактическое состояние: какие пространства имён существуют, кто к ним подключён, где пересекаются сетевые политики и как сервисы ходят в базы. На выходе — перечень расхождений между документацией и реальностью.
  2. Карта зависимостей. Размечаем связи между сервисами, общими хранилищами и внешними системами. Она показывает, что нельзя разделить напрямую и где нужен промежуточный слой доступа.
  3. Проект схемы изоляции. Задаём границы тенантов на трёх уровнях: пространства имён для вычислений, сетевые политики для трафика, отдельные схемы и учётные записи для данных.
  4. Пилотный стенд. Собираем копию контура на ограниченном наборе сервисов и прогоняем негативные сценарии: доступ из чужого пространства имён, общий том, переиспользованный секрет.
  5. План миграции. Разбиваем перенос на волны по связности сервисов, для каждой задаём порядок, точку отката и окно работ. Волна не стартует, пока предыдущая не прошла проверку.
  6. Приёмка и передача. Прогоняем согласованный набор проверок, фиксируем результат и передаём схему дежурной смене вместе с регламентами и разбором типовых инцидентов.

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

Что остаётся у команды: конфигурации, схемы и регламенты

Передаём не «доступ к панели», а рабочий комплект, по которому ваша команда сама поднимет нового арендатора, разберёт инцидент и вернёт систему в известное состояние. Каждый пункт проверяем на живом контуре вместе с вашими инженерами — на приёмке видно, работает ли документ или написан для отчёта.

  • Шаблоны развёртывания — параметризованные описания стенда: переменные на арендатора, квоты, отдельный контур, общие сервисы. Новый клиент поднимается сменой параметров, без правок логики.
  • Описание схемы разделения — карта границ: где проходят пространства имён, сетевые политики и отдельные базы, какие ресурсы сознательно общие и почему это не создаёт пересечений.
  • Политики доступа — роли и права по каждой зоне, порядок выдачи и отзыва, хранение и ротация секретов, правило «доступ по заявке с обоснованием».
  • Инструкции дежурной смене — типовые сценарии: как убедиться, что данные арендаторов не пересекаются, что смотреть при жалобе на чужие данные, кому эскалировать и в какой срок.
  • Порядок отката — точки возврата, состав откатываемого (схема данных, политики, конфигурации), последовательность шагов и проверка после восстановления.
  • Регламент изменений — как правка в общей части проходит согласование, какие проверки обязательны до выката и кто отвечает за регресс.

Всё лежит в репозитории рядом с кодом, версионируется и меняется тем же изменением, что и конфигурация. Иначе через полгода инструкция расходится с фактическим состоянием — и дежурный принимает решения по устаревшей схеме.

Как это выглядело на практике: разделение сред с общими базами

Заказчик — платформа с несколькими направлениями — держал все среды в одном кластере PostgreSQL: общая база, общий пул соединений и одна учётная запись с доступом и к боевым данным, и к тестовым контурам. Долгая миграция одного направления блокировала таблицы, которые читали остальные, а ошибка в тестовой среде доезжала до реальных данных. Исправление стоило часов простоя всего кластера.

Разделение начали с доступа, а не с копирования данных: каждому направлению — свои схемы и роль с правами только на них, приложениям — отдельные строки подключения вместо общего пула. Перенос шёл по плану — сначала некритичные контуры, затем чтение, потом запись. Схема на каждом шаге оставалась обратно совместимой, поэтому старый и новый код работали параллельно, без остановки сервисов.

Что показали метрики

Перекрёстных обращений к чужой базе — с сотен в сутки до нуля. Время восстановления после ошибки развёртывания сократилось с нескольких часов до десятка минут: откатывается только среда одного направления. Блокировки таблиц между командами исчезли — миграции больше не ждут чужих релизов.

Новая среда перестала быть отдельным проектом: раньше под неё поднимали копию кластера, теперь — базу за минуты. Объём резервных копий при этом не вырос, а восстановление одной среды не требует разворачивать всё целиком.

Чем сетевое ограничение отличается от разграничения прав в базе?

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

Права на уровне данных работают с содержанием. Роли и доступы ограничивают, какие таблицы и операции доступны сервису, а фильтрация строк по идентификатору тенанта не даёт вернуть чужие записи даже при корректном соединении. Роль выдаётся не абстрактному пользователю, а конкретному сервису в конкретном контуре — тогда ошибка в одном обработчике не превращается в выгрузку всей базы.

Уровень защиты Что закрывает Где не помогает
Сетевой контур Соединения между контурами тенантов Не различает запросы внутри разрешённого канала
Роли и доступы Какие операции доступны сервису Сервис с верными правами идёт не к своим данным
Права в базе Фильтрация строк и схем по тенанту Не работает при общей учётной записи
Ключи шифрования Чтение чужих данных из копии Не заменяет проверку прав

Один уровень почти всегда протекает: сеть не остановит запрос без фильтра по тенанту, а права в базе не помогут, если сервис подключён к общей учётной записи. Поэтому уровни защиты собирают в комбинацию мер — отдельный контур, свои роли, фильтрация на уровне данных, отдельные ключи шифрования. Каждую попытку выйти за границу проверяем тестом: обращение из чужого контура должно падать, а не тихо проходить.

Типовые технические сомнения перед стартом

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

У нас одна база на всех — данные реально развести?

Разводим не «в лоб»: общий кластер, отдельная схема и роль на тенанта, доступ только через сервисную учётку с привязкой к идентификатору тенанта. Тенантов с жёсткими требованиями выносим на отдельный узел первыми. Слой доступа к данным уже знает, чей это запрос, — правки минимальны.

Права уже выданы широко — всё сломается?

Сначала инвентаризация: кто и к чему реально обращается. Затем узкие роли и сбор обращений, а старые отключаем, когда по ним не осталось трафика. Пересечения закрываем сетевой политикой — даже при избыточной роли вызов между пространствами имён не проходит.

Сред становится больше — управлять не станет сложнее?

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

Что если придётся вернуться к прежней схеме?

Обратный путь проектируем заранее: изоляция не удаляет данные, а меняет границы доступа. Возврат — это снятие политик и слияние схем с сохранением идентификаторов, и мы проверяем его на копии до старта. Формат хранения при переезде не меняется — только то, кто и как к нему обращается.

Обсудим вашу задачу и вернёмся с планом

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

  • карту текущего контура: какие сервисы где развёрнуты и как разделены среды — разработка, приёмочная, продуктивная;
  • как изоляция устроена сейчас: общая база и общая сеть, отдельные пространства имён на тенанта или смешанная схема;
  • состав данных по тенантам и их чувствительность: персональные, платёжные, регуляторные — от этого зависит жёсткость границ;
  • профиль нагрузки и рост: сколько тенантов сейчас, сколько ожидается, где пики;
  • ограничения на изменения: клиентские интеграции, релизный цикл, допустимое окно простоя;
  • матрицу доступов: кто из вашей команды и внешних подрядчиков остаётся в контуре и с какими правами;
  • историю инцидентов: были ли случаи взаимного влияния тенантов или утечек через общий слой.

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

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142