Развёртывание MassAccess on-premise в Kubernetes с помощью Helm

Подробное руководство для инженера эксплуатации: выбор схемы размещения данных, подготовка кластера Kubernetes, проверка разрешённой поставки, безопасное создание объектов Secret, установка и проверка, обновление и откат, резервное копирование и восстановление, диагностика и безопасное удаление MassAccess on-premise.

ИнформацияЭта страница относится только к поставке Kubernetes/Helm. Docker Compose остаётся отдельным поддерживаемым самодостаточным по составу пакетом. Не объединяйте команды Compose и Helm в одной установке.

Состав поставки и граница ответственности

В Kubernetes используются две независимо управляемые установки Helm в отдельном пространстве имён. Многократно используемые чарты не содержат секретных значений заказчика и не устанавливают общекластерные контроллеры или пользовательские определения ресурсов.

Установка HelmСоздаёт и сопровождаетНе создаёт и не сопровождает
massaccess 0.12.1Девять прикладных Deployment, внутренние Service, проверки состояния, необязательные маршруты и NetworkPolicyStatefulSet и PVC хранилищ данных, объекты Secret, licensor, контроллеры и пользовательские определения ресурсов
massaccess-data 0.2.0Выбранные одновузловые встроенные хранилища в StatefulSet, их Service и шаблоны сохраняемых PVCПрикладные Deployment, внешние хранилища, объекты Secret и общекластерные ресурсы

Поддерживаемые версии и конфигурации

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

ОбластьПоддерживаемая конфигурация
KubernetesВерсии 1.33–1.36
HelmВерсия 4.2; формат чарта apiVersion v2
Версия приложенияНеизменяемая X.Y или dev-<7–40 строчных шестнадцатеричных знаков>; latest запрещён
Формат конфигурацииmassaccess.io/onprem-values/v1alpha1 и обязательное deployment.method=kubernetes
Встроенные хранилищаПо одному экземпляру выбранного хранилища, без высокой доступности, RWO PVC и политика сохранения PVC Retain/Retain
Внешний PostgreSQL18.x, устойчивое имя DNS, семь изолированных ролей, TLS verify-full или явно разрешённый незашифрованный режим disable
Внешняя Kafka4.2.x, не менее двух начальных адресов и трёх брокеров, SASL_SSL или явно разрешённый SASL_PLAINTEXT, коэффициент репликации 3 и min ISR 2
Внешний ClickHouse26.4.x, один узел, раздельные порты HTTP и native, три идентичности, необязательный проверяемый TLS
Внешний Redis8.6.x, устойчивое имя DNS доступного для записи основного узла, пространство имён ACL, сохранение AOF, noeviction, необязательный проверяемый TLS
Нижняя граница ресурсов приложенияДевять Pod: requests/limits процессора 2025m/3425m и памяти 1632Mi/2944Mi в локальной эталонной среде
Нижняя граница ресурсов встроенных данныхЧетыре Pod: requests/limits процессора 400m/1250m и памяти 1024Mi/1920Mi в локальной эталонной среде

Требования к кластеру и точное определение целевой среды

Оператор заказчика предоставляет и проверяет платформу Kubernetes до применения Helm.

  • Проверенное несистемное пространство имён и разные имена установок приложения и данных для одного одноклиентского экземпляра
  • Рабочая внутренняя служба имён и сетевой модуль CNI, для которого действие запрещающей по умолчанию NetworkPolicy подтверждено разрешённым и запрещённым соединением
  • Доступ к реестру и успешное свежее получение каждого образа по неизменяемому digest через управляемый заказчиком imagePullSecret
  • Для встроенных хранилищ — проверенный CSI StorageClass с режимом RWO, способом привязки, политикой освобождения, возможностью расширения, доступной ёмкостью и сведениями о топологии
  • Достаточные квоты и доступные на узлах процессор, память, временное хранилище, число Pod и ёмкость постоянного хранилища с учётом накладных расходов платформы
  • Уже установленный контроллер Ingress или реализация Gateway API и существующий Secret с TLS-сертификатом, если требуется внешний доступ
  • Средства мониторинга заказчика, зашифрованное внешнее хранилище резервных копий, правила хранения и проверенная процедура восстановления
bash
export MA_CONTEXT='customer-nonproduction'
export MA_NAMESPACE='massaccess'
export MA_APP_RELEASE='massaccess'
export MA_DATA_RELEASE='massaccess-data'

