Переносим 1С-Битрикс в кластер Kubernetes для быстродействия, устойчивости и масштабируемости

Что дает перевод 1С-Битрикс в Kubernetes:
— Стабильность под нагрузкой: инфраструктура умеет автоматически масштабироваться.
— Инфраструктура сайта на Битрикс (но не сам 1С-Битрикс) разделяется на микросервисы.
— Dev, stage и prod среды гарантированно идентичны.
— Можно делать деплой без даунтайма.
— Уменьшается человеческий фактор.
— Достигается отказоустойчивость вплоть до 99,9%: проблемные узлы автоматически выводятся из работы.

При этом Kubernetes требует квалификации от разработчиков и администраторов, минимум 3 надежных выделенных сервера и сложную инфраструктуру.

Стоит ли ваш проект на 1C-Bitrix переводить в Kubernetes? Давайте посмотрим.
Kubernetes — инструмент для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями.
Особенности Kubernetes
Готовые решения
В Kubernetes есть готовые решения, заменяющие самописные скрипты и кастомные разработки.
Легкое масштабирование
Переход на микросервисную архитектуру облегчает масштабирование и деплой.
Автоматизация
Масштабирование происходит автоматически (в облаке AWS / GCE) или очень просто (на собственных серверах).
Докеризация
Докеризация проекта гарантирует, что у нас всегда будет идентичное окружение. Dev, Stage и Prod среды запускаются с одного образа, собранного из Dockerfile.
Легкое обновление
Kubernetes позволяет обновлять сайт без отключения: Rolling Update обновляет по одному инстансу, ожидая завершения обработки клиентских подключений. Кроме RollingUpdate доступны Blue-green Deployments, Shadow testing, A/B Testing и Canary Releases.
Self-healing
Kubernetes — self-healing. Он следит за сервисами и нодами в кластере. Если сервис не отвечает, он будет перезапущен. Если нода вышла из строя или на ней появились сбои, приложения с нее будут разнесены на другие ноды и она будет отмечена как нерабочая. Этот процесс полностью автоматизирован, администратор не устраняет аварию, а разбирается с проблемной нодой, когда она уже выведена из кластера.
Схема работы Kubernetes
Проблемы переноса
1С-Битрикс в Kubernetes
Концептуально 1С-Битрикс не предназначен для CI/CD в целом и для работы в Kubernetes в частности.
CI/CD требует хранить проект в git, а 1С-Битрикс управляется из админ-панели. Это мешает перенести 1С-Битрикс в git.
Docker образ 1С-Битрикс, как и многих монолитных проектов, создается очень неочевидными способами
При распределенной системе, когда приложение исполняется в нескольких инстансах, требуется хранить файлы, кэш и сессии таким образом, чтобы к ним имели доступ все инстансы.
Поэтому еще недавно на рынке не было подрядчиков, готовых переносить 1С-Битрикс в Kubernetes. По крайней мере с гарантией, за понятную цену и в разумные сроки.

