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:
| Chart | Description | Namespace |
|---|---|---|
laminar-deps | Infrastructure dependencies (ingress controller) | laminar-deps |
laminar-core | Core stream processing engine | tenant-{name} |
laminar-monitoring | Observability stack (Grafana, GrepTimeDB, Vector) | laminar-monitoring |
laminar-product | Web console UI | laminar-product |
laminar-connectors | External connector services | laminar-connectors |
Installation
Using Taskfile (Recommended)
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=e6dataManual 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=180sStep 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 10mStep 3: Install Product UI
helm upgrade --install laminar-product ./laminar-product \
-n laminar-product \
--create-namespace \
-f ./laminar-product/values-eks.yamlStep 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.yamlChart 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-facinglaminar-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: truePost-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 laminarAccess the UI
# Port-forward the console
kubectl port-forward -n laminar-product svc/laminar-product-console 3000:3000
# Open http://localhost:3000Access Grafana
# Port-forward Grafana
kubectl port-forward -n laminar-monitoring svc/laminar-monitoring-grafana 3001:80
# Open http://localhost:3001
# Default credentials: admin / laminarMulti-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=acmeUninstall
# 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-depsNext Steps
- Configuration - Full configuration reference
- Upgrades - Upgrade procedures
- High Availability - HA setup