digraph G { node [ shape=box ] # rankdir=BT; label="CDN flows" subgraph cluster_user { label="Outside / in the Internet" user [ label="User\n(internal/customer)" ] client [ label="Web site User\n" ] } subgraph cluster_origin { label="Origin DC" origin [ label="Origin Node\nServing example.com" ] } client->origin [ label="non-CDN access" style=dashed ] 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" ] } } 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" ] } delivery->servicenode [ label="Runs on" ] user->ui [ label="A1. Create configuration" ] user->api [ label="A1. Create configuration" style=dashed ] ui->api [ label="A2. Create configuration" ] api->db [ label="A3. Store data" ] kubeworker->delivery [ label="A4. Trigger update" ] delivery->edgenode [ label="A5. Reconfigure" ] client->edgenode [ label="B1. Request data for example.com" ] edgenode->origin [ label="B2. Request data\n(If not cached)" ] edgenode->client [ label="B3. Return data for example.com" weight=0.2 ] }