Стадия жизненного цикла модуля: General Availability

В этом документе описано, как модуль Code подбирает ресурсы и масштабирует Kubernetes workloads на основе параметров масштабирования в CodeInstance.

Ключевые параметры

  • spec.scaling.targetUserCount: профиль нагрузки (ожидаемое количество пользователей). Поддерживаемые значения: 100, 1000, 3000, 5000 (10 существует только для внутреннего использования разработчиками; см. предупреждение ниже).
  • spec.scaling.highAvailability: переключатель HA-режима. Включает создание и настройку ресурсов autoscaling и защиты от вытеснений (см. следующий раздел).
  • spec.gitData.resources: ручное переопределение CPU/памяти для Gitaly (имеет приоритет над spec.scaling.targetUserCount).
  • spec.gitData.replicas: количество реплик Gitaly в HA-режиме (опционально; если не задано, используются значения по умолчанию).

За счёт чего обеспечивается отказоустойчивость и растёт производительность

При включенном HA-режиме (spec.scaling.highAvailability: true) оператор использует стандартные механизмы Kubernetes, которые повышают устойчивость к сбоям и помогают держать производительность под нагрузкой:

  • Несколько реплик (Deployments/StatefulSets): сервисы запускаются более чем в одной реплике, поэтому отказ одной поды/ноды не останавливает сервис.
  • Horizontal Pod Autoscaler (HPA): автоматически увеличивает/уменьшает число реплик на основе CPU-метрик; для ключевых компонентов настройки подбираются под targetUserCount. Это даёт дополнительную пропускную способность в пике без постоянного использования большого количества физических ресурсов сервера.
  • PodDisruptionBudget (PDB): ограничивает количество Pod, которые можно вытеснить при планируемых событиях (drain нод, обновления), снижая риск простоя во время обслуживания.
  • Pod anti-affinity (preferred): Pod предпочтительно разносятся по нодам (по kubernetes.io/hostname). Это повышает отказоустойчивость — если одна нода выйдет из строя, остальные реплики приложения продолжат работать на других нодах. Кроме того, реплики не будут мешать друг другу при нехватке ресурсов (CPU, память) на одной ноде. Такое распределение работает, когда в кластере достаточно свободных нод.

При выключенном HA-режиме оператор использует более простую “standalone” топологию (для многих сервисов — одна реплика) и не создаются объекты HPA/PDB.

Внимание Не рекомендуется использовать любые экземпляры “burstable” в облачной инфраструктуре из-за непостоянной производительности.

spec.scaling.targetUserCount: 10 предназначен исключительно для внутреннего использования разработчиками. Использование этого значения в иных средах не рекомендуется и может привести к нестабильной работе или непредвиденному поведению системы.

Справочник по ресурсам

Все расчёты выполняются на базе spec.scaling.targetUserCount.

В таблицах ниже приведены ресурсы, требуемые для одной реплики каждого компонента. В HA-режиме закладывайте как минимум 2 реплики для горизонтально масштабируемых сервисов (то есть как минимум ~2× от значений “на одну реплику”), плюс запас под autoscaling.

Standalone-режим (spec.scaling.highAvailability: false)

