Развертывание 1С-Битрикс в Kubernetes

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Развертывание 1С-Битрикс в Kubernetes
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Развертывание 1С-Битрикс в Kubernetes

1С-Битрикс не проектировался для контейнерной оркестрации. Сессии в файлах, кеш на диске, загружаемые файлы в upload/, ядро в bitrix/ — всё это «statefull» артефакты, которые в Kubernetes требуют специальной обработки. Тем не менее задача решаема, и в production работают нагруженные Битрикс-сайты в k8s-кластерах.

Основные проблемы при контейнеризации Битрикс

Сессии. По умолчанию PHP сохраняет сессии в /tmp контейнера. При нескольких репликах pod'ов разные запросы одного пользователя попадают на разные pod'ы — сессия теряется. Решение: переключить хранилище сессий на Redis.

В .settings.php Битрикс:

'session' => [
    'value' => [
        'mode' => 'separated',
        'handlers' => [
            'general' => [
                'type' => 'redis',
                'host' => 'redis-service',
                'port' => 6379,
            ],
        ],
    ],
],

Кеш. CACHE_TYPE=A в компонентах по умолчанию пишет в bitrix/cache/. При нескольких репликах кеш не синхронизируется. Переключаем на Memcached или Redis:

'cache' => [
    'value' => [
        'type' => ['memcache' => 'memcache'],
        'memcache' => [
            'host' => 'memcached-service',
            'port' => 11211,
        ],
    ],
],

Файлы. Директория upload/ должна быть доступна всем pod'ам. Используем PersistentVolumeClaim с режимом ReadWriteMany (NFS, CephFS, Longhorn в режиме RWX).

Лицензия. Битрикс привязывает лицензию к IP-адресу или домену, не к MAC-адресу контейнера. При облачном деплое убедитесь, что внешний IP стабилен или лицензия оформлена на домен.

Структура Kubernetes-манифестов

namespace: bitrix-prod
├── Deployment: bitrix-app (PHP-FPM + Nginx sidecar)
├── Service: bitrix-app-svc
├── Ingress: bitrix-ingress (с TLS)
├── StatefulSet: redis (или Redis Operator)
├── StatefulSet: memcached
├── PersistentVolumeClaim: bitrix-upload (RWX)
├── ConfigMap: php-fpm-config
├── ConfigMap: nginx-config
└── Secret: db-credentials

Deployment для PHP-FPM:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bitrix-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: bitrix-app
  template:
    spec:
      containers:
        - name: php-fpm
          image: registry.example.com/bitrix-app:1.2.3
          volumeMounts:
            - name: upload
              mountPath: /var/www/html/upload
            - name: php-fpm-config
              mountPath: /usr/local/etc/php-fpm.d/www.conf
              subPath: www.conf
          env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: host
        - name: nginx
          image: nginx:1.25-alpine
          ports:
            - containerPort: 80
          volumeMounts:
            - name: upload
              mountPath: /var/www/html/upload
            - name: nginx-config
              mountPath: /etc/nginx/conf.d/default.conf
              subPath: default.conf
      volumes:
        - name: upload
          persistentVolumeClaim:
            claimName: bitrix-upload
        - name: php-fpm-config
          configMap:
            name: php-fpm-config
        - name: nginx-config
          configMap:
            name: nginx-config

Dockerfile для образа Битрикс

FROM php:8.2-fpm-bullseye

RUN apt-get update && apt-get install -y \
    libzip-dev libpng-dev libjpeg-dev libwebp-dev \
    && docker-php-ext-install pdo_mysql zip gd opcache

RUN pecl install redis && docker-php-ext-enable redis
RUN pecl install memcached && docker-php-ext-enable memcached

COPY php.ini /usr/local/etc/php/conf.d/99-bitrix.ini
COPY --chown=www-data:www-data . /var/www/html

# upload/ монтируется как PVC, поэтому исключаем из образа
RUN rm -rf /var/www/html/upload

WORKDIR /var/www/html

Важно: код Битрикс (bitrix/, local/, публичные php-файлы) запекается в образ. upload/ монтируется снаружи через PVC. Обновление сайта = сборка нового образа + rolling update Deployment'а.

База данных вне Kubernetes

Базу данных MySQL/PostgreSQL не рекомендуется запускать в k8s без специализированных операторов (Percona Operator, CloudNativePG). Проще использовать managed-решения: AWS RDS, Yandex Cloud Managed MySQL, или выделенный сервер вне кластера. Битрикс подключается по стандартному хосту и порту через Secret.

Горизонтальное масштабирование

После решения проблем с сессиями и кешем Deployment масштабируется командой:

kubectl scale deployment bitrix-app --replicas=5

Или автоматически через HorizontalPodAutoscaler:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: bitrix-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: bitrix-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

CI/CD-пайплайн

git push → GitLab CI/CD:
  1. docker build -t registry/bitrix-app:${CI_COMMIT_SHA} .
  2. docker push registry/bitrix-app:${CI_COMMIT_SHA}
  3. kubectl set image deployment/bitrix-app php-fpm=registry/bitrix-app:${CI_COMMIT_SHA}
  4. kubectl rollout status deployment/bitrix-app

Rolling update заменяет pod'ы по одному — нулевой downtime при деплоях.

Сроки

Этап Содержание Срок
Анализ и подготовка Аудит конфигурации Битрикс, выбор решений для сессий/кеша 2–3 дня
Dockerfile + образ Сборка, проверка работоспособности 2–3 дня
k8s-манифесты Deployment, Service, Ingress, PVC, ConfigMap, Secret 3–4 дня
Redis/Memcached Развёртывание и настройка session/cache 1–2 дня
CI/CD Пайплайн сборки и деплоя 2–3 дня
Тестирование Нагрузочные тесты, проверка sticky session 2–3 дня

Итого: 2–3 недели для боевого окружения. Для dev/staging — быстрее.