В Southbridge разработали схему переноса и начали предлагать эту услугу.
Схема работы Bitrix в Kubernetes
Чтобы запустить 1C-Bitrix в Kubernetes, нам потребовалось:

  1. Вынести общие каталоги приложений на CephFS.
  2. Вынести сессии в Memcache, причем без кластера и лишних усложнений. При этом решение сохраняет отказоустойчивость: мы запускаем на каждой ноде под с memcache, и php-приложение пишет сессии в каждый memcache. Даже если упадет 2 ноды, останется один сервис, и мы не потеряем сессии.
  3. Вынести кэш в Memcache, чтобы приложения работали с общим кэшем. Доступен вариант хранения кэша в файлах, когда каждый инстанс приложения будет держать свой локальный кэш.
  4. Переписать подключение к базе данных с использованием переменных. Теперь все пароли хранятся в Kubernetes.
  5. Разработать собственное решение для обновления 1С-Битрикс штатными средствами, из админки. Об этом подробне
      Под для обновления
      При деплое проекта мы задаем количество реплик веб-приложения (обычно равно числу нод в кластере или на 1 меньше) и деплоим специальный под с префиксом "-upgrade", в котором возможно обновление кода, но в работу его не включаем, скейлим в 0 (то есть он всегда выключен). Перед обновлением мы включаем его:

      scale deployment.apps/sb-bitrix-git-demo-upgrade --replicas=1
      Установка модуля для Битрикс
      Мы написали модуль для Битрикс, чтобы делать это из админ-панели: одна кнопка устанавливает cookie, другая отправляет изменения в git.
      Модуль устанавливается штатными средствами Битрикс.
      Модуль для Битрикс
      Вот так он выглядит.
      Обновление: шаг 1
      Переходим в Настройки, выбираем Обновление в Kubernetes и нажимаем «Войти в режим обновления». Модуль установит cookie, чтобы попасть в специальный под. Нажимаем "set deploy cookie". После установки cookie у вас изменится фон админки с серого на красный: это означает, вы в нужном поде.
      Обновление: шаг 2
      Переходим на страницу обновлений 1C-Битрикс: https://domain/bitrix/admin/sysupdate.php и выполняем обновление штатными средствами. Обратите внимание, цвет фона админки все еще красный, так как у нас установлен cookie и система направила нас в специальный под для обновления.
      Обновление: шаг 3
      После обновления переходим в Настройки / Обновление в Kubernetes. Нажимаем «Войти в режим обновления», затем «Выполнить "git commit"», а после «Выполнить "git push"».
      Обновление: шаг 4
      Нажимаем «Выйти из режима обновления».

      Все, обновление прошло и изменения попали в git, далее автоматически запустится процесс CI/CD который обновит код в рабочих подах.
      6. После обновления, происходит отправка обновленных файлов в git и обновление подов, так как код изменился, CI/CD произведет деплой автоматически.
      7. Далее мы скейлим в 0 специальный под:
      scale deployment.apps/sb-bitrix-git-demo-upgrade --replicas=0

      Пока идет обновление, проект работает и обрабатывает клиентские запросы. При передеплое поды ждут, пока текущие соединения завершатся, тем временем новые соединения направляются к обновленным подам.
      Сколько серверов нужно для кластера Kubernetes?
      • 1 сервер — Gitlab (Git, CI/CD, Docker Registry)
      • 1 сервер — Сборка и управление (Docker build, Kubectl к серверам кластера)
      • 2 сервера — Ingress (балансировщик входящего трафика)
      • 3 сервера — Master (обеспечивают работу кластера Kubernetes)
      • 3 сервера — Node (обеспечивают работу клиентских приложений, Ceph кластер отвечает за хранение данных)
      Итого: 10 серверов, минимум 3 выделенных сервера под 10 виртуальных.
      Минимум 3 выделенных сервера под
      10 виртуальных
      Как мы обеспечиваем деплой приложения в кластер?
      Мы используем Helm, с его помощью упаковываем приложение и создаем темплейты, чтобы разработчики задавали все параметры для работы проекта в одном месте.

      Выглядит это так:
      В данном примере видно, если пойти с конца, что мы:
      — задаем имя нашего домена;
      — указываем, выписывать ли сертификат автоматически и работать по HTTPS, или убрать и остаться на HTTP;
      — указываем количество и имена серверов с memcache (2 для сессий и один для кэша);
      — включаем отдельный под с cron или настраиваем крон средствами битрикс;
      — задаем подключение к базе данных через переменные DB_USER и DB_PASSWORD (секреты хранятся в Kubernetes).

      Пример: мы хотим увеличить число инстансов Битрикс в нашем кластере, для этого мы поменяем значение в одном файле (вместо 1 поставим нужное количество):
      Дополнительно можно ввести любые переменные.

      Теперь вы управляете настройками сайта из одного файла. Это намного удобнее, чем править все руками.
      Как обновить 1С-Битрикс в Kubernetes из админки?
      Что вы получите после перевода 1С-Битрикс в Kubernetes:
      • Отказоустойчивость (вплоть до 99,9%)
      • Деплой без даунтайма
      • Быстрый/автоматический скейлинг при повышении нагрузки
      • Легкий деплой новых версий
      • Деплой по кнопке (разработчику надо посмотреть, как будет выглядеть приложение с правками из его ветки)
      • Легкий тест новых версий сайта (перенаправляем часть пользователей в под, куда задеплоена новая версия сайта)
      • Возможность покрытия кода тестами (автоматическое тестирование при деплое).
      • Автоматический откат до предыдущей версии в случае ошибок в коде
      • Возможность обслуживания инфраструктуры. Кубернетес позволяет выключить ноду, обновить, поставить новое ядро и вернуть обратно. Все эти действия проходят прозрачно для приложений в кластере.
      • Надежное, проверенное решение вместо набора скриптов и костылей: Kubernetes становится промышленным стандартом, его активно поддерживают Google, RedHat, Microsoft.

      Kubernetes становится промышленным стандартом, его активно поддерживают Google, RedHat, Microsoft
      Варианты сотрудничества
      Мы готовы перевести ваш 1С-Битрикс в Kubernetes и взять на поддержку, либо провести миграцию и обучить ваших сотрудников работе в Kubernetes.

      У нас есть технология обучения: Southbridge регулярно организует
      курсы по Kubernetes.
      Как вас зовут?
      Почта
      Телефон
      Я хочу, чтобы со мной связался:
      Нажимая на кнопку, вы соглашаетесь с условиями о персональных данных