kubectl --context "$MA_CONTEXT" config current-context
kubectl --context "$MA_CONTEXT" get namespace "$MA_NAMESPACE" -o name
helm --kube-context "$MA_CONTEXT" list --namespace "$MA_NAMESPACE"
ВажноЗаданные в чарте requests и limits — только нижняя граница для планирования, измеренная в локальной эталонной среде. Это не расчёт ресурсов заказчика и не доказательство ёмкости, производительности, высокой доступности или соглашения об уровне обслуживания.

Схемы размещения данных

Конфигуратор формирует явное решение о размещении PostgreSQL, Kafka, ClickHouse и Redis. Имя профиля должно соответствовать режимам всех четырёх хранилищ.

ПрофильГраница ответственности
external-dataВсе четыре хранилища работают как внешние службы под управлением заказчика; установка данных не создаёт StatefulSet или PVC.
bundled-dataВсе четыре хранилища входят в отдельную одновузловую установку massaccess-data с сохраняемыми RWO PVC.
mixed-dataДля каждого хранилища явно выбран внешний или встроенный режим; установка данных создаёт только компоненты, отмеченные как bundled.

Конфигуратор и значения без секретов

Выберите Kubernetes и схему размещения в конфигураторе on-premise. Получайте сформированный файл без секретов только через разрешённый канал поставки продукта и храните параметры платформы отдельно.

  • Убедитесь, что contractVersion равен massaccess.io/onprem-values/v1alpha1, а deployment.method равен kubernetes
  • Проверьте адреса, версии, режимы TLS, имена и ключи Secret, общедоступные адреса, диапазоны сети, правила размещения, ресурсы и способ публикации
  • Храните сформированные значения, параметры платформы приложения, параметры платформы данных и файл образов только с digest как отдельные проверяемые входные данные
  • Не используйте временный артефакт конвейера как способ загрузки для заказчика; применяйте только полный разрешённый комплект поставки

Проверка комплекта поставки

До установки, обновления или отката проверьте контрольные суммы полного комплекта, перечни SBOM для чартов и образов, субъекты происхождения SLSA v1, доверенные проект, ветку и сборщик, а также файл образов только с digest.

bash
python3 files/release/release.py verify \
  --bundle-dir ./massaccess-kubernetes-release \
  --policy files/release/policy.json

Проверка схемы и создаваемых манифестов

До доступа к кластеру выполните строгую проверку и сформируйте манифесты для каждого выбранного профиля. Изучите различия, убедитесь в отсутствии объектов Secret и секретных значений, а для external-data — в отсутствии StatefulSet и PVC данных.

bash
helm lint ./massaccess --strict \
  -f ./massaccess/files/examples/generated-external-values.yaml \
  -f ./massaccess/files/examples/application-platform-values.yaml
helm template massaccess ./massaccess --namespace "$MA_NAMESPACE" \
  -f /secure/non-secret/generated-values.yaml \
  -f /secure/non-secret/application-platform-values.yaml \
  -f ./massaccess-kubernetes-release/values-images.json \
  > /tmp/massaccess-rendered.yaml
helm lint ./massaccess-data --strict \
  -f ./massaccess/files/examples/generated-bundled-values.yaml \
  -f /secure/non-secret/data-platform-values.yaml

Разрешённая активация и ссылки на объекты Secret

Многократно используемые чарты и значения без секретов отделены от разрешённого пакета активации. Чарты ссылаются на заранее созданные объекты Secret в пространстве имён и не управляют их значениями.

  • Проверьте обезличенный план создания Secret до применения к точному контексту, адресу API и пространству имён
  • Для учётных данных и материалов TLS используйте одобренные заказчиком Vault, External Secrets, запечатанные Secret или защищённые файлы
  • В проверках перед установкой и обновлением используйте --verify-only и прекращайте работу при отсутствии ключей или несовпадении идентичности
  • Монтируйте каждый Secret только в те компоненты, которым он нужен; ServiceAccount приложения не имеет прав на чтение Secret
bash
export MA_API_SERVER='https://kubernetes.example.invalid'

python3 files/bootstrap-secrets.py \
  --bundle /secure/path/massaccess-kubernetes-bootstrap.tar.gz \
  --context "$MA_CONTEXT" \
  --expected-server "$MA_API_SERVER" \
  --namespace "$MA_NAMESPACE" \
  --acknowledge-namespace "$MA_NAMESPACE"

# Apply only after reviewing the redacted plan above.
python3 files/bootstrap-secrets.py \
  --bundle /secure/path/massaccess-kubernetes-bootstrap.tar.gz \
  --context "$MA_CONTEXT" \
  --expected-server "$MA_API_SERVER" \
  --namespace "$MA_NAMESPACE" \
  --acknowledge-namespace "$MA_NAMESPACE" \
  --apply
