Synapse Platform Control Plane - manages fleet clusters via Flux GitOps.
┌─────────────────────────────────────────────────────────────────────┐
│ CORTEX (Platform Cluster) │
│ │
│ Flux manages: │
│ ├── Platform infrastructure (Crossplane, Kyverno, etc.) │
│ ├── Argo CD installation on fleet clusters │
│ └── Tenant boundaries (namespaces, quotas, RBAC) │
└─────────────────────────────────────────────────────────────────────┘
│
│ Deploys control plane TO
▼
┌─────────────────────────────────────────────────────────────────────┐
│ FLEET CLUSTERS (Spokes) │
│ │
│ Argo CD manages: │
│ ├── Application workloads │
│ └── Product team resources │
└─────────────────────────────────────────────────────────────────────┘
cortex/
├── hub/ # Flux entry point
│ ├── flux-system/ # Flux controllers
│ ├── cortex.yaml # Platform Kustomizations
│ └── dev.yaml # Fleet dev Kustomizations
│
├── deploy/ # Base definitions (shared)
│ ├── controllers/ # HelmReleases
│ ├── config/ # Policies, configs
│ └── tenants/ # SAs, RBAC, namespaces
│
├── platform/ # Platform cluster overlays
│ ├── controllers/
│ ├── config/
│ └── tenants/
│
├── fleet/ # Fleet cluster overlays
│ ├── dev/
│ │ ├── controllers/
│ │ ├── config/
│ │ └── tenants/
│ └── production/
│ └── ...
│
└── kind/ # Kind cluster configs
├── cortex.yaml
└── axon.yaml
Flux applies in order: tenants → controllers → config
Each namespace has its own set:
flux-system/tenants→flux-system/controllers→flux-system/config(platform)dev/tenants→dev/controllers→dev/config(fleet dev)
| Command | Description |
|---|---|
just fleet-up |
Create Kind clusters |
just fleet-down |
Destroy clusters |
just fleet-status |
Check cluster health |
just bootstrap <owner> <repo> |
Bootstrap Flux |
just flux-status |
View Flux status |
just flux-reconcile |
Force reconciliation |
just validate |
Validate manifests |
Fleet cluster services are exposed via Tailscale for secure access without port-forwarding.
-
Create OAuth client at https://login.tailscale.com/admin/settings/oauth
- Scopes:
devices:write,dns:write - Tag:
tag:k8s(or your preferred tag)
- Scopes:
-
Create the secret on cortex cluster before bootstrapping:
kubectl --context kind-cortex create namespace dev
kubectl --context kind-cortex create secret generic tailscale-oauth \
--namespace dev \
--from-literal=clientId=<your-client-id> \
--from-literal=clientSecret=<your-client-secret>Services are exposed via kgateway with TLS termination on custom domains.
Architecture:
Client → DNS → Tailscale (encrypted) → LoadBalancer → kgateway (TLS) → Service
Or use an A record pointing to the Tailscale IP (check with kubectl get svc synapse-gateway -n kgateway-system).
Certificate:
Development uses a self-signed CA. Browser will show a certificate warning.
For production, configure Let's Encrypt with DNS-01 challenge:
- Create a ClusterIssuer with your DNS provider credentials
- Update
deploy/config/gateway/issuer.yamlto use Let's Encrypt - Update
deploy/config/gateway/certificate.yamlissuer reference
- Create overlay in
fleet/<env>/ - Create hub file
hub/<env>.yaml - Add to
hub/kustomization.yaml - Create kubeconfig secret in
<env>namespace on cortex