Kubernetes Cluster Topology
Managed control plane, an application node group and a system node group, with ingress, CoreDNS, monitoring and the CSI driver — plus the registry, database and secret store the pods depend on.
Rendering…
Make it your own.
{
"nodes": [
{ "id": "cp", "type": "container", "label": "Control plane — managed (EKS 1.29)", "x": 230, "y": 30, "width": 660, "height": 200, "fill": "rgba(237,233,254,0.24)", "stroke": "#6d28d9" },
{ "id": "ng1", "type": "container", "label": "Node group — apps (3 × m6i.large)", "x": 230, "y": 270, "width": 660, "height": 210, "fill": "rgba(219,234,254,0.24)", "stroke": "#1d4ed8" },
{ "id": "ng2", "type": "container", "label": "Node group — system (2 × m6i.large)","x": 230, "y": 520, "width": 660, "height": 210, "fill": "rgba(220,252,231,0.24)", "stroke": "#15803d" },
{ "id": "team", "type": "user-group", "label": "Platform team", "x": 40, "y": 40, "width": 130, "height": 104, "fill": "#f1f5f9", "stroke": "#475569" },
{ "id": "gitops","type": "laptop", "label": "Argo CD — GitOps sync","x": 40, "y": 200, "width": 140, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
{ "id": "net", "type": "cloud", "label": "Internet traffic", "x": 40, "y": 360, "width": 160, "height": 70, "fill": "#e0f2fe", "stroke": "#0369a1" },
{ "id": "api", "type": "component", "label": "kube-apiserver", "x": 260, "y": 70, "width": 130, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9", "bold": true },
{ "id": "etcd", "type": "cylinder", "label": "etcd — 3 members", "x": 410, "y": 87, "width": 130, "height": 70, "fill": "#fef3c7", "stroke": "#b45309" },
{ "id": "sch", "type": "gear", "label": "kube-scheduler", "x": 560, "y": 70, "width": 130, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
{ "id": "ctrl", "type": "cog-cluster", "label": "controller-manager", "x": 710, "y": 70, "width": 130, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
{ "id": "pod1", "type": "docker-container", "label": "Deployment: web ×6", "x": 260, "y": 320, "width": 130, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
{ "id": "pod2", "type": "docker-container", "label": "Deployment: api ×4", "x": 410, "y": 320, "width": 130, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
{ "id": "pod3", "type": "docker-container", "label": "StatefulSet: worker ×3","x": 560, "y": 320, "width": 130, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
{ "id": "kubl", "type": "rounded", "label": "kubelet + containerd", "x": 710, "y": 340, "width": 130, "height": 64, "fill": "#eff6ff", "stroke": "#1d4ed8" },
{ "id": "ing", "type": "load-balancer", "label": "ingress-nginx", "x": 260, "y": 570, "width": 130, "height": 104, "fill": "#dcfce7", "stroke": "#15803d", "bold": true },
{ "id": "cdns", "type": "network-globe", "label": "CoreDNS", "x": 410, "y": 570, "width": 130, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
{ "id": "mon", "type": "line-chart", "label": "Prometheus stack", "x": 560, "y": 570, "width": 140, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
{ "id": "csi", "type": "backup-disk", "label": "EBS CSI driver", "x": 720, "y": 570, "width": 130, "height": 104, "fill": "#dcfce7", "stroke": "#15803d" },
{ "id": "reg", "type": "container-registry", "label": "ECR — image registry", "x": 940, "y": 60, "width": 140, "height": 104, "fill": "#fff7ed", "stroke": "#f97316" },
{ "id": "db", "type": "aws-rds", "label": "RDS — app database", "x": 940, "y": 320, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
{ "id": "sec", "type": "key", "label": "Secrets Manager", "x": 940, "y": 560, "width": 140, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" }
],
"edges": [
{ "id": "k1", "source": "team", "target": "gitops" },
{ "id": "k2", "source": "gitops", "target": "api", "label": "apply manifests", "thickness": 2 },
{ "id": "k3", "source": "net", "target": "ing", "label": "443", "thickness": 3 },
{ "id": "k4", "source": "ing", "target": "pod1", "label": "web svc" },
{ "id": "k5", "source": "ing", "target": "pod2", "label": "api svc" },
{ "id": "k6", "source": "api", "target": "etcd", "label": "cluster state", "thickness": 2 },
{ "id": "k7", "source": "api", "target": "sch" },
{ "id": "k8", "source": "api", "target": "ctrl" },
{ "id": "k9", "source": "sch", "target": "pod1", "label": "binds pods", "style": "dashed" },
{ "id": "k10", "source": "kubl", "target": "api", "label": "node status", "style": "dashed" },
{ "id": "k11", "source": "reg", "target": "pod1", "label": "image pull", "style": "dashed" },
{ "id": "k12", "source": "reg", "target": "pod2", "style": "dashed" },
{ "id": "k13", "source": "pod2", "target": "db", "label": "5432" },
{ "id": "k14", "source": "pod3", "target": "db" },
{ "id": "k15", "source": "cdns", "target": "pod2", "label": "service discovery","style": "dashed" },
{ "id": "k16", "source": "mon", "target": "api", "label": "scrape metrics", "style": "dashed" },
{ "id": "k17", "source": "csi", "target": "pod3", "label": "volume mounts", "style": "dashed" },
{ "id": "k18", "source": "sec", "target": "pod2", "label": "external secrets", "style": "dashed" }
]
}