The module lifecycle stage: General 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(10exists 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 overspec.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
targetUserCountfor 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: 10is 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:
spec.gitData.resourcesspec.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: 4Gicpu: 2
However, due to parameter precedence, the actual result will be:
memory: 1Gicpu: 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: 4Gicpu: 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 (fromspec.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.