Skip to content
Weave templates

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.

Template previewWeave
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" }
  ]
}