<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kristoffer Hatland</title>
    <description>The latest articles on DEV Community by Kristoffer Hatland (@krhatland).</description>
    <link>https://dev.to/krhatland</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3312205%2F05bdabc3-e2f1-4197-876f-a4ec784b56c7.jpeg</url>
      <title>DEV Community: Kristoffer Hatland</title>
      <link>https://dev.to/krhatland</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krhatland"/>
    <language>en</language>
    <item>
      <title>Subnet Planning for Kubernetes: Why Most Calculators Are Wrong</title>
      <dc:creator>Kristoffer Hatland</dc:creator>
      <pubDate>Mon, 09 Mar 2026 08:26:51 +0000</pubDate>
      <link>https://dev.to/krhatland/subnet-planning-for-kubernetes-why-most-calculators-are-wrong-1gdl</link>
      <guid>https://dev.to/krhatland/subnet-planning-for-kubernetes-why-most-calculators-are-wrong-1gdl</guid>
      <description>&lt;p&gt;When planning networks for Kubernetes clusters, many engineers reach for a simple subnet calculator.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;10.0.0.0/24 → 256 addresses&lt;/p&gt;

&lt;p&gt;Looks simple enough.&lt;/p&gt;

&lt;p&gt;But in practice, &lt;strong&gt;cloud networking rarely behaves that way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After running into subnet exhaustion issues multiple times while deploying Kubernetes clusters, I realized that traditional subnet calculators miss several critical details — especially in cloud environments like &lt;strong&gt;AWS, Azure, and Google Cloud&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s walk through why.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Problem With Subnet Planning
&lt;/h2&gt;

&lt;p&gt;Most subnet calculators assume a very simple model:&lt;/p&gt;

&lt;p&gt;Total IPs = 2^(32 - prefix)&lt;/p&gt;

&lt;p&gt;So a &lt;code&gt;/24&lt;/code&gt; network gives you:&lt;/p&gt;

&lt;p&gt;256 total IP addresses&lt;/p&gt;

&lt;p&gt;Subtract the network and broadcast addresses:&lt;/p&gt;

&lt;p&gt;254 usable addresses&lt;/p&gt;

&lt;p&gt;This model works fine in traditional networking.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;cloud providers reserve additional addresses&lt;/strong&gt;, and Kubernetes can consume IP space far faster than expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cloud Platforms Reserve More IPs
&lt;/h2&gt;

&lt;p&gt;Each cloud platform reserves several IP addresses in every subnet.&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;Azure reserves five IP addresses&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.0&lt;/td&gt;
&lt;td&gt;Network address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.1&lt;/td&gt;
&lt;td&gt;Default gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.2&lt;/td&gt;
&lt;td&gt;Azure DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.3&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last&lt;/td&gt;
&lt;td&gt;Broadcast&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That means a &lt;code&gt;/24&lt;/code&gt; subnet actually provides:&lt;/p&gt;

&lt;p&gt;256 - 5 = 251 usable addresses&lt;/p&gt;

&lt;p&gt;AWS and GCP have similar reservation models.&lt;/p&gt;

&lt;p&gt;This already makes many traditional subnet calculators inaccurate for cloud deployments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kubernetes Changes the Game
&lt;/h2&gt;

&lt;p&gt;The real challenge appears when running &lt;strong&gt;Kubernetes clusters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Depending on the networking model, &lt;strong&gt;each pod may consume an IP address from the subnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Networking model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS EKS&lt;/td&gt;
&lt;td&gt;VPC CNI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google GKE&lt;/td&gt;
&lt;td&gt;VPC-native clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure AKS&lt;/td&gt;
&lt;td&gt;Azure CNI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In all these cases, &lt;strong&gt;pod IPs come from the underlying network&lt;/strong&gt;, which means subnets must handle both nodes and pods.&lt;/p&gt;

&lt;p&gt;This causes IP consumption to grow quickly as clusters scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: AKS Subnet Planning
&lt;/h2&gt;

&lt;p&gt;Let’s walk through a simple example.&lt;/p&gt;

&lt;p&gt;Imagine an AKS cluster with:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nodes&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods per node&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Required pod IPs:&lt;/p&gt;

&lt;p&gt;20 × 30 = 600&lt;/p&gt;

&lt;p&gt;Add node IPs:&lt;/p&gt;

