Work in Progress: This page is under development. Use the feedback button on the bottom right to help us improve it.

Helm Installation

Deploy Laminar to Kubernetes using Helm charts.

Prerequisites

  • Kubernetes 1.26+
  • Helm 3.12+
  • kubectl configured for your cluster
  • PV provisioner support (for RocksDB storage)

Chart Overview

Laminar uses multiple Helm charts for different components:

ChartDescriptionNamespace
laminar-depsInfrastructure dependencies (ingress controller)laminar-deps
laminar-coreCore stream processing enginetenant-{name}
laminar-monitoringObservability stack (Grafana, GrepTimeDB, Vector)laminar-monitoring
laminar-productWeb console UIlaminar-product
laminar-connectorsExternal connector serviceslaminar-connectors

Installation

The easiest way to install Laminar is using the provided Taskfile:

cd laminar-infra/k8s
 
# Install dependencies (ingress controller)
task install-deps ENV=eks
 
# Install monitoring stack
task install-monitoring ENV=eks
 
# Install product UI
task install-product ENV=eks
 
# Install core for a tenant
task install-core ENV=eks TENANT=e6data
 
# Install all at once
task install-all ENV=eks TENANT=e6data

Manual Installation

Step 1: Install Dependencies

cd laminar-infra/k8s
 
# Update chart dependencies
helm dependency update ./laminar-deps
 
# Install
helm upgrade --install laminar-deps ./laminar-deps \
  -n laminar-deps \
  --create-namespace \
  -f ./laminar-deps/values-eks.yaml \
  --timeout 5m
 
# Wait for ingress controller
kubectl rollout status deployment/laminar-deps-ingress-nginx-controller \
  -n laminar-deps --timeout=180s

Step 2: Install Monitoring

helm dependency update ./laminar-monitoring
 
helm upgrade --install laminar-monitoring ./laminar-monitoring \
  -n laminar-monitoring \
  --create-namespace \
  -f ./laminar-monitoring/values-eks.yaml \
  --timeout 10m

Step 3: Install Product UI

helm upgrade --install laminar-product ./laminar-product \
  -n laminar-product \
  --create-namespace \
  -f ./laminar-product/values-eks.yaml

Step 4: Install Core Engine

# For a specific tenant
helm upgrade --install laminar-core ./laminar-core \
  -n tenant-e6data \
  --create-namespace \
  -f ./laminar-core/values-eks.yaml \
  -f ./laminar-core/tenants/e6data/values-eks.yaml

Chart Values

laminar-core

# Web UI Console
console:
  image:
    repository: 792306802931.dkr.ecr.us-east-1.amazonaws.com/laminar/console
    tag: "latest"
  service:
    type: ClusterIP
    port: 3000
  resources:
    limits:
      memory: 128Mi
      cpu: 100m
  # GrepTimeDB URL for metrics/logs
  greptimeUrl: "http://greptimedb-standalone.laminar-monitoring:4000"
  # Grafana URL
  grafanaUrl: "http://grafana.laminar-monitoring:80"
  # Google OAuth (optional)
  auth:
    googleClientId: ""
    googleClientSecret: ""
 
# Stream Processing Engine
engine:
  # S3 path for compiler artifacts
  artifactUrl: "s3://laminar-artifacts/"
  # S3 path for checkpoints
  checkpointUrl: "s3://laminar-checkpoints/"
 
  image:
    repository: 792306802931.dkr.ecr.us-east-1.amazonaws.com/laminar/backend
    tag: "latest"
 
  # Controller configuration
  controller:
    resources:
      limits:
        memory: 256Mi
        cpu: 500m
    service:
      grpcPort: 8001
      compilerPort: 8002
      adminPort: 8004
      httpPort: 8000
 
  # Worker configuration
  worker:
    resources:
      limits:
        memory: 2Gi
        cpu: 2000m
    slots: 2
 
  # S3 configuration
  s3:
    region: "us-east-1"
 
# Ingress configuration
ingress:
  enabled: false
  className: nginx
  host: laminar.local
  # AWS ALB configuration
  alb:
    enabled: false
    certificateArn: ""
    scheme: internet-facing

laminar-monitoring

# Grafana
grafana:
  enabled: true
  adminPassword: "laminar"
  datasources:
    datasources.yaml:
      apiVersion: 1
      datasources:
        - name: Laminar-Metrics
          type: prometheus
          url: http://greptimedb-standalone:4000/v1/prometheus
        - name: GrepTimeDB-Logs
          type: mysql
          url: greptimedb-standalone:4002
          database: laminar_logs
 
# GrepTimeDB
greptimedb:
  enabled: true
  standalone:
    resources:
      requests:
        cpu: 500m
        memory: 1Gi
 
# Vector
vector:
  enabled: true
 
# Kubernetes metrics
kubeStateMetrics:
  enabled: true
 
nodeExporter:
  enabled: true
 
# Cost monitoring
opencost:
  enabled: true

Post-Installation

Verify Installation

# Check all pods
kubectl get pods -n laminar-deps
kubectl get pods -n laminar-monitoring
kubectl get pods -n laminar-product
kubectl get pods -n tenant-e6data
 
# Check services
kubectl get svc -A | grep laminar

Access the UI

# Port-forward the console
kubectl port-forward -n laminar-product svc/laminar-product-console 3000:3000
 
# Open http://localhost:3000

Access Grafana

# Port-forward Grafana
kubectl port-forward -n laminar-monitoring svc/laminar-monitoring-grafana 3001:80
 
# Open http://localhost:3001
# Default credentials: admin / laminar

Multi-Tenancy

Laminar supports multi-tenant deployments where each tenant gets their own namespace:

# Create tenant-specific values
mkdir -p laminar-core/tenants/acme
 
# Create values.yaml for the tenant
cat > laminar-core/tenants/acme/values.yaml <<EOF
console:
  authUrl: "https://acme.laminar.example.com"
engine:
  artifactUrl: "s3://laminar-artifacts/acme/"
  checkpointUrl: "s3://laminar-checkpoints/acme/"
EOF
 
# Install for the new tenant
task install-core ENV=eks TENANT=acme

Uninstall

# Uninstall all components
task uninstall-all TENANT=e6data
 
# Or manually:
helm uninstall laminar-core -n tenant-e6data
helm uninstall laminar-product -n laminar-product
helm uninstall laminar-monitoring -n laminar-monitoring
helm uninstall laminar-deps -n laminar-deps
 
# Delete namespaces
kubectl delete namespace tenant-e6data laminar-product laminar-monitoring laminar-deps

Next Steps