Пользователи/Компонент 100 300 500 1000 3000 5000
Webservice default requests: 3CPU / 6Gb
limits: 3CPU / 6Gb
3 воркера, 8 тредов
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 воркера, 8 тредов
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 воркера, 8 тредов
requests: 6CPU / 10Gb
limits: 6CPU / 10Gb
6 воркеров, 8 тредов
requests: 8CPU / 13Gb
limits: 8CPU / 13Gb
8 воркеров, 8 тредов
requests: 10CPU / 16Gb
limits: 10CPU / 16Gb
10 воркеров, 8 тредов
Sidekiq requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
Shell requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.384CPU / 250Mb
Toolbox requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
Praefect requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.6CPU / 1200Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
Gitaly requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 2CPU / 4Gb
limits: 2CPU / 4Gb
requests: 6CPU / 16Gb
limits: 6CPU / 16Gb
requests: 6CPU / 16Gb
limits: 6CPU / 16Gb
Code-operator requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
Registry* requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
Pages* requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 3Gb
requests: 0.9CPU / 2Gb
limits: 1.5CPU / 4Gb
Mailroom* requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
HAProxy* requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.5CPU / 256Mb
limits: 1CPU / 512Mb
requests: 0.75CPU / 512Mb
limits: 1.5CPU / 1Gb
Всего(Мин компоненты) requests: 6CPU / 10.5Gb
limits: 8CPU / 14.5Gb
requests: 7CPU / 11.5Gb
limits: 9CPU / 15.5Gb
requests: 7CPU / 11.5Gb
limits: 9CPU / 15.5Gb
requests: 9.5CPU / 16.5Gb
limits: 11.5CPU / 20.5Gb
requests: 15.5CPU / 31.5Gb
limits: 18CPU / 36Gb
requests: 17.5CPU / 34.5Gb
limits: 19.5CPU / 38Gb
Всего(Все компоненты) requests: 8CPU / 12.5Gb
limits: 12CPU / 19.5Gb
requests: 9CPU / 13.5Gb
limits: 13CPU / 20.5Gb
requests: 9CPU / 13.5Gb
limits: 13CPU / 20.5Gb
requests: 11.5CPU / 18.5Gb
limits: 15.5CPU / 25.5Gb
requests: 17.75CPU / 33.6Gb
limits: 22CPU / 42.3Gb
requests: 20CPU / 37.9Gb
limits: 24CPU / 45.8Gb

HA-режим (spec.scaling.highAvailability: true)

Пользователи/Компонент 100 300 500 1000 3000 5000
Webservice default requests: 3CPU / 6Gb
limits: 3CPU / 6Gb
3 воркера, 8 тредов
requests: 3CPU / 5.5Gb
limits: 3CPU / 5.5Gb
3 воркера, 8 тредов
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 воркера, 8 тредов
requests: 5CPU / 8.5Gb
limits: 5CPU / 8.5Gb
5 воркеров, 8 тредов
requests: 6CPU / 10Gb
limits: 6CPU / 10Gb
6 воркеров, 8 тредов
requests: 8CPU / 13Gb
limits: 8CPU / 13Gb
8 воркеров, 8 тредов
Sidekiq requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 3Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 2Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 2Gb
requests: 1CPU / 1.5Gb
limits: 1CPU / 2Gb
Shell requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.01CPU / 24Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.5CPU / 600Mb
requests: 0.032CPU / 50Mb
limits: 0.384CPU / 250Mb
Toolbox requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
requests: 0.05CPU / 350Mb
limits: 1CPU / 2Gb
Praefect requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
requests: 0.1CPU / 128Mb
limits: 0.6CPU / 1200Mb
requests: 0.1CPU / 128Mb
limits: 0.3CPU / 600Mb
Gitaly requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 1.5CPU / 2Gb
limits: 1.5CPU / 2Gb
requests: 2CPU / 4Gb
limits: 2CPU / 4Gb
requests: 6CPU / 16Gb
limits: 6CPU / 16Gb
requests: 6CPU / 16Gb
limits: 6CPU / 16Gb
Code-operator requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
requests: 0.01CPU / 64Mb
limits: 0.5CPU / 128Mb
Registry* requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 1CPU / 1Gb
limits: 1.5CPU / 2Gb
Pages* requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 2Gb
requests: 0.9CPU / 1Gb
limits: 1.5CPU / 3Gb
requests: 0.9CPU / 2Gb
limits: 1.5CPU / 4Gb
Mailroom* requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
requests: 0.05CPU / 150Mb
limits: 0.25CPU / 0.5Gb
HAProxy* requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.25CPU / 128Mb
limits: 0.5CPU / 256Mb
requests: 0.5CPU / 256Mb
limits: 1CPU / 512Mb
requests: 0.75CPU / 512Mb
limits: 1.5CPU / 1Gb
Всего(Мин компоненты) requests: 6CPU / 10.5Gb
limits: 8CPU / 14.5Gb
requests: 6CPU / 10Gb
limits: 8CPU / 14Gb
requests: 7CPU / 11.5Gb
limits: 9CPU / 15.5Gb
requests: 8.5CPU / 15Gb
limits: 10.5CPU / 18Gb
requests: 13.5CPU / 28.5Gb
limits: 16CPU / 32Gb
requests: 15.5CPU / 31.5Gb
limits: 17.5CPU / 34Gb
Всего(Все компоненты) requests: 8CPU / 12.5Gb
limits: 12CPU / 19.5Gb
requests: 8CPU / 12Gb
limits: 12CPU / 19Gb
requests: 9CPU / 13.5Gb
limits: 13CPU / 20.5Gb
requests: 10.5CPU / 17Gb
limits: 14.5CPU / 23Gb
requests: 15.75CPU / 30.6Gb
limits: 20CPU / 38.3Gb
requests: 18CPU / 34.9Gb
limits: 22CPU / 41.8Gb

