TVL Managed Superset

Deploy Apache Superset on Kubernetes: Step-by-Step 2026 Guide

Install Apache Superset on Kubernetes with Helm: prerequisites, configuration, scaling, security, and production best practices.

Kubernetes has become in 2026 the default deployment mode for Apache Superset in production: native high availability, horizontal scaling, rolling updates, managed secrets. The Apache Foundation maintains an official Helm chart that considerably simplifies installation. This article describes the target architecture, the step-by-step installation with Helm, configuration adjustments for production, and the pitfalls to avoid.

1. Why Kubernetes for Apache Superset

On Docker Compose, scaling Superset means manually adding containers, configuring a load balancer, managing persistent volumes by hand. On Kubernetes, the official Helm chart applies best practices directly: stateless Superset pods, separate Celery worker deployment, single beat scheduler, PVC for Postgres and Redis, ingress with automatic TLS via cert-manager.

If you want to avoid this complexity, TVL Managed Superset deploys a ready-to-use instance in less than 3 minutes, with the entire Kubernetes stack provisioned and maintained. But if you insist on self-hosting, Helm is the cleanest path.

2. Target architecture

The official apache/superset Helm chart typically deploys the following resources:

ComponentKubernetes typeRecommended replicas
Superset webDeployment + Service2-3
Superset worker (Celery)Deployment2
Superset worker beatDeployment1 (singleton)
Superset init jobJob (one-shot)
PostgreSQL (sub-chart)StatefulSet + PVC1 (or external)
Redis (sub-chart)StatefulSet + PVC1 (or external)
IngressIngress + cert-manager

3. Prerequisites

  • A Kubernetes 1.28+ cluster (tested on 1.34 at OVH Managed Kubernetes).
  • kubectl 1.28+ and helm 3.13+ (Helm 4 works but renamed some flags).
  • An available StorageClass (OVH case: csi-cinder-high-speed).
  • An installed ingress controller (ingress-nginx preferred).
  • cert-manager with a Let's Encrypt ClusterIssuer if you want automatic TLS.
  • A domain pointing to the ingress IP.

4. Add the Helm repo

helm repo add superset https://apache.github.io/superset
helm repo update
helm search repo superset/superset --versions | head -10

At time of writing, the stable chart version is 0.15.2 bundling Superset application 5.0.0. Always pin the version explicitly.

5. Minimal installation

For a quick start in a dedicated namespace:

kubectl create namespace superset
helm install superset superset/superset \
  --namespace superset \
  --version 0.15.2 \
  --set redis.enabled=true \
  --set postgresql.enabled=true \
  --timeout 10m

Check that all pods are Running:

kubectl get pods -n superset
# superset-postgresql-0          1/1   Running
# superset-redis-master-0        1/1   Running
# superset-init-db-...           0/1   Completed
# superset-849f...               1/1   Running
# superset-worker-...            1/1   Running
# superset-worker-beat-...       1/1   Running

UI accessible via port-forward while you configure ingress:

kubectl port-forward -n superset svc/superset 8088:8088

6. Custom values.yaml

In production, never launch with default values. Here's a minimal but sane values.yaml:

image:
  repository: apache/superset
  tag: "5.0.0"

# External domain
ingress:
  enabled: true
  ingressClassName: nginx
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
  hosts:
    - bi.example.com
  tls:
    - secretName: superset-tls
      hosts:
        - bi.example.com

# Replicas
supersetNode:
  replicaCount: 2
  resources:
    requests: { cpu: 250m, memory: 1Gi }
    limits:   { cpu: 1000m, memory: 2Gi }

supersetWorker:
  replicaCount: 2
  resources:
    requests: { cpu: 250m, memory: 1Gi }

# Secrets injected via pre-created K8s secret
supersetSecretsExtra:
  - existingSecret: superset-secrets
    keys: [SUPERSET_SECRET_KEY]

# Bootstrap: connector and driver additions
bootstrapScript: |
  #!/bin/bash
  set -eu
  uv pip install psycopg2-binary clickhouse-connect snowflake-sqlalchemy authlib

# External DB and Redis (recommended in prod)
postgresql:
  enabled: false
redis:
  enabled: false

supersetNode:
  connections:
    db_host: "postgres.example.com"
    db_port: 5432
    db_user: superset
    db_pass: "${POSTGRES_PASSWORD}"
    db_name: superset
    redis_host: "redis.example.com"
    redis_port: 6379

7. The psycopg driver trap

The apache/superset:5.0.0 image embeds Python 3.10 in a uv venv, without psycopg2 by default. If you use Postgres as metadata DB (typical case), add the driver via bootstrapScript with uv pip install and not pip install — otherwise the module installs outside the venv and isn't found by Superset.

bootstrapScript: |
  #!/bin/bash
  set -eu
  uv pip install psycopg2-binary authlib

Also, SQLAlchemy 1.4 in this image only knows the psycopg2 dialect (not psycopg v3). The URI must remain postgresql+psycopg2://..., which is the chart's default.

8. Bitnami → bitnamilegacy