&lt;p&gt;20&lt;/p&gt;

&lt;p&gt;Add Azure reserved addresses:&lt;/p&gt;

&lt;p&gt;5&lt;/p&gt;

&lt;p&gt;Total IPs required:&lt;/p&gt;

&lt;p&gt;625&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;/24&lt;/code&gt; subnet only provides &lt;strong&gt;251 usable addresses&lt;/strong&gt;, so it would run out of space very quickly.&lt;/p&gt;

&lt;p&gt;Even a &lt;code&gt;/23&lt;/code&gt; may not leave much room for scaling.&lt;/p&gt;

&lt;p&gt;This is why many teams allocate much larger ranges such as:&lt;/p&gt;

&lt;p&gt;/20&lt;br&gt;
/19&lt;/p&gt;

&lt;p&gt;especially when clusters are expected to grow.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Large Should a Kubernetes Subnet Be?
&lt;/h2&gt;

&lt;p&gt;One of the most common questions engineers ask is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How large should the subnet be for a Kubernetes cluster?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer depends on three main factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;number of nodes
&lt;/li&gt;
&lt;li&gt;maximum pods per node
&lt;/li&gt;
&lt;li&gt;networking model (CNI plugin)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple formula is:&lt;/p&gt;

&lt;p&gt;required_ips = (nodes × pods_per_node) + nodes + reserved_ips&lt;/p&gt;

&lt;p&gt;Example cluster:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nodes&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pods per node&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pod IPs:&lt;/p&gt;

&lt;p&gt;20 × 30 = 600&lt;/p&gt;

&lt;p&gt;Node IPs:&lt;/p&gt;

&lt;p&gt;20&lt;/p&gt;

&lt;p&gt;Reserved addresses:&lt;/p&gt;

&lt;p&gt;5&lt;/p&gt;

&lt;p&gt;Total required:&lt;/p&gt;

&lt;p&gt;625 IPs&lt;/p&gt;

&lt;p&gt;This means the cluster would need &lt;strong&gt;at least a /22 subnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Typical recommendations are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subnet&lt;/th&gt;
&lt;th&gt;Usable IPs&lt;/th&gt;
&lt;th&gt;Typical Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/24&lt;/td&gt;
&lt;td&gt;~251&lt;/td&gt;
&lt;td&gt;small clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/23&lt;/td&gt;
&lt;td&gt;~507&lt;/td&gt;
&lt;td&gt;medium clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/22&lt;/td&gt;
&lt;td&gt;~1019&lt;/td&gt;
&lt;td&gt;larger clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/20&lt;/td&gt;
&lt;td&gt;~4091&lt;/td&gt;
&lt;td&gt;production environments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Allocating slightly larger ranges early is usually safer than resizing subnets later.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When Subnets Are Too Small
&lt;/h2&gt;

&lt;p&gt;This is a surprisingly common failure scenario.&lt;/p&gt;

&lt;p&gt;Everything works initially.&lt;/p&gt;

&lt;p&gt;Then the cluster grows.&lt;/p&gt;

&lt;p&gt;Suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods fail to schedule
&lt;/li&gt;
&lt;li&gt;node pools cannot scale
&lt;/li&gt;
&lt;li&gt;networking errors appear
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point the options are painful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rebuild the cluster
&lt;/li&gt;
&lt;li&gt;migrate workloads
&lt;/li&gt;
&lt;li&gt;redesign the VNet or VPC
&lt;/li&gt;
&lt;li&gt;update firewall rules and routing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of which are far harder than simply planning a larger subnet from the beginning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Planning Subnets the Safe Way
&lt;/h2&gt;

&lt;p&gt;When designing Kubernetes networking, it's often best to start from &lt;strong&gt;maximum expected scale&lt;/strong&gt;, not the initial deployment.&lt;/p&gt;

&lt;p&gt;A simple rule of thumb:&lt;/p&gt;

&lt;p&gt;max_nodes × pods_per_node&lt;/p&gt;

&lt;p&gt;Then add buffer capacity for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;future node pools&lt;/li&gt;
&lt;li&gt;cluster upgrades&lt;/li&gt;
&lt;li&gt;cloud platform reserved addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach avoids painful migrations later.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Small Tool I Built to Help With This
&lt;/h2&gt;

