Platform Services
This document describes the long-lived services in Layer 3 of the floe architecture.
Service Categories
Section titled “Service Categories”┌─────────────────────────────────────────────────────────────────────────┐│ PLATFORM SERVICES (Layer 3) ││ ││ ┌─────────────────────────────────────────────────────────────────────┐││ │ ORCHESTRATOR (Plugin) │││ │ Reference: Dagster │ Alternatives: Airflow, Prefect │││ │ │││ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │││ │ │ Webserver │ │ Daemon │ │ PostgreSQL │ │││ │ │ (Deployment) │ │ (Deployment) │ │ (StatefulSet) │ │││ │ └────────────────┘ └────────────────┘ └────────────────┘ │││ └─────────────────────────────────────────────────────────────────────┘││ ││ ┌─────────────────────────────────────────────────────────────────────┐││ │ CATALOG (Plugin) │││ │ Reference: Polaris │ Alternatives: AWS Glue, Hive, Nessie │││ │ │││ │ ┌────────────────┐ ┌────────────────┐ │││ │ │ Polaris API │ │ PostgreSQL │ │││ │ │ (Deployment) │ │ (StatefulSet) │ │││ │ └────────────────┘ └────────────────┘ │││ └─────────────────────────────────────────────────────────────────────┘││ ││ ┌─────────────────────────────────────────────────────────────────────┐││ │ SEMANTIC LAYER (Plugin) │││ │ Reference: Cube │ Alternatives: dbt Semantic Layer, None │││ │ │││ │ ┌────────────────┐ ┌────────────────┐ │││ │ │ Cube Server │ │ Redis │ │││ │ │ (Deployment) │ │ (StatefulSet) │ │││ │ └────────────────┘ └────────────────┘ │││ └─────────────────────────────────────────────────────────────────────┘││ ││ ┌─────────────────────────────────────────────────────────────────────┐││ │ OBSERVABILITY (Enforced) │││ │ OpenTelemetry + OpenLineage │││ │ │││ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │││ │ │ OTLP Collector │ │ Prometheus │ │ Grafana │ │││ │ │ (Deployment) │ │ (StatefulSet) │ │ (Deployment) │ │││ │ └────────────────┘ └────────────────┘ └────────────────┘ │││ └─────────────────────────────────────────────────────────────────────┘││ ││ ┌─────────────────────────────────────────────────────────────────────┐││ │ STORAGE │││ │ Object Storage + OCI Registry │││ │ │││ │ ┌────────────────┐ ┌────────────────┐ │││ │ │ MinIO │ │ OCI Registry │ │││ │ │ (StatefulSet) │ │ (External) │ │││ │ └────────────────┘ └────────────────┘ │││ └─────────────────────────────────────────────────────────────────────┘│└─────────────────────────────────────────────────────────────────────────┘Service Specifications
Section titled “Service Specifications”Orchestrator Services
Section titled “Orchestrator Services”| Service | K8s Resource | Purpose | Dependencies |
|---|---|---|---|
| Dagster Webserver | Deployment | UI, API | PostgreSQL |
| Dagster Daemon | Deployment | Scheduling, sensors | PostgreSQL |
| PostgreSQL | StatefulSet | Job history, state | PVC |
Resource Allocation:
webserver: replicas: 2 resources: requests: { cpu: 500m, memory: 512Mi } limits: { cpu: 1000m, memory: 1Gi }
daemon: replicas: 1 resources: requests: { cpu: 250m, memory: 256Mi } limits: { cpu: 500m, memory: 512Mi }Catalog Services
Section titled “Catalog Services”| Service | K8s Resource | Purpose | Dependencies |
|---|---|---|---|
| Polaris Server | Deployment | Iceberg catalog API | PostgreSQL |
| PostgreSQL | StatefulSet | Catalog metadata | PVC |
Endpoints:
- REST API:
http://polaris.floe-platform.svc.cluster.local:8181 - Iceberg catalog URI:
http://polaris.floe-platform.svc.cluster.local:8181/api/catalog
Semantic Layer Services
Section titled “Semantic Layer Services”| Service | K8s Resource | Purpose | Dependencies |
|---|---|---|---|
| Cube Server | Deployment | Semantic layer API | Redis, Catalog |
| Redis | StatefulSet | Query cache | PVC |
Endpoints:
- REST API:
http://cube.floe-platform.svc.cluster.local:4000 - GraphQL:
http://cube.floe-platform.svc.cluster.local:4000/cubejs-api/graphql
Observability Services
Section titled “Observability Services”| Service | K8s Resource | Purpose | Dependencies |
|---|---|---|---|
| OTLP Collector | Deployment | Telemetry collection | None |
| Prometheus | StatefulSet | Metrics storage | PVC |
| Grafana | Deployment | Dashboards | Prometheus |
Telemetry Flow:
Jobs → OTLP Collector → Prometheus (metrics) → Jaeger/Grafana Tempo (traces) → Loki (logs)Storage Services
Section titled “Storage Services”| Service | K8s Resource | Purpose | Dependencies |
|---|---|---|---|
| MinIO | StatefulSet | Object storage (Iceberg data) | PVC |
| OCI Registry | External | Platform artifacts | External |
Deployment
Section titled “Deployment”Deploy All Services
Section titled “Deploy All Services”# Deploy all platform servicesfloe platform deploy
# Output:Deploying platform services to namespace: floe-platform ✓ Namespace created ✓ PostgreSQL (orchestrator-db): StatefulSet 1/1 ready ✓ PostgreSQL (catalog-db): StatefulSet 1/1 ready ✓ Redis (semantic-cache): StatefulSet 1/1 ready ✓ MinIO: StatefulSet 4/4 ready ✓ Polaris: Deployment 2/2 ready ✓ Dagster webserver: Deployment 2/2 ready ✓ Dagster daemon: Deployment 1/1 ready ✓ Cube: Deployment 2/2 ready ✓ OTLP Collector: Deployment 2/2 ready
Platform services deployed successfully!Deploy Specific Component
Section titled “Deploy Specific Component”floe platform deploy --component=orchestratorfloe platform deploy --component=catalogfloe platform deploy --component=semanticfloe platform deploy --component=observabilityCheck Status
Section titled “Check Status”floe platform status
# Output:Platform: acme-data-platform v1.2.3Namespace: floe-platform
Services: orchestrator: webserver: 2/2 ready (healthy) daemon: 1/1 ready (healthy) database: 1/1 ready catalog: polaris: 2/2 ready (healthy) database: 1/1 ready semantic: cube: 2/2 ready (healthy) cache: 1/1 ready observability: otlp-collector: 2/2 ready prometheus: 1/1 ready grafana: 1/1 readyHealth Checks
Section titled “Health Checks”All services expose health endpoints:
livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10
readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5Startup Order
Section titled “Startup Order”Services start in dependency order:
- Storage (MinIO, PostgreSQL instances)
- Catalog (Polaris) - depends on PostgreSQL
- Observability (OTLP Collector, Prometheus)
- Orchestrator (Dagster) - depends on PostgreSQL
- Semantic Layer (Cube) - depends on Catalog
Scaling
Section titled “Scaling”Horizontal Pod Autoscaler
Section titled “Horizontal Pod Autoscaler”apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: dagster-webserverspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: dagster-webserver minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70StatefulSet Considerations
Section titled “StatefulSet Considerations”Databases (PostgreSQL, Redis) use StatefulSets and typically don’t autoscale:
- Use vertical scaling (increase resources)
- Consider managed services for production (RDS, ElastiCache)
Networking
Section titled “Networking”Service Discovery
Section titled “Service Discovery”All services use K8s DNS:
<service>.<namespace>.svc.cluster.localExamples:
dagster-webserver.floe-platform.svc.cluster.local:3000polaris.floe-platform.svc.cluster.local:8181cube.floe-platform.svc.cluster.local:4000
Ingress
Section titled “Ingress”services: orchestrator: ingress: enabled: true host: dagster.platform.example.com catalog: ingress: enabled: true host: catalog.platform.example.com