digraph G { node [ shape=box ] rankdir=LR; label="CDN maintenance" subgraph cluster_outsideuser { label="Customer/Users" customer [ label="Customer" ] users [ label="Users" ] } subgraph cluster_user { label="Staff" devops [ label="DevOps" ] developer [ label="Developer" ] networking [ label="Network Engineer" ] support [ label="Support Staff" ] } {customer,users}->support [ color=red ] subgraph cluster_origin { label="Origin DC" origin [ label="Origin Node\nServing example.com" ] } customer->origin [ color=red ] subgraph cluster_homedc { label="HomeDC" kubemaster [ label="Kubernetes master nodes" ] kubeworker [ label="Kubernetes worker nodes" ] vpn [ label="VPN endpoint" ] 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" ] } } developer->{kubemaster,kubeworker,api} [ color=green ] devops->{kubemaster,kubeworker,api} [ color=blue ] devops->{db,promhome,grafana} [ color=blue ] support->grafana [ color=pink ] subgraph cluster_pops { label="PoP" servicenode [ label="Service Node" ] edgenode [ label="Edge nodes" ] delivery [ label="Delivery API" ] prompop [ label="Prometheus" ] switches [ label="Switches" ] isp [ label="ISP/Upstream" ] vpnpop [ label="VPN endpoint" ] } devops->{delivery, servicenode} [ color=blue ] developer->{delivery, servicenode} [ color=green ] devops->{edgenode,prompop} [ color=blue ] networking->{vpn, vpnpop, switches, isp, edgenode} [ color=purple ] }