Опциональные компоненты отмечены в таблице символом *.

Автоматическое масштабирование (HA-режим)

В HA-режиме для ключевых компонентов настраивается HPA. Для некоторых профилей targetUserCount заданы отдельные лимиты на максимальное количество реплик:

Пользователи/Компонент 100 300 500 1000 3000 5000
Webservice default 2 2 2 4 5 6
Sidekiq 2 2 2 4 8 12
Shell 2 2 2 4 6 12
HAProxy* 2 2 2 2 3 4
Registry* 2 2 2 3 5 8
Pages* 2 2 2 3 6 6

Опциональные компоненты отмечены в таблице символом *.

Настройка масштабирования ресурсов хранилища Git

Если вы видите непустую таблицу ‘OOM events’ в Grafana или срабатывающий алерт GitalyCgroupMemoryOOM в Prometheus, вероятно, вам нужно скорректировать ресурсы памяти и CPU для Gitaly. Увеличьте значения spec.gitData.resources в вашей конфигурации (например, установите память на 16Gi и CPU на 4). Примените изменения и наблюдайте за Gitaly.


При масштабировании Git-хранилища важно учитывать следующий приоритет параметров:

  1. Явно заданные ресурсы в spec.gitData.resources
  2. Значение spec.scaling.targetUserCount (используется для автоматического расчёта ресурсов по таблице)

Пример 1:

`spec.gitData.resources.cpu`: 1  
`spec.gitData.resources.memory`: 1Gi  
`spec.scaling.targetUserCount`: 3000

Согласно таблице рекомендуемых ресурсов (описанной выше), ожидаемый результат при targetUserCount = 3000:

  • memory: 4Gi
  • cpu: 2

Однако из-за приоритета явно заданных значений фактический результат будет:

  • memory: 1Gi
  • cpu: 1

💡 Примечание: если явно указан параметр в spec.gitData.resources, он всегда имеет приоритет над автоматическим расчётом.


Пример 2:

`spec.gitData.resources.cpu`: 5  
`spec.gitData.resources.memory`: ***намеренно не указан***  
`spec.scaling.targetUserCount`: 3000

Согласно таблице, ожидаемый результат при targetUserCount = 3000:

  • memory: 4Gi
  • cpu: 2

Но поскольку:

  • spec.gitData.resources.cpu задан явно → используется значение 5,
  • spec.gitData.resources.memory не указан → используется значение из таблицы (4Gi),

фактический результат будет:

  • memory: 4Gi (из таблицы)
  • cpu: 5 (из spec.gitData.resources.cpu)

💡 Важно: если какой-либо ресурс (CPU или память) не указан в spec.gitData.resources, для него применяется значение из таблицы масштабирования.