&lt;p&gt;After running into this issue several times, I built a small planner to estimate the subnet size required for Kubernetes clusters running on Azure.&lt;/p&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://subnettool.com/tools/aks-subnet-planner/" rel="noopener noreferrer"&gt;https://subnettool.com/tools/aks-subnet-planner/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It helps estimate how large your CIDR range should be based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;node count&lt;/li&gt;
&lt;li&gt;pods per node&lt;/li&gt;
&lt;li&gt;Azure networking constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;before deploying the cluster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Subnet planning used to be straightforward.&lt;/p&gt;

&lt;p&gt;But in modern cloud-native environments, the interaction between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cloud platform IP reservations
&lt;/li&gt;
&lt;li&gt;Kubernetes networking models
&lt;/li&gt;
&lt;li&gt;cluster scaling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;makes it much easier to underestimate address requirements.&lt;/p&gt;

&lt;p&gt;Taking the time to plan subnet sizes properly can save a lot of painful networking migrations later.&lt;/p&gt;

&lt;p&gt;If you want a deeper explanation of AKS networking models and subnet planning, see this detailed guide:&lt;br&gt;
&lt;a href="https://subnettool.com/learn/aks-networking" rel="noopener noreferrer"&gt;https://subnettool.com/learn/aks-networking&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Related Tools
&lt;/h2&gt;

&lt;p&gt;If you're working with subnet planning in cloud environments, these calculators may also be useful.&lt;/p&gt;

&lt;p&gt;General subnet calculator&lt;br&gt;&lt;br&gt;
&lt;a href="https://subnettool.com/" rel="noopener noreferrer"&gt;https://subnettool.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes subnet planner&lt;br&gt;&lt;br&gt;
&lt;a href="https://subnettool.com/tools/kubernetes-subnet-planner/" rel="noopener noreferrer"&gt;https://subnettool.com/tools/kubernetes-subnet-planner/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AKS subnet planner&lt;br&gt;&lt;br&gt;
&lt;a href="https://subnettool.com/tools/aks-subnet-planner/" rel="noopener noreferrer"&gt;https://subnettool.com/tools/aks-subnet-planner/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usable IP calculator&lt;br&gt;&lt;br&gt;
&lt;a href="https://subnettool.com/tools/usable-ip-calculator/" rel="noopener noreferrer"&gt;https://subnettool.com/tools/usable-ip-calculator/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>networking</category>
      <category>cloud</category>
      <category>azure</category>
    </item>
    <item>
      <title>CloudNetDraw is Now Live as a SaaS – Azure Network Diagrams, No Setup Needed</title>
      <dc:creator>Kristoffer Hatland</dc:creator>
      <pubDate>Fri, 11 Jul 2025 07:20:44 +0000</pubDate>
      <link>https://dev.to/krhatland/cloudnetdraw-is-now-live-as-a-saas-azure-network-diagrams-no-setup-needed-4coe</link>
      <guid>https://dev.to/krhatland/cloudnetdraw-is-now-live-as-a-saas-azure-network-diagrams-no-setup-needed-4coe</guid>
      <description>&lt;h2&gt;
  
  
  CloudNetDraw Is Now Live as a Hosted Service 🚀
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I introduced &lt;a href="https://dev.to/krhatland/azure-diagramming-without-pain-how-i-built-cloudnetdraw-3ba3"&gt;CloudNetDraw&lt;/a&gt; — a side project I built to automate Azure network diagrams and eliminate the pain of drawing HUB/spoke topologies by hand.&lt;/p&gt;

&lt;p&gt;The early feedback was fantastic — and now I'm excited to share that &lt;strong&gt;CloudNetDraw is available as a hosted service&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🟦 What’s New
&lt;/h3&gt;

&lt;p&gt;You can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log in directly to the CloudNetDraw portal&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Authenticate with Azure (your own tenant)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate &lt;code&gt;.drawio&lt;/code&gt; network diagrams&lt;/strong&gt; instantly:

&lt;ul&gt;
&lt;li&gt;HUB &amp;amp; spoke layout&lt;/li&gt;
&lt;li&gt;vNet peerings&lt;/li&gt;
&lt;li&gt;Subnets (with CIDRs)&lt;/li&gt;
&lt;li&gt;NSG and UDR flags&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No need to deploy anything. Just authenticate, run, download.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 Try it now: &lt;a href="https://cloudnetdraw.com" rel="noopener noreferrer"&gt;https://cloudnetdraw.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🧠 Why a Hosted Version?
&lt;/h3&gt;

