This blog post is step-by-step install a self-hosted SigNoz architecture (v0.99+) on Kubernetes cluster using Helm.
If we do not have any other storage class which supports volume expansion, you can patch default storage class definition by setting allowVolumeExpansion to True (this enables PVC resize).
DEFAULT_STORAGE_CLASS=$(kubectl get storageclass -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io/is-default-class=="true")].metadata.name}')
kubectl patch storageclass "$DEFAULT_STORAGE_CLASS" -p '{"allowVolumeExpansion": true}'
The SigNoz Helm chart will install the following components into your Kubernetes cluster:
SigNoz
SigNoz Collector
Clickhouse
Zookeeper
We will extend it to include resource tuning (like the small-prod) for ClickHouse, Zookeeper, Query, Collector, etc – a lightweight and efficient setup π
- Volume: 50 GiB
- Resource limit: 2 vCPU / 4 GiB RAM total
- Log retention: 7 days only
- Environment: MicroK8s single-node (likely on VPS)
| Component | Purpose | CPU | RAM | Storage | Notes |
|---|---|---|---|---|---|
| ClickHouse | Main log DB | 1β1.5 vCPU | 2β3 GiB | 50 Gi | TTL auto-purges logs older than 7 days |
| Zookeeper | ClickHouse coordination | 0.2β0.5 vCPU | 256β512 MiB | 5 Gi | Minimal footprint |
| Postgres (signoz-db) | App metadata | 0.2β0.5 vCPU | 256β512 MiB | 5 Gi | Stores alerts, dashboards |
| Collector + Query + Frontend | Data ingestion & UI | ~0.8 vCPU | ~1 Gi | β | Lightweight limits |
| Total Estimated | β 2 vCPU | β 4 GiB | 60 Gi | Fits your VPS perfectly |
Letβs make a single Helm command that perfectly fits those requirements.
Find a storage class to use in your cluster:
kubectl get storageclass
=> microk8s-hostpath
microk8s helm install signoz signoz/signoz \
--namespace signoz --create-namespace \
--wait --timeout 1h \
-f <(cat <<'EOF'
global:
storageClass: microk8s-hostpath
retentionPeriod: 7d
clickhouse:
installCustomStorageClass: true
replicas: 1
persistence:
enabled: true
size: "50Gi"
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "1"
memory: "2Gi"
# ===========================
# Otel Collector (agent/ingest)
# ===========================
otelCollector:
enabled: true
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
signozDb:
persistence:
size: "5Gi"
resources:
requests:
cpu: "0.2"
memory: "256Mi"
limits:
cpu: "0.5"
memory: "512Mi"
# ===========================
# Query Service (backend API)
# ===========================
queryService:
enabled: true
resources:
requests:
cpu: "200m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
collector:
resources:
requests:
cpu: "0.2"
memory: "256Mi"
limits:
cpu: "0.5"
memory: "512Mi"
# ===========================
# Frontend (React UI)
# ===========================
frontend:
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "300m"
memory: "512Mi"
# ===========================
# Alert Manager
# ===========================
alertmanager:
enabled: true
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
# ===========================
# Kafka & Zookeeper (internal)
# ===========================
zookeeper:
enabled: true
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "300m"
memory: "512Mi"
kafka:
enabled: false # disable Kafka for smaller deployments (Otel pipeline is enough)
# ===========================
# Misc tuning
# ===========================
storage:
retentionPeriod: 7d
EOF
)
We can update the config later with:
microk8s helm upgrade signoz signoz/signoz \
-n signoz \
-f <(cat <<'EOF'
# YAML data
EOF
)
The frontend UI is now served by the same HTTP server that handles API requests, available on port 8080 (previously on port 3301), mean the frontend UI and backend API are unified in the same service (the signoz or signoz-query-service running on port 8080).
microk8s kubectl apply -n signoz -f - <<'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: signoz-ui
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
ingressClassName: nginx
rules:
- host: signoz.nready.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: signoz
port:
number: 8080
EOF
Now, after all it up, we can access the Signoz via browsing to https://signoz.nready.net, set the user and password, the Signoz is ready to use.
Ref:
Next Steps:
Collect Telemetry from your K8s Clusters
Nam Le, Saigon on 30 oct 2025