Ultipa supports native Kubernetes deployment via:
The deployment architecture consists of:
Install from a local chart with a minimal single-node setup:
Bashhelm install my-cluster ./ultipa-helm-chart \ --set shards.count=1 \ --set metaServer.replicas=1 \ --set nameServer.replicas=1
Production deployment with high availability:
Bashhelm install prod-cluster ./ultipa-helm-chart \ --set shards.count=3 \ --set shards.replicasPerShard=3 \ --set metaServer.replicas=3 \ --set nameServer.replicas=2 \ --set nameServer.service.type=LoadBalancer
Parameter | Default | Description |
|---|---|---|
metaServer.replicas | 3 | Meta server replicas. Use an odd number for Raft consensus. |
nameServer.replicas | 2 | Name server replicas. |
shards.count | 1 | Number of shard groups. |
shards.replicasPerShard | 1 | Raft replicas per shard group. |
shards.storage.dataSize | 100Gi | Persistent volume size for shard data. |
nameServer.service.type | ClusterIP | Service type for the name server. Set to LoadBalancer for external access. |
hdcServer.enabled | false | Enables HDC server deployment. |
monitoring.prometheus.serviceMonitor.enabled | false | Creates a Prometheus ServiceMonitor resource. |
| Resource | Type | Purpose |
|---|---|---|
| Meta server | StatefulSet | Meta server Raft cluster with persistent storage. |
| Shard server | StatefulSet (per shard) | Shard server Raft groups with persistent storage. |
| Name server | Deployment | Stateless name server as the client endpoint. |
| Shard register job | Job (Helm hook) | Automatically registers shards after installation. |
| PodDisruptionBudget | PDB | Ensures high availability during node maintenance. |
| ServiceMonitor | ServiceMonitor | Prometheus metrics integration (optional). |
Each server exposes HTTP health endpoints for Kubernetes probes:
| Server | Endpoint | Purpose |
|---|---|---|
| All servers | /health | Liveness probe. Returns {"status": "UP"}. |
| Name server | /ready | Readiness probe. Returns cluster status including shard count, active sessions, and disk usage. |
| Shard server | /ready | Readiness probe. Returns shard ID and Raft readiness. |
| Meta server | /ready | Readiness probe. Returns leader status. |
The Ultipa Operator manages the full lifecycle of Ultipa clusters through a custom resource definition (CRD).
Bash# Install CRD kubectl apply -f config/crd/bases/ # Deploy Operator kubectl apply -f config/rbac/ kubectl apply -f config/manager/
Define a cluster using the UltipaCluster CRD:
YAMLapiVersion: ultipa.com/v1alpha1 kind: UltipaCluster metadata: name: my-cluster spec: version: "5.3.0" image: graphdb: "<your-registry>/ultipa-server:5.3.0" meta: "<your-registry>/ultipa-meta:5.3.0" metaServer: replicas: 3 storage: { size: "10Gi" } nameServer: replicas: 2 shards: - shardId: 1 replicas: 3 storage: { dataSize: "100Gi", backupSize: "50Gi" } auth: rootPassword: "root"
Apply the resource:
Bashkubectl apply -f my-cluster.yaml
spec.version — the Operator updates images across all components.kubectl get ultipacluster.Bashkubectl get ultipacluster
NAME PHASE READY TOTAL VERSION AGE
my-cluster Running 8 8 5.3.0 2h
The PHASE field indicates the cluster state: Pending, Forming, Running, or Degraded.
To test a deployment locally using minikube or kind:
Bashminikube start --cpus=4 --memory=16g # Load Ultipa images minikube image load ultipa-server:5.3.0 minikube image load ultipa-meta:5.3.0 # Deploy helm install test ./ultipa-helm-chart \ --set shards.count=1 \ --set metaServer.replicas=1 \ --set nameServer.replicas=1 # Verify pods are running kubectl get pods # Access the cluster kubectl port-forward svc/test-ultipa-name 60061:60061
Ultipa supports Kubernetes HPA (HorizontalPodAutoscaler) for the Name Server, which is stateless and suitable for horizontal scaling.
Enable auto-scaling in the Helm chart values:
Bashhelm install ultipa ./ultipa-helm-chart \ --set nameServer.autoscaling.enabled=true \ --set nameServer.autoscaling.minReplicas=2 \ --set nameServer.autoscaling.maxReplicas=10
Parameter | Default | Description |
|---|---|---|
nameServer.autoscaling.enabled | false | Enables HPA for the Name Server. |
nameServer.autoscaling.minReplicas | 2 | Minimum number of Name Server replicas. |
nameServer.autoscaling.maxReplicas | 10 | Maximum number of Name Server replicas. |
nameServer.autoscaling.targetCPUUtilizationPercentage | 70 | CPU utilization target for scaling. |
nameServer.autoscaling.targetMemoryUtilizationPercentage | 80 | Memory utilization target for scaling. |
When auto-scaling is enabled, the Deployment's replicas field is omitted and managed by the HPA.
Add the autoScaling field to the nameServer spec:
YAMLapiVersion: ultipa.com/v1alpha1 kind: UltipaCluster metadata: name: my-cluster spec: nameServer: autoScaling: enabled: true minReplicas: 2 maxReplicas: 10 targetCPUPercent: 70 targetMemoryPercent: 80
For custom metric-based scaling, Ultipa supports KEDA (Kubernetes Event-Driven Autoscaling) using the ultipa_query_queue_depth Prometheus metric:
YAML# values.yaml nameServer: autoscaling: customMetrics: enabled: true prometheusAddress: "http://prometheus:9090" activeQueriesPerReplica: 50
NOTEHPA and KEDA are mutually exclusive. Enable only one at a time.
When a Name Server pod is terminated:
CREATE BACKUP via GQL manually.RollingUpdate strategy.