&lt;p&gt;While some users prefer to run everything locally or inside their own tenant, many just want to plug in credentials and go.&lt;/p&gt;

&lt;p&gt;This hosted version is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consultants doing one-time Azure assessments&lt;/li&gt;
&lt;li&gt;Infra or security engineers documenting their environment&lt;/li&gt;
&lt;li&gt;Anyone tired of hand-drawing vNets and peerings&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔍 How It Works
&lt;/h3&gt;

&lt;p&gt;CloudNetDraw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;strong&gt;read-only Azure API access&lt;/strong&gt; (you authenticate using your browser)&lt;/li&gt;
&lt;li&gt;Pulls your network topology (no data stored)&lt;/li&gt;
&lt;li&gt;Generates a &lt;code&gt;.drawio&lt;/code&gt; diagram you can edit, export, or embed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No telemetry, no tracing, no hidden analytics.&lt;/p&gt;

&lt;p&gt;👉 Watch the quick demo: &lt;a href="https://www.youtube.com/watch?v=jP38Ja5SHag" rel="noopener noreferrer"&gt;How to use the user login in CloudNetDraw&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📬 What’s Next?
&lt;/h3&gt;

&lt;p&gt;Over the coming weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’ll improve layout logic and draw subnet details more cleanly&lt;/li&gt;
&lt;li&gt;Add HLD support for multiple address space within one vNet&lt;/li&gt;
&lt;li&gt;Possibly build a &lt;strong&gt;ServiceNow/Confluence integration&lt;/strong&gt; for the self-hosted version&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🙏 Call for Feedback
&lt;/h3&gt;

&lt;p&gt;If you try the hosted version, I’d love to hear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What features you’re missing&lt;/li&gt;
&lt;li&gt;Whether you prefer SaaS or self-hosted&lt;/li&gt;
&lt;li&gt;Would you pay for a usage-based or flat-rate version?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks again to everyone who tested the early version and helped shape this tool — you’re awesome 💙&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://cloudnetdraw.com" rel="noopener noreferrer"&gt;Try it now at cloudnetdraw.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>architecture</category>
      <category>networking</category>
    </item>
    <item>
      <title>Azure Diagramming Without Pain – How I Built CloudNetDraw</title>
      <dc:creator>Kristoffer Hatland</dc:creator>
      <pubDate>Tue, 01 Jul 2025 08:37:18 +0000</pubDate>
      <link>https://dev.to/krhatland/azure-diagramming-without-pain-how-i-built-cloudnetdraw-3ba3</link>
      <guid>https://dev.to/krhatland/azure-diagramming-without-pain-how-i-built-cloudnetdraw-3ba3</guid>
      <description>&lt;p&gt;If you’ve ever needed to document an Azure network — especially one you didn’t build yourself — you know the pain:&lt;/p&gt;

&lt;p&gt;Hunting through the Azure portal&lt;/p&gt;

&lt;p&gt;Clicking into each vNet, peering, subnet, NSG, UDR&lt;/p&gt;

&lt;p&gt;Recreating it all manually in Draw.io or Visio&lt;/p&gt;

&lt;p&gt;It’s tedious. And error-prone.&lt;br&gt;
I wanted something better.&lt;br&gt;
So I built &lt;a href="https://www.cloudnetdraw.com/" rel="noopener noreferrer"&gt;CloudNetDraw&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;What It Does&lt;/strong&gt;&lt;br&gt;
CloudNetDraw is a tool that automatically generates Azure network diagrams by querying your environment and exporting editable .drawio files.&lt;/p&gt;

&lt;p&gt;You can use it in two ways:&lt;/p&gt;

&lt;p&gt;Hosted version: Just sign in with your Azure account (or use a Service Principal)&lt;/p&gt;

&lt;p&gt;Self-host: Deploy it yourself as an Azure Function from the GitHub repo&lt;/p&gt;

&lt;p&gt;No agents, no install, no need to reverse-engineer infrastructure.&lt;br&gt;
You get instant diagrams with:&lt;/p&gt;

