System architecture and design overview.
graph TB
subgraph "User Layer"
Browser[User Browser<br/>React Frontend UI]
end
subgraph "Flux Orchestrator Backend"
API[HTTP Server - Gorilla Mux<br/>• Cluster Management APIs<br/>• Resource Discovery APIs<br/>• Reconciliation Trigger APIs]
DB[(PostgreSQL/MySQL<br/>Database<br/>• Clusters<br/>• Resources<br/>• State)]
K8sClient[K8s Multi-Client Manager<br/>• Dynamic Clients<br/>• Multi-Cluster Support]
Worker[Sync Worker<br/>Background Tasks<br/>• Periodic Sync<br/>• Health Check<br/>• Auto-Refresh]
end
subgraph "Kubernetes Clusters"
C1[Cluster 1<br/>Flux CRDs:<br/>• Kustomizations<br/>• HelmReleases<br/>• GitRepositories<br/>• HelmRepositories]
C2[Cluster 2<br/>Flux CRDs:<br/>• Kustomizations<br/>• HelmReleases<br/>• GitRepositories<br/>• HelmRepositories]
CN[Cluster N<br/>Flux CRDs:<br/>• Kustomizations<br/>• HelmReleases<br/>• GitRepositories<br/>• HelmRepositories]
end
Browser -->|HTTP/HTTPS<br/>REST API| API
API --> DB
API --> K8sClient
API --> Worker
K8sClient -->|Kubernetes API<br/>via kubeconfig| C1
K8sClient -->|Kubernetes API<br/>via kubeconfig| C2
K8sClient -->|Kubernetes API<br/>via kubeconfig| CN
Worker -->|Kubernetes API<br/>via kubeconfig| C1
Worker -->|Kubernetes API<br/>via kubeconfig| C2
Worker -->|Kubernetes API<br/>via kubeconfig| CN
style Browser fill:#e1f5ff
style API fill:#fff4e1
style DB fill:#e8f5e9
style K8sClient fill:#f3e5f5
style Worker fill:#fff3e0
style C1 fill:#fce4ec
style C2 fill:#fce4ec
style CN fill:#fce4ec
Purpose: Provides a web-based user interface for managing Flux across multiple clusters
Key Features:
Technology Stack:
Purpose: API server that orchestrates multi-cluster Flux management
Key Components:
Technology Stack:
Purpose: Persistent storage for cluster configurations and resource state
Schema:
clusters table:
flux_resources table:
Indexes:
User -> Frontend -> POST /api/v1/clusters
-> Backend validates kubeconfig
-> Backend creates K8s client
-> Backend checks cluster health
-> Backend saves to database
-> Response with cluster details
User -> Frontend -> POST /api/v1/clusters/{id}/sync
-> Backend queries K8s API for Flux CRDs
-> Backend parses resource status
-> Backend saves/updates in database
-> Response with sync result
User -> Frontend -> POST /api/v1/resources/reconcile
-> Backend adds reconcile annotation
-> Backend updates resource in cluster
-> Flux controller detects annotation
-> Flux reconciles the resource
Timer (5 min) -> Sync Worker queries active clusters
-> For each cluster:
- Check health
- Get all Flux resources
- Update database
-> Repeat
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Frontend │────▶│ Backend │────▶│ PostgreSQL │
│ (npm dev) │ │ (go run) │ │ (Docker) │
│ :3000 │ │ :8080 │ │ :5432 │
└────────────┘ └────────────┘ └────────────┘
┌─────────────────────────────┐
│ Central K8s Cluster │
│ │
│ ┌───────────────────────┐ │
│ │ flux-orchestrator │ │
Internet │ │ Deployment │ │
│ │ │ │ │
│ │ │ - Backend + Frontend │ │
▼ │ │ - Service (LB) │ │
┌─────────┐ │ └───────────┬───────────┘ │
│LoadBal. │─┼──────────────▶│ │
└─────────┘ │ │ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ PostgreSQL │ │
│ │ StatefulSet │ │
│ └───────────────────────┘ │
│ │
└─────────────────────────────┘
│
│ via kubeconfigs
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│Cluster 1│ │Cluster 2│ │Cluster N│
└─────────┘ └─────────┘ └─────────┘