digraph G { node [ shape=box ] # rankdir=BT; label="CDN flows" subgraph cluster_user { label="Outside / in the Internet" user [ label="User\n(internal/customer)" color=pink ] client [ label="Web site User\n" color=blue ] operator [ label="CDN Operator\n" color=green ] } subgraph cluster_origin { label="Origin DC" origin [ label="Origin Node\nServing example.com" ] } client->origin [ label="non-CDN access" style=dashed color=blue ] subgraph cluster_homedc { label="HomeDC" kubemaster [ label="Kubernetes master nodes" ] kubeworker [ label="Kubernetes worker nodes" ] subgraph cluster_kubernetes { label="Kubernetes Workload" api [ label="Tenant/OpsAPI" ] ui [ label="User Interface\nPost MVP" ] db [ label="Database" ] promhome [ label="Prometheus" ] grafana [ label="Grafana" ] } } kubemaster->kubeworker [ label="Controls" ] api->kubeworker [ label="Runs on" ] subgraph cluster_pops { label="PoP" servicenode [ label="Service Node" ] edgenode [ label="Edge nodes" ] delivery [ label="Delivery API" ] prompop [ label="Prometheus" ] } delivery->servicenode [ label="Runs on" ] user->ui [ label="A1. Create configuration" color=pink ] user->api [ label="A1. Create configuration" style=dashed color=pink ] ui->api [ label="A2. Create configuration" color=pink ] api->db [ label="A3. Store data" color=pink ] kubeworker->delivery [ label="A4. Trigger update" color=pink ] delivery->edgenode [ label="A5. Reconfigure" color=pink ] client->edgenode [ label="B1. Request data for example.com" color=blue ] edgenode->origin [ label="B2. Request data\n(If not cached)" color=blue] edgenode->client [ label="B3. Return data for example.com" weight=0.2 color=blue ] promhome->prompop [ label="C1. Pulls metrics" color=green ] operator->grafana [ label="C2. View monitoring data" color=green ] grafana->promhome [ label="C3. Gets data" color=green ] prompop->{edgenode,servicenode} [ label="Monitors" ] promhome->{api,db} [ label="Monitors" ] }