The module lifecycle stageGeneral Availability

This document explains how the Code module sizes and scales Kubernetes workloads based on CodeInstance scaling settings.

Key parameters

  • spec.scaling.targetUserCount: sizing profile (expected user load). Supported values: 100, 1000, 3000, 5000 (10 exists for internal development use only; see warning below).
  • spec.scaling.highAvailability: HA mode switch. When enabled, the operator creates and configures autoscaling and disruption-protection resources (see next section).
  • spec.gitData.resources: manual override for Gitaly CPU/memory (takes precedence over spec.scaling.targetUserCount).
  • spec.gitData.replicas: Gitaly replicas in HA mode (optional; if not set, the operator uses defaults for HA).

How HA and performance are achieved (what the operator configures)

When HA mode is enabled (spec.scaling.highAvailability: true), the operator uses standard Kubernetes primitives to improve resiliency and keep the system responsive under load:

  • Multiple replicas (Deployments/StatefulSets): services run with more than one replica, so a single Pod/Node failure does not stop the service.
  • Horizontal Pod Autoscaler (HPA): automatically increases/decreases replicas based on CPU metrics; tuned per targetUserCount for key components. This provides extra throughput during peaks without permanently overprovisioning.
  • PodDisruptionBudget (PDB): limits how many Pods can be evicted during voluntary disruptions (node drain, upgrades), reducing the risk of downtime during maintenance.
  • Pod anti-affinity (preferred): Pods are preferably spread across nodes (by kubernetes.io/hostname) to reduce blast radius of node failures and avoid contention/noisy-neighbor effects when there are enough nodes.

When HA mode is disabled, the operator keeps a simpler “standalone” topology (single replica for many services) and removes HPA/PDB objects.

Warning Any “burstable” instance types in cloud infrastructure are not recommended due to inconsistent performance.

spec.scaling.targetUserCount: 10 is intended exclusively for internal use by developers. Using this value in any other environments is not recommended and may lead to system instability or unexpected behavior.

Sizing reference (resources)

All calculations are based on spec.scaling.targetUserCount.

The tables below show resources for a single replica of each component. In HA mode, plan for at least 2 replicas for horizontally-scaled services (i.e. at least ~2× capacity vs. “one replica” numbers), plus headroom for autoscaling.

Standalone mode (spec.scaling.highAvailability: false)

Users/Component 100 300 500 1000 3000 5000
Webservice default requests: 3CPU / 6Gb
limits: 3CPU / 6Gb
3 worker, 8 thread
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 worker, 8 thread
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 worker, 8 thread
requests: 6CPU / 10Gb
limits: 6CPU / 10Gb
6 worker, 8 thread
requests: 8CPU / 13Gb
limits: 8CPU / 13Gb
8 worker, 8 thread
requests: 10CPU / 16Gb
limits: 10CPU / 16Gb
10 worker, 8 thread
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
Total(Min components) 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
Total(All components) 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 mode (spec.scaling.highAvailability: true)

Users/Component 100 300 500 1000 3000 5000
Webservice default requests: 3CPU / 6Gb
limits: 3CPU / 6Gb
3 worker, 8 thread
requests: 3CPU / 5.5Gb
limits: 3CPU / 5.5Gb
3 worker, 8 thread
requests: 4CPU / 7Gb
limits: 4CPU / 7Gb
4 worker, 8 thread
requests: 5CPU / 8.5Gb
limits: 5CPU / 8.5Gb
5 worker, 8 thread
requests: 6CPU / 10Gb
limits: 6CPU / 10Gb
6 worker, 8 thread
requests: 8CPU / 13Gb
limits: 8CPU / 13Gb
8 worker, 8 thread
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
Total(Min components) 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
Total(All components) 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

Optional components are marked with *.

Autoscaling (HA mode)

In HA mode, key components are configured with HPA. Some targetUserCount profiles have specific max replica limits.

Users/Component 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

Optional components are marked with *.

Tuning Git storage (Gitaly)

If you see a non-empty ‘OOM events’ table in Grafana or a firing GitalyCgroupMemoryOOM alert in Prometheus, you likely need to adjust the memory and CPU resources for Gitaly. Increase the spec.gitData.resources in your configuration ( e.g., set memory to 16Gi and CPU to 4). After updating, apply the changes and monitor Gitaly for improvements.

When scaling Git storage, the following parameter precedence must be observed:

  1. spec.gitData.resources
  2. spec.scaling.targetUserCount

Example 1:

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

Based on the resource table described above, we would expect:

  • memory: 4Gi
  • cpu: 2

However, due to parameter precedence, the actual result will be:

  • memory: 1Gi
  • cpu: 1

💡 Note: When a parameter is explicitly set in spec.gitData.resources, it always takes precedence over the automatic calculation.


Example 2:

`spec.gitData.resources.cpu`: 5  
`spec.gitData.resources.memory`: ***intentionally omitted***  
`spec.scaling.targetUserCount`: 3000

Based on the resource table described above, we would expect:

  • memory: 4Gi
  • cpu: 2

However, because of parameter precedence—and since spec.gitData.resources.memory was not specified—the actual result will be:

  • memory: 4Gi (from the scaling table)
  • cpu: 5 (from spec.gitData.resources.cpu)

💡 Important: If any resource (CPU or memory) is not specified in spec.gitData.resources, the value from the scaling table is applied.

For other profiles/components, the operator may use default HPA min/max values.