Since August 2025, Bitnami removed most of its images from the public docker.io/bitnami/* registry. The Superset chart 0.15.2 still references the old repo for Postgres and Redis sub-charts. If you enable these sub-charts in cluster, override the image to docker.io/bitnamilegacy/*:

postgresql:
  image:
    registry: docker.io
    repository: bitnamilegacy/postgresql
    tag: 14.17.0-debian-12-r3
redis:
  image:
    registry: docker.io
    repository: bitnamilegacy/redis
    tag: 7.0.10-debian-11-r4

Otherwise you get ImagePullBackOffs that aren't immediately explicit.

9. Secret management

Never commit Superset's SECRET_KEY, Postgres credentials, or API keys in values.yaml. Use a pre-created Kubernetes Secret:

kubectl create secret generic superset-secrets \
  -n superset \
  --from-literal=SUPERSET_SECRET_KEY="$(openssl rand -base64 42)" \
  --from-literal=POSTGRES_PASSWORD="$(openssl rand -base64 24)"

To go further, integrate External Secrets Operator with an external vault (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault).

10. Ingress, TLS and cert-manager

For automatic TLS with Let's Encrypt, create a ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: ops@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: nginx

Once in place, the annotation cert-manager.io/cluster-issuer: letsencrypt-prod on the Ingress is enough to provision the certificate automatically. This configuration is automatically managed by TVL Managed Superset.

11. Horizontal scaling

The Superset web pod is stateless (sessions in Redis), so horizontal scaling is painless. To automate:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: superset-web
  namespace: superset
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: superset
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target: { type: Utilization, averageUtilization: 70 }

Same for the Celery worker. The beat (scheduler), however, remains a singleton. See our article on Superset HA architecture.

12. Rolling updates

Helm handles rolling updates automatically. To upgrade:

helm upgrade superset superset/superset \
  -n superset \
  -f values.yaml \
  --version 0.16.0 \
  --timeout 10m

The superset-init job applies Alembic migrations. Always backup Postgres before upgrading and test in staging first.

13. Monitoring and logs

Superset exposes Prometheus metrics since 4.x via a /metrics endpoint enabled by the STATSD feature flag. For log centralization, two approaches:

  • Loki + Promtail: pod log retrieval, Grafana-style querying.
  • ELK / OpenSearch: full-text indexing, heavier but feature-rich.

Don't forget: also centralize Superset audit logs (who saw which dashboard, who ran which query). See our article on Superset monitoring with Prometheus + Grafana.

14. Backups

On Kubernetes, two backup levels:

  1. The Superset metadata PostgreSQL DB: daily pg_dump, stored off-cluster (S3, OVH Cold Archive).
  2. Persistent volumes (PVC): VolumeSnapshot snapshots via Velero or cloud-specific operator.

The simplest in practice is to use a managed external PostgreSQL (OVH Public Cloud Database, AWS RDS, Azure Database) with built-in backups.

15. Common troubleshooting

"psycopg2 module not found"

See section 7 — use uv pip install in bootstrap, not pip install.

Helm release stuck in pending-install

If helm install is interrupted (Ctrl+C, crash), a zombie release persists. To recover: helm uninstall <release> -n <ns> --no-hooks then clean up residual resources with kubectl delete pvc --all -n <ns> if you accept losing data.

PVCs survive helm uninstall

Expected behavior: don't lose data by accident. For a complete wipe: kubectl delete pvc --all -n <ns> after helm uninstall.

Init job fails with timeout

Either the Postgres DB isn't reachable (check credentials and network), or the Alembic migration takes more than 5 minutes (very large existing DB). Increase initJob.activeDeadlineSeconds.

FAQ — Apache Superset Kubernetes

Do you need a dedicated Kubernetes cluster for Superset?

No, Superset cohabits very well with other apps in the same cluster. A dedicated namespace and ResourceQuota/LimitRange suffice for isolation.

What cluster size for 100 users?

Plan 2 vCPU and 4 GB RAM for the Superset application stack (web + worker + beat), plus the database. For 100 users with moderate use, 3 nodes of 4 vCPU/8 GB usually suffice.

Is the Helm chart production-ready?

Yes, it's the chart maintained by the Apache Foundation and used by many companies in production. Some configuration adjustments (cf. this article) remain necessary to move from demo to prod.

Can ArgoCD or Flux be used for GitOps?

Yes without difficulty. The values.yaml is the committed source of truth, ArgoCD applies. Ensure Secrets aren't in the Git repo (use SealedSecrets or ESO).

Conclusion

Kubernetes brings to Apache Superset the operational robustness expected in production: high availability, scaling, rolling updates, managed secrets. The official Helm chart avoids most of the work, but requires some adjustments (psycopg driver, bitnamilegacy image, ingress TLS) that consume several days of fine-tuning the first time.

Want the benefits of Apache Superset without the friction of installation and maintenance? Deploy your instance in 3 clicks with TVL Managed Superset, hosted in Europe (OVHcloud, Roubaix, France), on a managed Kubernetes cluster. For more, see our articles on Docker installation and the Apache Superset production checklist.