ВажноНикогда не помещайте учётные данные, значения Secret, сведения kubeconfig, адреса заказчика или закрытые материалы в Git, файлы значений, аргументы --set, историю оболочки, журналы, снимки экрана, текст задач или артефакты конвейера.

Установка и безопасный повторный запуск

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

  1. Проверьте неизменяемую идентичность поставки, точные контекст и пространство имён, а также отсутствие занятых имён установок
  2. Выполните проверки подлинности всех внешних зависимостей или поставляемую проверку встроенного хранилища
  3. Установите или обновите massaccess-data, дождитесь готовности выбранных встроенных хранилищ, затем создайте требуемые роли, схемы, темы и списки доступа
  4. Установите или обновите massaccess, дождитесь готовности всех девяти прикладных компонентов и выполните helm test
  5. Повторите те же команды upgrade --install и подтвердите неизменный исправный состав ресурсов без дубликатов и без потери идентичности Secret или PVC
bash
helm --kube-context "$MA_CONTEXT" upgrade --install "$MA_DATA_RELEASE" ./massaccess-data \
  --namespace "$MA_NAMESPACE" \
  -f /secure/non-secret/generated-values.yaml \
  -f /secure/non-secret/data-platform-values.yaml \
  --rollback-on-failure --wait --timeout 15m
helm --kube-context "$MA_CONTEXT" upgrade --install "$MA_APP_RELEASE" ./massaccess \
  --namespace "$MA_NAMESPACE" \
  -f /secure/non-secret/generated-values.yaml \
  -f /secure/non-secret/application-platform-values.yaml \
  -f ./massaccess-kubernetes-release/values-images.json \
  --rollback-on-failure --wait --timeout 15m
helm --kube-context "$MA_CONTEXT" test "$MA_APP_RELEASE" \
  --namespace "$MA_NAMESPACE" --logs
kubectl --context "$MA_CONTEXT" --namespace "$MA_NAMESPACE" \
  get deployment,statefulset,pod,service,job,persistentvolumeclaim

Проверка после установки

Готовность ресурсов обязательна, но сама по себе не доказывает работоспособность приложения.

  • Проверьте версии установок Helm, Deployment, StatefulSet, Pod, Service, Job, PVC, события, готовность и число перезапусков
  • Проверьте вход в панель, API, переключение WebSocket, маршруты webhook, лицензирование и учёт использования через настроенную точку входа TLS
  • Выполните подтверждённые чтение и запись приложения в PostgreSQL, Kafka, ClickHouse и Redis; одного соединения TCP недостаточно
  • Проверьте обнаружение метрик, ограниченные обезличенные журналы и события, а также диагностический пакет без значений Secret и содержимого сообщений

Ingress, Gateway API, TLS, WebSocket и webhook

Интеграции с Ingress и Gateway API взаимоисключающие. Если нужен внешний доступ, выберите ровно одну; для внутренней проверки обе можно отключить.

  • Заказчик устанавливает и сопровождает контроллер или Gateway, DNS, завершение TLS и жизненный цикл сертификатов
  • Укажите ссылку только на существующий Secret TLS и проверьте имя узла, цепочку сертификатов, маршруты и передаваемые заголовки
  • Проверьте сквозной доступ к панели, API, переключению /web/api/ws/ WebSocket, обратным вызовам мессенджеров и маршрутам webhook заказчика
  • Чарт не устанавливает контроллер, Gateway, пользовательское определение ресурса, запись DNS или автоматизацию сертификатов

Обновление, восстановление после ошибки и откат

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

  • Неуспешная предварительная проверка должна сохранить последнюю исправную версию и сообщить ограниченную категорию причины
  • Исправьте только доказанное нарушение, повторите обновление, затем проверьте историю, компоненты, идентичность Secret и PVC, а также контрольные данные приложения
  • Откат Helm изменяет только контроллеры и образы; он не обращает вспять изменение схемы или данных
  • Откатывайте massaccess-data только при обратной совместимости формата хранения; иначе применяйте проверенное поступательное изменение или восстановление
bash
helm --kube-context "$MA_CONTEXT" history "$MA_APP_RELEASE" --namespace "$MA_NAMESPACE"
helm --kube-context "$MA_CONTEXT" upgrade "$MA_APP_RELEASE" ./massaccess \
  --namespace "$MA_NAMESPACE" \
  -f /secure/non-secret/generated-values.yaml \
  -f /secure/non-secret/application-platform-values.yaml \
  -f ./massaccess-kubernetes-release/values-images.json \
  --rollback-on-failure --wait --timeout 15m
