Install Self-hosted Signoz on Kubernetes cluster


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


Leave a Reply