Оглавление
Развёртывание MassAccess on-premise в Kubernetes с помощью Helm
Подробное руководство для инженера эксплуатации: выбор схемы размещения данных, подготовка кластера Kubernetes, проверка разрешённой поставки, безопасное создание объектов Secret, установка и проверка, обновление и откат, резервное копирование и восстановление, диагностика и безопасное удаление MassAccess on-premise.
Состав поставки и граница ответственности
В Kubernetes используются две независимо управляемые установки Helm в отдельном пространстве имён. Многократно используемые чарты не содержат секретных значений заказчика и не устанавливают общекластерные контроллеры или пользовательские определения ресурсов.
| Установка Helm | Создаёт и сопровождает | Не создаёт и не сопровождает |
|---|---|---|
| massaccess 0.12.1 | Девять прикладных Deployment, внутренние Service, проверки состояния, необязательные маршруты и NetworkPolicy | StatefulSet и 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 |
| Внешний PostgreSQL | 18.x, устойчивое имя DNS, семь изолированных ролей, TLS verify-full или явно разрешённый незашифрованный режим disable |
| Внешняя Kafka | 4.2.x, не менее двух начальных адресов и трёх брокеров, SASL_SSL или явно разрешённый SASL_PLAINTEXT, коэффициент репликации 3 и min ISR 2 |
| Внешний ClickHouse | 26.4.x, один узел, раздельные порты HTTP и native, три идентичности, необязательный проверяемый TLS |
| Внешний Redis | 8.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-сертификатом, если требуется внешний доступ
- Средства мониторинга заказчика, зашифрованное внешнее хранилище резервных копий, правила хранения и проверенная процедура восстановления
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"Схемы размещения данных
Конфигуратор формирует явное решение о размещении 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.
python3 files/release/release.py verify \
--bundle-dir ./massaccess-kubernetes-release \
--policy files/release/policy.jsonПроверка схемы и создаваемых манифестов
До доступа к кластеру выполните строгую проверку и сформируйте манифесты для каждого выбранного профиля. Изучите различия, убедитесь в отсутствии объектов Secret и секретных значений, а для external-data — в отсутствии StatefulSet и PVC данных.
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
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 сначала установите данные, затем приложение, используя один сформированный набор значений.
- Проверьте неизменяемую идентичность поставки, точные контекст и пространство имён, а также отсутствие занятых имён установок
- Выполните проверки подлинности всех внешних зависимостей или поставляемую проверку встроенного хранилища
- Установите или обновите massaccess-data, дождитесь готовности выбранных встроенных хранилищ, затем создайте требуемые роли, схемы, темы и списки доступа
- Установите или обновите massaccess, дождитесь готовности всех девяти прикладных компонентов и выполните helm test
- Повторите те же команды upgrade --install и подтвердите неизменный исправный состав ресурсов без дубликатов и без потери идентичности Secret или PVC
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 только при обратной совместимости формата хранения; иначе применяйте проверенное поступательное изменение или восстановление
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
Диагностика и порядок действий при сбое
Остановите массовые изменения, соберите ограниченные доказательства, определите нарушенный контракт и подтвердите точную неисправную цепочку до восстановления.
- Ошибка схемы или формирования манифестов: исправьте указанный путь значений; не удаляйте values.schema.json и не ослабляйте проверку
- Ошибка предварительного Job: изучите ограниченную категорию, журнал Job, события, DNS, маршруты, диапазоны сети, учётные данные, TLS, списки доступа, права и параметры хранилища
- CreateContainerConfigError: проверьте имена указанного Secret и ключей, не выводя и не декодируя значения
- ImagePullBackOff: проверьте доступ к реестру, ссылку imagePullSecret, неизменяемый digest и происхождение поставки
- NotReady при открытом порте TCP: проверьте собственный адрес готовности приложения и подтверждённую связь с зависимостью
- Pending PVC: остановитесь и проверьте привязку StorageClass, топологию и ёмкость; не заменяйте хранилище на hostPath
- Восстановите зависимость или контроллер, затем проверьте готовность, число перезапусков, контрольные данные приложения и хеш обезличенного диагностического пакета
Безопасное удаление установки
Перед каждым действием повторно проверьте точные контекст, пространство имён, установки и список PVC. Удаляйте приложение отдельно от контроллеров данных.
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Подтверждённые ограничения
- Встроенные хранилища одновузловые и не обладают высокой доступностью; многовузловая топология, безопасный вывод узла, репликация, переключение и PodDisruptionBudget не поддерживаются
- Чарты не создают и не укрепляют Kubernetes, DNS, CNI, CSI, StorageClass, контроллеры Ingress/Gateway, автоматизацию TLS, мониторинг или инфраструктуру резервного копирования
- Локальные проверки Docker Desktop с hostpath и эталонной CNI не доказывают свойства CSI/CNI заказчика, высокую доступность, ёмкость, производительность, аварийное восстановление или соглашение об уровне обслуживания
- Контракт поставки не заявляет криптографическую подпись или отсутствие уязвимостей; применяйте документированную проверку контрольных сумм, SBOM, происхождения SLSA и политики доверия