&lt;p&gt;✅ Hub &amp;amp; Spoke visualization&lt;br&gt;
✅ All vNets and subnets (with CIDRs)&lt;br&gt;
✅ NSG and UDR indicators&lt;br&gt;
✅ Editable output (Draw.io)&lt;br&gt;
✅ HLD and MLD versions&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;How it works&lt;/strong&gt;&lt;br&gt;
Data Collection&lt;br&gt;
Using the Azure Python SDK, the tool authenticates via Entra ID (Azure AD) and pulls:&lt;/p&gt;

&lt;p&gt;All vNets&lt;/p&gt;

&lt;p&gt;Peering relationships&lt;/p&gt;

&lt;p&gt;Subnets (with address ranges)&lt;/p&gt;

&lt;p&gt;Network Security Groups&lt;/p&gt;

&lt;p&gt;Route tables (UDRs)&lt;/p&gt;

&lt;p&gt;Topology Mapping&lt;br&gt;
The script identifies:&lt;/p&gt;

&lt;p&gt;Which vNet is acting as the hub&lt;/p&gt;

&lt;p&gt;All spokes peered to the hub&lt;/p&gt;

&lt;p&gt;Additional peerings (mesh setups)&lt;/p&gt;

&lt;p&gt;Subnets with NSG or UDRs attached&lt;/p&gt;

&lt;p&gt;Diagram Generation&lt;br&gt;
The result is passed into a layout engine that outputs a .drawio file, which opens cleanly in &lt;a href="https://app.diagrams.net" rel="noopener noreferrer"&gt;https://app.diagrams.net&lt;/a&gt;. Or Drawio Desktop&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h9qvkkygcvpdu01xflt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h9qvkkygcvpdu01xflt.png" alt="Image description" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Why I Built It&lt;/strong&gt;&lt;br&gt;
I’m a cloud security architect — so I constantly review Azure environments. But I kept hitting the same wall:&lt;/p&gt;

&lt;p&gt;There was no quick and accurate way to get an overview of network architecture.&lt;/p&gt;

&lt;p&gt;Exporting from Terraform didn’t help in live environments. Defender for Cloud and Network Watcher is a mess. Visio stencils were slow and brittle.&lt;/p&gt;

&lt;p&gt;I didn’t need another Cloud Security Posture Management (CSPM) tool. I just wanted a visual, editable, and scriptable map of the actual network.&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;What About Security?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was a key design goal:&lt;/p&gt;

&lt;p&gt;We don’t store any network data&lt;/p&gt;

&lt;p&gt;The diagrams are generated in memory&lt;/p&gt;

&lt;p&gt;Everything is wiped after download&lt;/p&gt;

&lt;p&gt;Only basic telemetry (errors, usage counts) is collected&lt;/p&gt;

&lt;p&gt;Fully open-source if you want to audit it or self-host&lt;/p&gt;

&lt;p&gt;More details in the privacy policy.&lt;/p&gt;

&lt;p&gt;🛠 &lt;strong&gt;Tech Stack&lt;/strong&gt;&lt;br&gt;
Azure Functions (Python backend)&lt;/p&gt;

&lt;p&gt;Azure SDK (Python: azure-mgmt-*)&lt;/p&gt;

&lt;p&gt;lxml for Draw.io XML generation&lt;/p&gt;

&lt;p&gt;GitHub Actions for deployment&lt;/p&gt;

&lt;p&gt;Draw.io viewer (optional for preview)&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Try It Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.cloudnetdraw.com" rel="noopener noreferrer"&gt;CloudNetDraw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/krhatland/cloudnet-draw" rel="noopener noreferrer"&gt;CloudNet-Draw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No signup required. Just log in with Azure or use a service principal.&lt;/p&gt;

&lt;p&gt;💬 Feedback?&lt;br&gt;
I’d love to hear your thoughts — especially if you’re working in large-scale Azure environments or want to see support for:&lt;/p&gt;

&lt;p&gt;AWS or GCP?&lt;/p&gt;

&lt;p&gt;More detailed subnet-level LLD diagrams?&lt;/p&gt;

&lt;p&gt;Additional resource types?&lt;/p&gt;

&lt;p&gt;Let me know in the comments or open an issue on GitHub!&lt;/p&gt;

&lt;p&gt;Thanks for reading —&lt;br&gt;
Kristoffer&lt;/p&gt;

</description>
      <category>azure</category>
      <category>networking</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