helm --kube-context "$MA_CONTEXT" rollback "$MA_APP_RELEASE" PREVIOUS_REVISION \
  --namespace "$MA_NAMESPACE" --wait --timeout 15m

Резервное копирование и восстановление

Резервное копирование, высокая доступность, переключение, сроки хранения и показатели RPO/RTO внешних хранилищ относятся к ответственности заказчика. Для встроенного режима нужны согласованные по компонентам зашифрованные копии вне кластера и проверка восстановления в чистой изолированной среде.

  • PostgreSQL: согласованный логический дамп; Kafka: копия остановленного одноброкерного хранилища; ClickHouse: согласованный интерфейс резервного копирования; Redis: безопасная копия AOF/RDB после синхронизации
  • Фиксируйте идентичность копии, срок хранения, шифрование и результат восстановления без учётных данных и данных заказчика
  • Считайте восстановление успешным только после чтения исходной контрольной записи через клиентский протокол каждого компонента на новых хранилищах
  • Удаление приложения не затрагивает данные; удаление установки данных убирает контроллеры и Service, но сохраняет PVC
ВажноСостояние PVC Bound, наличие архива или нулевой код завершения не доказывают восстановление. Численные RPO/RTO требуют повторных проверок на CSI и хранилище резервных копий заказчика.

Диагностика и порядок действий при сбое

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

  • Ошибка схемы или формирования манифестов: исправьте указанный путь значений; не удаляйте values.schema.json и не ослабляйте проверку
  • Ошибка предварительного Job: изучите ограниченную категорию, журнал Job, события, DNS, маршруты, диапазоны сети, учётные данные, TLS, списки доступа, права и параметры хранилища
  • CreateContainerConfigError: проверьте имена указанного Secret и ключей, не выводя и не декодируя значения
  • ImagePullBackOff: проверьте доступ к реестру, ссылку imagePullSecret, неизменяемый digest и происхождение поставки
  • NotReady при открытом порте TCP: проверьте собственный адрес готовности приложения и подтверждённую связь с зависимостью
  • Pending PVC: остановитесь и проверьте привязку StorageClass, топологию и ёмкость; не заменяйте хранилище на hostPath
  • Восстановите зависимость или контроллер, затем проверьте готовность, число перезапусков, контрольные данные приложения и хеш обезличенного диагностического пакета

Безопасное удаление установки

Перед каждым действием повторно проверьте точные контекст, пространство имён, установки и список PVC. Удаляйте приложение отдельно от контроллеров данных.

bash
kubectl --context "$MA_CONTEXT" get namespace "$MA_NAMESPACE" -o name
helm --kube-context "$MA_CONTEXT" status "$MA_APP_RELEASE" --namespace "$MA_NAMESPACE"
helm --kube-context "$MA_CONTEXT" uninstall "$MA_APP_RELEASE" --namespace "$MA_NAMESPACE"
helm --kube-context "$MA_CONTEXT" status "$MA_DATA_RELEASE" --namespace "$MA_NAMESPACE"
helm --kube-context "$MA_CONTEXT" uninstall "$MA_DATA_RELEASE" --namespace "$MA_NAMESPACE"
kubectl --context "$MA_CONTEXT" --namespace "$MA_NAMESPACE" get persistentvolumeclaim
ВажноВ штатной процедуре намеренно нет команд удаления PVC, PV, снимков, резервных копий, Secret или пространства имён. Удаление данных или идентичности — отдельная явно разрешённая операция после проверки восстановления и согласования срока хранения.

Подтверждённые ограничения

  • Встроенные хранилища одновузловые и не обладают высокой доступностью; многовузловая топология, безопасный вывод узла, репликация, переключение и PodDisruptionBudget не поддерживаются
  • Чарты не создают и не укрепляют Kubernetes, DNS, CNI, CSI, StorageClass, контроллеры Ingress/Gateway, автоматизацию TLS, мониторинг или инфраструктуру резервного копирования
  • Локальные проверки Docker Desktop с hostpath и эталонной CNI не доказывают свойства CSI/CNI заказчика, высокую доступность, ёмкость, производительность, аварийное восстановление или соглашение об уровне обслуживания
  • Контракт поставки не заявляет криптографическую подпись или отсутствие уязвимостей; применяйте документированную проверку контрольных сумм, SBOM, происхождения SLSA и политики доверия