mirror of
https://github.com/taylanbakircioglu/flowfish.git
synced 2026-09-22 18:43:43 +00:00
4508a756bb
Made-with: Cursor
175 lines
18 KiB
Markdown
175 lines
18 KiB
Markdown
# Flowfish Architecture - Simple Overview
|
|
|
|
## Data Flow Diagram
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ FLOWFISH DATA FLOW │
|
|
│ eBPF-Based Kubernetes Observability │
|
|
└─────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
┌─────────────┐
|
|
│ USER │
|
|
│ (Browser) │
|
|
└──────┬──────┘
|
|
│ HTTP
|
|
▼
|
|
┌──────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ frontend │ │
|
|
│ │ (React + TypeScript) │ │
|
|
│ │ │ │
|
|
│ │ Dashboard │ Clusters │ Analysis Wizard │ Live Map │ Alerts │ │
|
|
│ └──────────────────────────────────────┬──────────────────────────────────────┘ │
|
|
│ │ REST API │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ backend │ │
|
|
│ │ (FastAPI + Python) │ │
|
|
│ │ │ │
|
|
│ │ Auth │ Cluster CRUD │ Analysis API │ Query Proxy │ │
|
|
│ └──────────────────────────────────────┬──────────────────────────────────────┘ │
|
|
│ │ gRPC │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ analysis-orchestrator │ │
|
|
│ │ (gRPC Server + Python) │ │
|
|
│ │ │ │
|
|
│ │ Analysis Lifecycle │ Task Distribution │ State Management │ │
|
|
│ └──────────────────────────────────────┬──────────────────────────────────────┘ │
|
|
│ │ gRPC │
|
|
│ ┌───────────────────────────────────────┼──────────────────────────────────────┐ │
|
|
│ │ cluster-manager│ │ │
|
|
│ │ (gRPC Server :5003) │ │
|
|
│ │ │ │ │
|
|
│ │ K8s API → Namespaces, Pods, Deployments, Labels (Cluster-wide access) │ │
|
|
│ └───────────────────────────────────────┼──────────────────────────────────────┘ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
|
│ │ ingestion-service │ │
|
|
│ │ (gRPC Server + Python) │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
|
│ │ │ Trace Manager │ ─► │ gRPC CLIENT │ ─► │ RabbitMQ Pub │ │ │
|
|
│ │ │ (Lifecycle) │ │ (to Gadget) │ │ (Event Publish) │ │ │
|
|
│ │ └─────────────────┘ └────────┬────────┘ └────────┬────────┘ │ │
|
|
│ └───────────────────────────────────┼─────────────────────┼───────────────────┘ │
|
|
│ │ │ │
|
|
└───────────────────────────────────────┼─────────────────────┼────────────────────────┘
|
|
│ │
|
|
│ gRPC (Pull Events) │ AMQP (Publish)
|
|
▼ ▼
|
|
┌───────────────────────────────────────────────┐ ┌──────────────────────────────────┐
|
|
│ TARGET CLUSTER │ │ rabbitmq │
|
|
│ ┌─────────────────────────────────────────┐ │ │ (Message Queue) │
|
|
│ │ inspektor-gadget │ │ │ │
|
|
│ │ (DaemonSet) │ │ │ flowfish.events.network ───┐ │
|
|
│ │ │ │ │ flowfish.events.dns ───┼─► │
|
|
│ │ eBPF Programs → gRPC Server (:16060) │ │ │ flowfish.events.tcp ───┘ │
|
|
│ │ │ │ │ │
|
|
│ │ Events: network, dns, tcp, process │ │ └──────────────┬───────────────────┘
|
|
│ └─────────────────────────────────────────┘ │ │
|
|
└───────────────────────────────────────────────┘ │ AMQP (Consume)
|
|
│
|
|
┌──────────────┴──────────────┐
|
|
│ │
|
|
▼ ▼
|
|
┌─────────────────────────────┐ ┌─────────────────────────────┐
|
|
│ timeseries-writer │ │ graph-writer │
|
|
│ (RabbitMQ Consumer) │ │ (RabbitMQ Consumer) │
|
|
│ │ │ │
|
|
│ Batch Events → ClickHouse │ │ Build Graph → Neo4j │
|
|
└──────────────┬──────────────┘ └──────────────┬──────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌─────────────────────────────┐ ┌─────────────────────────────┐
|
|
│ clickhouse │ │ neo4j │
|
|
│ (Time-Series Database) │ │ (Graph Database) │
|
|
│ │ │ │
|
|
│ Tables: │ │ Nodes: Pod, Service, NS │
|
|
│ • network_flows │ │ Edges: COMMUNICATES_WITH │
|
|
│ • dns_queries │ │ BELONGS_TO │
|
|
│ • tcp_connections │ │ DEPENDS_ON │
|
|
└──────────────┬──────────────┘ └──────────────┬──────────────┘
|
|
│ │
|
|
└────────────────┬───────────────┘
|
|
│ Query
|
|
▼
|
|
┌─────────────────────────────┐
|
|
│ graph-query │
|
|
│ (Query Service) │
|
|
│ │
|
|
│ Dependency Graph Queries │
|
|
└──────────────┬──────────────┘
|
|
│ gRPC
|
|
▼
|
|
┌─────────────────────────────┐
|
|
│ backend │
|
|
│ (Query Results) │
|
|
└──────────────┬──────────────┘
|
|
│ REST
|
|
▼
|
|
┌─────────────────────────────┐
|
|
│ frontend │
|
|
│ (Live Map / Dashboard) │
|
|
└─────────────────────────────┘
|
|
|
|
|
|
═══════════════════════════════════════════════════════════════════════════════════════
|
|
KEY COMMUNICATION PATTERNS
|
|
═══════════════════════════════════════════════════════════════════════════════════════
|
|
|
|
┌─────────────────────────────────────────────────────────────────────────────────┐
|
|
│ PROTOCOL │ SOURCE │ TARGET │ DIRECTION │
|
|
├─────────────────┼─────────────────────┼──────────────────────┼──────────────────┤
|
|
│ REST/HTTP │ frontend │ backend │ Request/Response │
|
|
│ gRPC │ backend │ analysis-orchestrator│ Request/Response │
|
|
│ gRPC │ analysis-orchestrator│ ingestion-service │ Request/Response │
|
|
│ gRPC │ ingestion-service │ inspektor-gadget │ Stream (PULL) │
|
|
│ AMQP │ ingestion-service │ rabbitmq │ Publish │
|
|
│ AMQP │ rabbitmq │ timeseries-writer │ Consume │
|
|
│ AMQP │ rabbitmq │ graph-writer │ Consume │
|
|
│ TCP/Native │ timeseries-writer │ clickhouse │ Batch Insert │
|
|
│ Bolt │ graph-writer │ neo4j │ Cypher Queries │
|
|
│ gRPC │ backend │ graph-query │ Request/Response │
|
|
└─────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
═══════════════════════════════════════════════════════════════════════════════════════
|
|
CRITICAL POINT
|
|
═══════════════════════════════════════════════════════════════════════════════════════
|
|
|
|
⚠️ ingestion-service connects to Gadget as a CLIENT!
|
|
|
|
Inspektor Gadget → gRPC SERVER (exposes API only; does not push anywhere)
|
|
ingestion-service → gRPC CLIENT (PULLS events from Gadget)
|
|
ingestion-service → PUBLISHES to RabbitMQ
|
|
|
|
Thanks to this architecture:
|
|
✓ Gadget stays lightweight (eBPF + gRPC server only)
|
|
✓ Decoupled — queue failure does not affect Gadget
|
|
✓ Backpressure — ingestion-service can apply rate control
|
|
✓ Multi-cluster — different clusters can use different connection protocols
|
|
|
|
```
|
|
|
|
## Service Summary
|
|
|
|
| Pod Name | Port | Role | Technology |
|
|
|----------|------|------|------------|
|
|
| frontend | 3000 | Web UI | React, TypeScript, Ant Design |
|
|
| backend | 8000 | REST API Gateway | FastAPI, Python |
|
|
| change-detection-worker | 8001 | Change Detection (Scalable) | FastAPI, Python |
|
|
| analysis-orchestrator | 5002 | Analysis Lifecycle | gRPC, Python |
|
|
| cluster-manager | 5003 | Cluster Connections | gRPC, Python |
|
|
| ingestion-service | 5000 | Event Collection | gRPC, Python |
|
|
| timeseries-writer | - | ClickHouse Writer | Python, pika |
|
|
| graph-writer | - | Neo4j Writer | Python, aio_pika |
|
|
| graph-query | 8001 | Graph Queries | REST, Python |
|
|
| inspektor-gadget | 16060 | eBPF Data Source | DaemonSet, gRPC |
|
|
| rabbitmq | 5672 | Message Queue | RabbitMQ |
|
|
| clickhouse | 9000 | Time-Series DB | ClickHouse |
|
|
| neo4j | 7687 | Graph DB | Neo4j |
|
|
| postgresql | 5432 | Metadata DB | PostgreSQL |
|
|
| redis | 6379 | Cache (+ Leader Election) | Redis |
|
|
|