<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Val Kafedzhy</title><description>Infrastructure &amp; Security Architect with 20+ years across enterprise platforms, networks, cloud, PKI, Zero Trust, and Kubernetes.</description><link>https://vkafed.com/</link><language>en-US</language><atom:link href="https://vkafed.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>The AI Inference Networking Maturity Model</title><link>https://vkafed.com/ai-inference-networking-maturity-model/</link><guid isPermaLink="true">https://vkafed.com/ai-inference-networking-maturity-model/</guid><description>A vendor-neutral, five-level model for judging how ready your network is to serve AI inference at scale, scored across six dimensions.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot; data-mermaid-bg-color=&quot;transparent&quot; data-shiki-theme=&quot;github-dark&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;A vendor-neutral way to judge how ready your &lt;em&gt;network&lt;/em&gt; is to serve AI inference at scale. Five levels, six dimensions. Find where you actually are, then decide the one investment that moves latency, resilience, or cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;why-this-model-exists&quot;&gt;Why this model exists&lt;/h2&gt;
&lt;p&gt;Most “AI infrastructure” conversations stop at GPUs and model serving. The network underneath, the thing that actually carries inference traffic across regions, into clusters, and between services, gets treated as plumbing right up until it causes an outage or blows a latency SLO.&lt;/p&gt;
&lt;p&gt;Inference is unusually unforgiving of lazy networking. The p99 budgets are tight. A request stuck in the wrong place idles a $30k accelerator. Regional capacity is lumpy, and an inference session doesn’t retry cleanly the way a stateless web GET does. I kept watching teams solve the GPU problem beautifully and then lose the latency they’d paid for somewhere between the load balancer and the pod.&lt;/p&gt;
&lt;p&gt;So I wrote this down to answer three questions without flinching:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Where are we, honestly?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What breaks next at this level?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What’s the next dollar actually worth spending on?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s deliberately vendor-neutral. You can climb it on a hyperscaler’s managed stack, on your own AS with BGP and eBPF, or some hybrid of the two. Each level names a capability, not a product you can buy your way into.&lt;/p&gt;
&lt;h2 id=&quot;the-six-dimensions&quot;&gt;The six dimensions&lt;/h2&gt;
&lt;p&gt;Score every level across the same six axes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Topology:&lt;/strong&gt; how regions and clusters sit relative to where demand is.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic steering:&lt;/strong&gt; how a request finds the right region or cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failover:&lt;/strong&gt; how fast, and how cleanly, traffic leaves a degraded region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability:&lt;/strong&gt; what you can genuinely see about network and inference health.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; how east-west and north-south traffic gets authorized (your Zero Trust posture).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capacity and cost awareness:&lt;/strong&gt; whether routing reflects GPU capacity and dollars per request.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-five-levels&quot;&gt;The five levels&lt;/h2&gt;
&lt;h3 id=&quot;l1-single-region-best-effort&quot;&gt;L1: single region, best effort&lt;/h3&gt;
&lt;p&gt;One region, one entry point. “Healthy” means the process is up. No capacity or cost signal anywhere.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure mode:&lt;/strong&gt; any regional incident is a full outage, and everyone outside that region eats cross-continent tail latency the rest of the time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advance by:&lt;/strong&gt; standing up a second region and some way to send traffic to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;l2-multi-region-manual&quot;&gt;L2: multi-region, manual&lt;/h3&gt;
&lt;p&gt;More than one region, but steering is GeoDNS or a human, failover is TTL-bound (minutes, if you’re lucky), and metrics are a few dashboards. Capacity gets balanced by hand.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure mode:&lt;/strong&gt; failover is far too slow for an inference SLO, clients cache and ignore your TTLs, and capacity hotspots stay invisible until they page someone at 2am.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advance by:&lt;/strong&gt; wiring real health into steering so failover happens automatically, in seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;l3-health-aware-routing&quot;&gt;L3: health-aware routing&lt;/h3&gt;
&lt;p&gt;Anycast plus BGP, or a global load balancer, with &lt;strong&gt;SLO-based&lt;/strong&gt; health integration. Routes get withdrawn on real latency or queue-depth breaches, failover lands in seconds, and observability is per-region rather than global-average. (A well-run &lt;a href=&quot;/bgp-for-the-ai-era-multi-region-routing-for-inference-workloads/&quot;&gt;BGP multi-region design&lt;/a&gt; lives here.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure mode:&lt;/strong&gt; routing knows healthy from unhealthy, but nothing about how much capacity is left or what it costs. It will happily steer a flood into a healthy region that is one request from saturation, or into your most expensive one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advance by:&lt;/strong&gt; feeding capacity and cost signals into steering, and closing the east-west security gaps you have been ignoring.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;l4-capacity--and-cost-aware-secured&quot;&gt;L4: capacity- and cost-aware, secured&lt;/h3&gt;
&lt;p&gt;Steering weighs GPU capacity, queue depth, and dollars per request, not just latency and liveness. East-west traffic runs under &lt;strong&gt;Zero Trust&lt;/strong&gt; enforcement, and &lt;a href=&quot;/topics/networking/&quot;&gt;eBPF-level observability&lt;/a&gt; gives you kernel-accurate visibility without a sidecar tax. Withdrawal and rebalancing are automated.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure mode:&lt;/strong&gt; the optimization is still reactive and rule-based. Humans own the thresholds, and the ugly cases (correlated demand spikes across regions at once) still need someone to step in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advance by:&lt;/strong&gt; closing the loop, so the system optimizes against SLO and cost objectives on its own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;l5-autonomous-self-optimizing&quot;&gt;L5: autonomous, self-optimizing&lt;/h3&gt;
&lt;p&gt;A closed control loop continuously tunes traffic, capacity, and placement against latency SLOs and cost per token. Active-active across regions with predictive scaling. When something goes wrong it degrades gracefully, shedding load or downshifting the model tier, instead of falling over. Security is policy-as-code with a full audit trail, and capacity and cost are first-class routing inputs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure mode:&lt;/strong&gt; the risks are second-order now. Control-loop stability, telemetry and model drift, over-automation. These are the problems of a mature system, not a fragile one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advance by:&lt;/strong&gt; hardening the control loop itself. This is the frontier, and there is no tidy next rung.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;summary-matrix&quot;&gt;Summary matrix&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;L1 Best-Effort&lt;/th&gt;
&lt;th&gt;L2 Manual Multi-Region&lt;/th&gt;
&lt;th&gt;L3 Health-Aware&lt;/th&gt;
&lt;th&gt;L4 Capacity/Cost-Aware + Secure&lt;/th&gt;
&lt;th&gt;L5 Autonomous&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Topology&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single region&lt;/td&gt;
&lt;td&gt;Few regions, static&lt;/td&gt;
&lt;td&gt;Regions near demand&lt;/td&gt;
&lt;td&gt;Demand-driven placement&lt;/td&gt;
&lt;td&gt;Predictive, active-active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Steering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single entry&lt;/td&gt;
&lt;td&gt;GeoDNS / manual&lt;/td&gt;
&lt;td&gt;Anycast+BGP / global LB, SLO health&lt;/td&gt;
&lt;td&gt;+ capacity and cost weighting&lt;/td&gt;
&lt;td&gt;Closed-loop optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (outage)&lt;/td&gt;
&lt;td&gt;Minutes (TTL-bound)&lt;/td&gt;
&lt;td&gt;Seconds (health-triggered)&lt;/td&gt;
&lt;td&gt;Seconds + auto-rebalance&lt;/td&gt;
&lt;td&gt;Predictive / pre-emptive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Liveness only&lt;/td&gt;
&lt;td&gt;Basic dashboards&lt;/td&gt;
&lt;td&gt;Per-region SLO metrics&lt;/td&gt;
&lt;td&gt;eBPF kernel-level, no blind spots&lt;/td&gt;
&lt;td&gt;Telemetry drives control loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perimeter/flat&lt;/td&gt;
&lt;td&gt;Perimeter + some segmentation&lt;/td&gt;
&lt;td&gt;Segmented, TLS&lt;/td&gt;
&lt;td&gt;Zero-Trust east-west enforcement&lt;/td&gt;
&lt;td&gt;Policy-as-code, full audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Capacity/Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Health only (not capacity)&lt;/td&gt;
&lt;td&gt;Capacity + $/req in routing&lt;/td&gt;
&lt;td&gt;Continuous SLO/$ optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;quick-self-assessment&quot;&gt;Quick self-assessment&lt;/h2&gt;
&lt;p&gt;Score each axis 1 to 5 and take the &lt;strong&gt;lowest&lt;/strong&gt;, not the average. An inference network behaves like its weakest dimension, not its best one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled type=&quot;checkbox&quot;&gt; Can we lose a whole region without a user-visible outage? (Failover at L3 or better)&lt;/li&gt;
&lt;li&gt;&lt;input disabled type=&quot;checkbox&quot;&gt; Does traffic leave a degraded region in seconds, on its own? (Steering at L3 or better)&lt;/li&gt;
&lt;li&gt;&lt;input disabled type=&quot;checkbox&quot;&gt; Do we route on real inference SLOs, not just “the port is open”? (Observability at L3 or better)&lt;/li&gt;
&lt;li&gt;&lt;input disabled type=&quot;checkbox&quot;&gt; Does routing know each region’s GPU capacity and cost? (Capacity at L4 or better)&lt;/li&gt;
&lt;li&gt;&lt;input disabled type=&quot;checkbox&quot;&gt; Is east-west inference traffic authorized, rather than implicitly trusted? (Security at L4 or better)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most teams running AI in production right now sit at L2 to L3. Getting from L2 to L3 is what removes the outages. L3 to L4 is what removes the waste and closes the security gaps. Neither is a research project; both are things you can scope, fund, and ship this quarter.&lt;/p&gt;
&lt;h2 id=&quot;how-to-use-this&quot;&gt;How to use this&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architects and leads:&lt;/strong&gt; locate your level per dimension, find the single weakest axis, and fund that one. Do not spread the budget evenly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interviews and reviews:&lt;/strong&gt; a shared vocabulary for “how mature is our inference network,” instead of everyone arguing from a different definition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendors and tools:&lt;/strong&gt; map what a product claims to the capability it actually delivers, not the tier its marketing puts it in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Cite as: Kafedzhy, V. “The AI Inference Networking Maturity Model.” vkafed.com.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;Background references&lt;/h2&gt;
&lt;p&gt;The five levels and scoring approach are my own assessment framework. These sources cover the underlying reliability, routing, and security concepts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;Google SRE: Service Level Objectives&lt;/a&gt;. Choosing indicators and objectives that reflect the service users receive.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc4271.html&quot;&gt;RFC 4271: BGP-4&lt;/a&gt;. The routing protocol used by the anycast design.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csrc.nist.gov/pubs/sp/800/207/final&quot;&gt;NIST SP 800-207: Zero Trust Architecture&lt;/a&gt;. The access-control principles behind the security dimension.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;: the pillar this anchors&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/bgp-for-the-ai-era-multi-region-routing-for-inference-workloads/&quot;&gt;BGP for the AI Era&lt;/a&gt;: the L3 routing layer in depth&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/zero-trust-platform-security/&quot;&gt;Zero Trust Networking Reference Architecture&lt;/a&gt;: the L4 security dimension&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content:encoded><category>AI Infrastructure Security</category><category>Networking</category></item><item><title>BGP for the AI Era: Multi-Region Routing for Inference Workloads</title><link>https://vkafed.com/bgp-for-the-ai-era-multi-region-routing-for-inference-workloads/</link><guid isPermaLink="true">https://vkafed.com/bgp-for-the-ai-era-multi-region-routing-for-inference-workloads/</guid><description>Design BGP and anycast routing for multi-region AI inference, tying route health to inference SLOs, regional GPU capacity, and predictable failover.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every network team that has run global web traffic thinks it already understands multi-region routing. Then it puts a GPU inference cluster behind that same design and watches its assumptions fail, one at a time. BGP multi-region routing for inference workloads looks like the CDN playbook at first glance. It isn’t. The failure modes are different, and the cost of getting it wrong is a lot higher, so the design has to account for both.&lt;/p&gt;
&lt;p&gt;This is the architecture I reach for when a team wants inference latency predictable across regions without turning the network team into a full-time incident desk. I’m assuming you already know BGP basics here: AS numbers, path attributes, eBGP/iBGP. What follows is about applying that knowledge to a workload that won’t forgive sloppy convergence.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-why-inference-traffic-breaks-web-routing-assumptions&quot;&gt;The problem: why inference traffic breaks web routing assumptions&lt;/h2&gt;
&lt;p&gt;Generic web traffic is forgiving. An extra 200ms because a request landed in the wrong region barely registers, and a stateless HTTP GET can be retried anywhere for free. Inference traffic doesn’t get that slack. Four reasons why:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latency SLOs are tighter and less forgiving.&lt;/strong&gt; A p99 target of 300-500ms end-to-end for a real-time inference call leaves almost no room for a routing detour. Cross-continental round trips alone can burn half that budget before a single token comes back. A web app hides 150ms behind a spinner. An inference API can’t hide it at all; it lands directly in the user-perceived response time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The cost of a stall is a GPU, not a thread.&lt;/strong&gt; Queue a request behind a slow or overloaded node and you’re not blocking a cheap CPU worker. You’re sitting a $30,000+ accelerator idle while it could be serving other requests. Misroute traffic into a saturated region and you’re wasting the most expensive unit of compute in the stack, latency aside. At that price point, capacity-aware routing is a cost control measure, full stop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regional capacity is lumpy, not elastic.&lt;/strong&gt; You can autoscale a web tier from 10 to 200 pods in minutes. GPU capacity doesn’t work that way. It comes in expensive, supply-constrained chunks, and a region running hot often can’t spin up more on demand. Routing has to steer load toward where capacity actually exists, not just where latency is lowest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failover has to be fast and clean, not eventually consistent.&lt;/strong&gt; DNS-based failover leans on clients respecting TTLs. They routinely don’t. Resolver caching, sticky client pools, and long-lived streaming connections all get in the way. An inference session mid-token-stream doesn’t get a graceful retry the way a stateless page load does. If a region degrades, the network layer needs to redirect new connections in single-digit seconds, not minutes.&lt;/p&gt;
&lt;p&gt;The natural response is anycast plus BGP: announce the same service IP from multiple regions and let the internet’s routing fabric pick the closest, healthiest path. Right instinct. It only works, though, if you engineer the failure paths as carefully as the happy path, and that’s where most first attempts fall apart.&lt;/p&gt;
&lt;h2 id=&quot;reference-architecture-bgp-multi-region-routing-for-inference-clusters&quot;&gt;Reference architecture: BGP multi-region routing for inference clusters&lt;/h2&gt;
&lt;p&gt;Here’s the shape that’s worked for me across several inference platforms: a shared anycast VIP announced from edge routers in each region, backed by per-region GPU clusters, with a health agent that ties BGP advertisement to real inference SLO metrics rather than process liveness alone.&lt;/p&gt;
&lt;img alt=&quot;Clients in the Americas, Europe, and Asia Pacific reach a shared anycast service address through edge points in IAD, FRA, and SIN. Each regional edge router forwards traffic through a load balancer to a GPU inference cluster. A health agent in each region monitors inference service objectives and withdraws that region&amp;#x27;s BGP route when those objectives are breached, allowing routing to select another available region.&quot; height=&quot;707&quot; id=&quot;mermaid-0&quot; src=&quot;data:image/svg+xml,%3csvg id=&amp;#x27;mermaid-0&amp;#x27; width=&amp;#x27;100%25&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; xmlns:xlink=&amp;#x27;http://www.w3.org/1999/xlink&amp;#x27; class=&amp;#x27;flowchart&amp;#x27; style=&amp;#x27;max-width: 1892.66796875px%3b&amp;#x27; viewBox=&amp;#x27;0 0 1892.66796875 707&amp;#x27; role=&amp;#x27;graphics-document document&amp;#x27; aria-roledescription=&amp;#x27;flowchart-v2&amp;#x27; aria-describedby=&amp;#x27;chart-desc-mermaid-0&amp;#x27; aria-labelledby=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3e%3ctitle id=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3eBGP routing for inference across three regions%3c/title%3e%3cdesc id=&amp;#x27;chart-desc-mermaid-0&amp;#x27;%3eClients in the Americas%2c Europe%2c and Asia Pacific reach a shared anycast service address through edge points in IAD%2c FRA%2c and SIN. Each regional edge router forwards traffic through a load balancer to a GPU inference cluster. A health agent in each region monitors inference service objectives and withdraws that region&amp;#x27;s BGP route when those objectives are breached%2c allowing routing to select another available region.%3c/desc%3e%3cstyle%3e%23mermaid-0%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3bfill:black%3b%7d%40keyframes edge-animation-frame%7bfrom%7bstroke-dashoffset:0%3b%7d%7d%40keyframes dash%7bto%7bstroke-dashoffset:0%3b%7d%7d%23mermaid-0 .edge-animation-slow%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 50s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .edge-animation-fast%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 20s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .error-icon%7bfill:%23552222%3b%7d%23mermaid-0 .error-text%7bfill:%23552222%3bstroke:%23552222%3b%7d%23mermaid-0 .edge-thickness-normal%7bstroke-width:1px%3b%7d%23mermaid-0 .edge-thickness-thick%7bstroke-width:3.5px%3b%7d%23mermaid-0 .edge-pattern-solid%7bstroke-dasharray:0%3b%7d%23mermaid-0 .edge-thickness-invisible%7bstroke-width:0%3bfill:none%3b%7d%23mermaid-0 .edge-pattern-dashed%7bstroke-dasharray:3%3b%7d%23mermaid-0 .edge-pattern-dotted%7bstroke-dasharray:2%3b%7d%23mermaid-0 .marker%7bfill:%23666%3bstroke:%23666%3b%7d%23mermaid-0 .marker.cross%7bstroke:%23666%3b%7d%23mermaid-0 svg%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3b%7d%23mermaid-0 p%7bmargin:0%3b%7d%23mermaid-0 .label%7bfont-family:system-ui%2csans-serif%3bcolor:black%3b%7d%23mermaid-0 .cluster-label text%7bfill:%23333%3b%7d%23mermaid-0 .cluster-label span%7bcolor:%23333%3b%7d%23mermaid-0 .cluster-label span p%7bbackground-color:transparent%3b%7d%23mermaid-0 .label text%2c%23mermaid-0 span%7bfill:black%3bcolor:black%3b%7d%23mermaid-0 .node rect%2c%23mermaid-0 .node circle%2c%23mermaid-0 .node ellipse%2c%23mermaid-0 .node polygon%2c%23mermaid-0 .node path%7bfill:%23eee%3bstroke:%23999%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label text%2c%23mermaid-0 .node .label text%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-anchor:middle%3b%7d%23mermaid-0 .node .katex path%7bfill:black%3bstroke:black%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label%2c%23mermaid-0 .node .label%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-align:center%3b%7d%23mermaid-0 .node.clickable%7bcursor:pointer%3b%7d%23mermaid-0 .root .anchor path%7bfill:%23666!important%3bstroke-width:0%3bstroke:%23666%3b%7d%23mermaid-0 .arrowheadPath%7bfill:%23333333%3b%7d%23mermaid-0 .edgePaths .path%7bstroke:%23666%3bstroke-width:1px%3b%7d%23mermaid-0 .flowchart-link%7bstroke:%23666%3bfill:none%3b%7d%23mermaid-0 .edgeLabel%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .edgeLabel p%7bbackground-color:white%3b%7d%23mermaid-0 .edgeLabel rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .labelBkg%7bbackground-color:rgba(255%2c 255%2c 255%2c 0.5)%3b%7d%23mermaid-0 .cluster rect%7bfill:hsl(0%2c 0%25%2c 98.9215686275%25)%3bstroke:%23707070%3bstroke-width:1px%3b%7d%23mermaid-0 .cluster text%7bfill:%23333%3b%7d%23mermaid-0 .cluster span%7bcolor:%23333%3b%7d%23mermaid-0 .node .collapsed-indicator%7bfill:%23707070%3bstroke:none%3bopacity:0.6%3b%7d%23mermaid-0 .node .collapsed-separator%7bstroke:%23707070%3bstroke-width:0.75px%3b%7d%23mermaid-0 div.mermaidTooltip%7bposition:absolute%3btext-align:center%3bmax-width:200px%3bpadding:2px%3bfont-family:system-ui%2csans-serif%3bfont-size:12px%3bbackground:hsl(-160%2c 0%25%2c 93.3333333333%25)%3bborder:1px solid %23707070%3bborder-radius:2px%3bpointer-events:none%3bz-index:100%3b%7d%23mermaid-0 .flowchartTitleText%7btext-anchor:middle%3bfont-size:18px%3bfill:black%3b%7d%23mermaid-0 rect.text%7bfill:none%3bstroke-width:0%3b%7d%23mermaid-0 .icon-shape%2c%23mermaid-0 .image-shape%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .icon-shape p%2c%23mermaid-0 .image-shape p%7bbackground-color:white%3bpadding:2px%3b%7d%23mermaid-0 .icon-shape .label rect%2c%23mermaid-0 .image-shape .label rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .label-icon%7bdisplay:inline-block%3bheight:1em%3boverflow:visible%3bvertical-align:-0.125em%3b%7d%23mermaid-0 .node .label-icon path%7bfill:currentColor%3bstroke:revert%3bstroke-width:revert%3b%7d%23mermaid-0 .node .neo-node%7bstroke:%23999%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.cluster rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node polygon%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.swimlane.cluster rect%7bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node path%7bstroke:url(%23mermaid-0-gradient)%3bstroke-width:1px%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .outer-path%7bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .neo-line path%7bstroke:%23999%3bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle .state-start%7bfill:black%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon%7bfill:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon-neo path%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 :root%7b--mermaid-font-family:system-ui%2csans-serif%3b%7d%3c/style%3e%3cg%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 10 5 L 0 10 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;4.5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 5 L 10 10 L 10 0 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;11.5&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;10.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 11.5 7 L 0 14 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;1&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpolygon points=&amp;#x27;0%2c7 11.5%2c14 11.5%2c0&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;11&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refY=&amp;#x27;5&amp;#x27; refX=&amp;#x27;12.25&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-2&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;12&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;17.7&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;-3.5&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cg class=&amp;#x27;root&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-RegionAPAC&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;375.32421875&amp;#x27; height=&amp;#x27;513&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(110.912109375%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;169.5&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eRegion: ap-southeast-1%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-RegionEU&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1114.01953125&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;375.32421875&amp;#x27; height=&amp;#x27;513&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1227.650390625%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;148.0625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eRegion: eu-central-1%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-RegionUS&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1509.34375&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;375.32421875&amp;#x27; height=&amp;#x27;513&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1633.115234375%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;127.78125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eRegion: us-east-1%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Anycast&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;403.32421875&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;690.6953125&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(573.390625%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;350.5625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eAnycast Front Door%2c shared VIP 198.51.100.10/32%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Internet&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;409.66015625&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;691.296875&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(701.83203125%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;106.953125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eGlobal Internet%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M973.441%2c87L973.441%2c91.167C973.441%2c95.333%2c973.441%2c103.667%2c973.441%2c114C973.441%2c124.333%2c973.441%2c136.667%2c973.441%2c149C973.441%2c161.333%2c973.441%2c173.667%2c973.441%2c183.333C973.441%2c193%2c973.441%2c200%2c973.441%2c203.5L973.441%2c207&amp;#x27; id=&amp;#x27;mermaid-0-L_C1_A1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_C1_A1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTczLjQ0MTQwNjI1LCJ5Ijo4N30seyJ4Ijo5NzMuNDQxNDA2MjUsInkiOjExMn0seyJ4Ijo5NzMuNDQxNDA2MjUsInkiOjE0OX0seyJ4Ijo5NzMuNDQxNDA2MjUsInkiOjE4Nn0seyJ4Ijo5NzMuNDQxNDA2MjUsInkiOjIxMX1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M746.582%2c87L746.582%2c91.167C746.582%2c95.333%2c746.582%2c103.667%2c746.582%2c114C746.582%2c124.333%2c746.582%2c136.667%2c746.582%2c149C746.582%2c161.333%2c746.582%2c173.667%2c746.582%2c183.333C746.582%2c193%2c746.582%2c200%2c746.582%2c203.5L746.582%2c207&amp;#x27; id=&amp;#x27;mermaid-0-L_C2_A2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_C2_A2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NzQ2LjU4MjAzMTI1LCJ5Ijo4N30seyJ4Ijo3NDYuNTgyMDMxMjUsInkiOjExMn0seyJ4Ijo3NDYuNTgyMDMxMjUsInkiOjE0OX0seyJ4Ijo3NDYuNTgyMDMxMjUsInkiOjE4Nn0seyJ4Ijo3NDYuNTgyMDMxMjUsInkiOjIxMX1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M523.738%2c87L523.738%2c91.167C523.738%2c95.333%2c523.738%2c103.667%2c523.738%2c114C523.738%2c124.333%2c523.738%2c136.667%2c523.738%2c149C523.738%2c161.333%2c523.738%2c173.667%2c523.738%2c183.333C523.738%2c193%2c523.738%2c200%2c523.738%2c203.5L523.738%2c207&amp;#x27; id=&amp;#x27;mermaid-0-L_C3_A3_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_C3_A3_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTIzLjczODI4MTI1LCJ5Ijo4N30seyJ4Ijo1MjMuNzM4MjgxMjUsInkiOjExMn0seyJ4Ijo1MjMuNzM4MjgxMjUsInkiOjE0OX0seyJ4Ijo1MjMuNzM4MjgxMjUsInkiOjE4Nn0seyJ4Ijo1MjMuNzM4MjgxMjUsInkiOjIxMX1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M973.441%2c265L973.441%2c269.167C973.441%2c273.333%2c973.441%2c281.667%2c1078.175%2c294C1182.909%2c306.333%2c1392.376%2c322.667%2c1503.414%2c338.485C1614.452%2c354.304%2c1627.061%2c369.609%2c1633.365%2c377.261L1639.67%2c384.913&amp;#x27; id=&amp;#x27;mermaid-0-L_A1_BGP1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_A1_BGP1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTczLjQ0MTQwNjI1LCJ5IjoyNjV9LHsieCI6OTczLjQ0MTQwNjI1LCJ5IjoyOTB9LHsieCI6MTYwMS44NDM3NSwieSI6MzM5fSx7IngiOjE2NDIuMjEzMDY4MTgxODE4MiwieSI6Mzg4fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1674.344%2c466L1674.344%2c470.167C1674.344%2c474.333%2c1674.344%2c482.667%2c1674.344%2c490.333C1674.344%2c498%2c1674.344%2c505%2c1674.344%2c508.5L1674.344%2c512&amp;#x27; id=&amp;#x27;mermaid-0-L_BGP1_LB1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_BGP1_LB1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTY3NC4zNDM3NSwieSI6NDY2fSx7IngiOjE2NzQuMzQzNzUsInkiOjQ5MX0seyJ4IjoxNjc0LjM0Mzc1LCJ5Ijo1MTZ9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1674.344%2c570L1674.344%2c574.167C1674.344%2c578.333%2c1674.344%2c586.667%2c1674.344%2c594.333C1674.344%2c602%2c1674.344%2c609%2c1674.344%2c612.5L1674.344%2c616&amp;#x27; id=&amp;#x27;mermaid-0-L_LB1_GPU1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_LB1_GPU1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTY3NC4zNDM3NSwieSI6NTcwfSx7IngiOjE2NzQuMzQzNzUsInkiOjU5NX0seyJ4IjoxNjc0LjM0Mzc1LCJ5Ijo2MjB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M746.582%2c265L746.582%2c269.167C746.582%2c273.333%2c746.582%2c281.667%2c823.238%2c294C899.895%2c306.333%2c1053.207%2c322.667%2c1136.168%2c338.485C1219.128%2c354.304%2c1231.737%2c369.609%2c1238.041%2c377.261L1244.345%2c384.913&amp;#x27; id=&amp;#x27;mermaid-0-L_A2_BGP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_A2_BGP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NzQ2LjU4MjAzMTI1LCJ5IjoyNjV9LHsieCI6NzQ2LjU4MjAzMTI1LCJ5IjoyOTB9LHsieCI6MTIwNi41MTk1MzEyNSwieSI6MzM5fSx7IngiOjEyNDYuODg4ODQ5NDMxODE4MiwieSI6Mzg4fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1279.02%2c466L1279.02%2c470.167C1279.02%2c474.333%2c1279.02%2c482.667%2c1279.02%2c490.333C1279.02%2c498%2c1279.02%2c505%2c1279.02%2c508.5L1279.02%2c512&amp;#x27; id=&amp;#x27;mermaid-0-L_BGP2_LB2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_BGP2_LB2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTI3OS4wMTk1MzEyNSwieSI6NDY2fSx7IngiOjEyNzkuMDE5NTMxMjUsInkiOjQ5MX0seyJ4IjoxMjc5LjAxOTUzMTI1LCJ5Ijo1MTZ9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1279.02%2c570L1279.02%2c574.167C1279.02%2c578.333%2c1279.02%2c586.667%2c1279.02%2c594.333C1279.02%2c602%2c1279.02%2c609%2c1279.02%2c612.5L1279.02%2c616&amp;#x27; id=&amp;#x27;mermaid-0-L_LB2_GPU2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_LB2_GPU2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTI3OS4wMTk1MzEyNSwieSI6NTcwfSx7IngiOjEyNzkuMDE5NTMxMjUsInkiOjU5NX0seyJ4IjoxMjc5LjAxOTUzMTI1LCJ5Ijo2MjB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M523.738%2c265L523.738%2c269.167C523.738%2c273.333%2c523.738%2c281.667%2c453.199%2c294C382.659%2c306.333%2c241.579%2c322.667%2c177.344%2c338.485C113.109%2c354.304%2c125.717%2c369.609%2c132.022%2c377.261L138.326%2c384.913&amp;#x27; id=&amp;#x27;mermaid-0-L_A3_BGP3_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_A3_BGP3_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTIzLjczODI4MTI1LCJ5IjoyNjV9LHsieCI6NTIzLjczODI4MTI1LCJ5IjoyOTB9LHsieCI6MTAwLjUsInkiOjMzOX0seyJ4IjoxNDAuODY5MzE4MTgxODE4MiwieSI6Mzg4fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M173%2c466L173%2c470.167C173%2c474.333%2c173%2c482.667%2c173%2c490.333C173%2c498%2c173%2c505%2c173%2c508.5L173%2c512&amp;#x27; id=&amp;#x27;mermaid-0-L_BGP3_LB3_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_BGP3_LB3_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTczLCJ5Ijo0NjZ9LHsieCI6MTczLCJ5Ijo0OTF9LHsieCI6MTczLCJ5Ijo1MTZ9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M173%2c570L173%2c574.167C173%2c578.333%2c173%2c586.667%2c173%2c594.333C173%2c602%2c173%2c609%2c173%2c612.5L173%2c616&amp;#x27; id=&amp;#x27;mermaid-0-L_LB3_GPU3_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_LB3_GPU3_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTczLCJ5Ijo1NzB9LHsieCI6MTczLCJ5Ijo1OTV9LHsieCI6MTczLCJ5Ijo2MjB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1734.344%2c265L1734.344%2c269.167C1734.344%2c273.333%2c1734.344%2c281.667%2c1734.344%2c294C1734.344%2c306.333%2c1734.344%2c322.667%2c1729.151%2c338.449C1723.959%2c354.232%2c1713.573%2c369.463%2c1708.381%2c377.079L1703.188%2c384.695&amp;#x27; id=&amp;#x27;mermaid-0-L_Health1_BGP1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Health1_BGP1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTczNC4zNDM3NSwieSI6MjY1fSx7IngiOjE3MzQuMzQzNzUsInkiOjI5MH0seyJ4IjoxNzM0LjM0Mzc1LCJ5IjozMzl9LHsieCI6MTcwMC45MzQ2NTkwOTA5MDksInkiOjM4OH1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1339.02%2c265L1339.02%2c269.167C1339.02%2c273.333%2c1339.02%2c281.667%2c1339.02%2c294C1339.02%2c306.333%2c1339.02%2c322.667%2c1333.827%2c338.449C1328.634%2c354.232%2c1318.249%2c369.463%2c1313.056%2c377.079L1307.864%2c384.695&amp;#x27; id=&amp;#x27;mermaid-0-L_Health2_BGP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Health2_BGP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTMzOS4wMTk1MzEyNSwieSI6MjY1fSx7IngiOjEzMzkuMDE5NTMxMjUsInkiOjI5MH0seyJ4IjoxMzM5LjAxOTUzMTI1LCJ5IjozMzl9LHsieCI6MTMwNS42MTA0NDAzNDA5MDksInkiOjM4OH1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M233%2c265L233%2c269.167C233%2c273.333%2c233%2c281.667%2c233%2c294C233%2c306.333%2c233%2c322.667%2c227.807%2c338.449C222.615%2c354.232%2c212.23%2c369.463%2c207.037%2c377.079L201.844%2c384.695&amp;#x27; id=&amp;#x27;mermaid-0-L_Health3_BGP3_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Health3_BGP3_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MjMzLCJ5IjoyNjV9LHsieCI6MjMzLCJ5IjoyOTB9LHsieCI6MjMzLCJ5IjozMzl9LHsieCI6MTk5LjU5MDkwOTA5MDkwOTEsInkiOjM4OH1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(973.44140625%2c 149)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_C1_A1_0&amp;#x27; transform=&amp;#x27;translate(-52.234375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;104.46875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eBGP best path%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(746.58203125%2c 149)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_C2_A2_0&amp;#x27; transform=&amp;#x27;translate(-52.234375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;104.46875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eBGP best path%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(523.73828125%2c 149)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_C3_A3_0&amp;#x27; transform=&amp;#x27;translate(-52.234375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;104.46875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eBGP best path%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_A1_BGP1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_BGP1_LB1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_LB1_GPU1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_A2_BGP2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_BGP2_LB2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_LB2_GPU2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_A3_BGP3_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_BGP3_LB3_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_LB3_GPU3_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1734.34375%2c 339)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Health1_BGP1_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3ewithdraw route on SLO breach%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1339.01953125%2c 339)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Health2_BGP2_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3ewithdraw route on SLO breach%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(233%2c 339)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Health3_BGP3_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3ewithdraw route on SLO breach%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-C1-0&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(973.44140625%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-92.515625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;185.03125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-62.515625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;125.03125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eClient - Americas%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-C2-1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(746.58203125%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-84.34375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;168.6875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-54.34375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;108.6875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eClient - Europe%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-C3-2&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(523.73828125%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-79.078125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;158.15625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-49.078125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;98.15625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eClient - APAC%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-A1-3&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(973.44140625%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-85.578125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;171.15625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-55.578125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;111.15625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge PoP - IAD%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-A2-4&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(746.58203125%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-87.4296875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;174.859375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-57.4296875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;114.859375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge PoP - FRA%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-A3-5&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(523.73828125%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-85.4140625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;170.828125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-55.4140625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;110.828125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge PoP - SIN%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-BGP1-6&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1674.34375%2c 427)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge Router - eBGP to Transit/IX%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-LB1-7&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1674.34375%2c 543)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-103.8359375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;207.671875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-73.8359375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;147.671875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eL4/L7 Load Balancer%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-GPU1-8&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1674.34375%2c 647)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-110.515625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;221.03125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-80.515625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;161.03125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eGPU Inference Cluster%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Health1-9&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1734.34375%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-100.6484375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;201.296875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-70.6484375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;141.296875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eHealth Probe Agent%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-BGP2-10&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1279.01953125%2c 427)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge Router - eBGP to Transit/IX%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-LB2-11&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1279.01953125%2c 543)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-103.8359375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;207.671875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-73.8359375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;147.671875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eL4/L7 Load Balancer%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-GPU2-12&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1279.01953125%2c 647)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-110.515625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;221.03125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-80.515625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;161.03125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eGPU Inference Cluster%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Health2-13&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1339.01953125%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-100.6484375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;201.296875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-70.6484375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;141.296875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eHealth Probe Agent%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-BGP3-14&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(173%2c 427)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge Router - eBGP to Transit/IX%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-LB3-15&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(173%2c 543)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-103.8359375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;207.671875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-73.8359375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;147.671875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eL4/L7 Load Balancer%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-GPU3-16&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(173%2c 647)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-110.515625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;221.03125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-80.515625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;161.03125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eGPU Inference Cluster%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Health3-17&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(233%2c 238)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-100.6484375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;201.296875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-70.6484375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;141.296875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eHealth Probe Agent%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow&amp;#x27; height=&amp;#x27;130%25&amp;#x27; width=&amp;#x27;130%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;4&amp;#x27; dy=&amp;#x27;4&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow-small&amp;#x27; height=&amp;#x27;150%25&amp;#x27; width=&amp;#x27;150%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;2&amp;#x27; dy=&amp;#x27;2&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3clinearGradient id=&amp;#x27;mermaid-0-gradient&amp;#x27; gradientUnits=&amp;#x27;objectBoundingBox&amp;#x27; x1=&amp;#x27;0%25&amp;#x27; y1=&amp;#x27;0%25&amp;#x27; x2=&amp;#x27;100%25&amp;#x27; y2=&amp;#x27;0%25&amp;#x27;%3e%3cstop offset=&amp;#x27;0%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 83.3333333333%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3cstop offset=&amp;#x27;100%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 88.9215686275%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3c/linearGradient%3e%3c/svg%3e&quot; title=&quot;BGP routing for inference across three regions&quot; width=&quot;1892.66796875&quot;&gt;
&lt;p&gt;The design choice that matters here: health state feeds directly into route advertisement. A region doesn’t go down because a ping failed. It goes down when the health agent decides the actual inference SLO is breached, and that decision is what withdraws the route.&lt;/p&gt;
&lt;h2 id=&quot;decision-criteria-anycast--bgp-vs-geodns-vs-global-load-balancer&quot;&gt;Decision criteria: anycast + BGP vs GeoDNS vs global load balancer&lt;/h2&gt;
&lt;p&gt;Before you commit to BGP, be honest about when it’s overkill.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Anycast + BGP&lt;/th&gt;
&lt;th&gt;GeoDNS&lt;/th&gt;
&lt;th&gt;Managed Global L7 Load Balancer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Steady-state latency&lt;/td&gt;
&lt;td&gt;Best, routed at the network layer, no resolver hop&lt;/td&gt;
&lt;td&gt;Good, depends on resolver geo-accuracy&lt;/td&gt;
&lt;td&gt;Good, comparable if the provider has dense PoP coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failover speed&lt;/td&gt;
&lt;td&gt;Seconds, once health integration and BFD are tuned&lt;/td&gt;
&lt;td&gt;Minutes, bounded by TTL and resolver caching behavior&lt;/td&gt;
&lt;td&gt;Seconds to tens of seconds, provider-dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blast radius of a bad regional deploy&lt;/td&gt;
&lt;td&gt;Contained, if health checks and withdrawal logic are correct; a misconfigured route-map can leak globally&lt;/td&gt;
&lt;td&gt;Contained, bounded by TTL&lt;/td&gt;
&lt;td&gt;Contained, provider manages isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;High: own AS, peering relationships, route-map/community discipline, BFD tuning&lt;/td&gt;
&lt;td&gt;Low to medium&lt;/td&gt;
&lt;td&gt;Low: you trade control for simplicity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Predictable transit/peering + engineering time&lt;/td&gt;
&lt;td&gt;Low, mostly DNS query cost&lt;/td&gt;
&lt;td&gt;Pay-per-request/data processed; can get expensive at inference-scale egress volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client behavior dependency&lt;/td&gt;
&lt;td&gt;None, works regardless of resolver or client caching&lt;/td&gt;
&lt;td&gt;High, depends on clients respecting TTLs&lt;/td&gt;
&lt;td&gt;Low, provider anycast, but still DNS-fronted in most implementations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;High-QPS, strict p99 SLOs, teams with real network engineering capacity&lt;/td&gt;
&lt;td&gt;Simple regional failover, small teams, no in-house BGP expertise&lt;/td&gt;
&lt;td&gt;Teams that want managed simplicity and can tolerate the cost/control trade-off&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;My rule of thumb: if you don’t already run BGP for something else in production, don’t stand up your first AS just for an inference product. Start with a managed global load balancer or GeoDNS, and graduate to anycast + BGP once query volume and SLO tightness justify the operational overhead. If you already own an AS and edge peering, though, folding inference traffic into that fabric is usually the right call. The marginal cost is low and the failover speed is hard to beat elsewhere.&lt;/p&gt;
&lt;h2 id=&quot;bgp-configuration-communities-health-triggered-withdrawal-and-bfd&quot;&gt;BGP configuration: communities, health-triggered withdrawal, and BFD&lt;/h2&gt;
&lt;p&gt;Here’s a representative FRR config for an edge router in &lt;code&gt;us-east-1&lt;/code&gt;. It announces the shared anycast VIP conditionally on local health, with BFD for fast peer failure detection and communities for regional signaling to upstream/transit.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;! FRR bgpd.conf - us-east-1 edge router
router bgp 65001
 bgp router-id 10.10.1.1
 no bgp ebgp-requires-policy
&lt;p&gt;neighbor 203.0.113.1 remote-as 64500
neighbor 203.0.113.1 description TRANSIT-1
neighbor 203.0.113.1 bfd
neighbor 203.0.113.1 bfd profile fast&lt;/p&gt;
&lt;p&gt;neighbor 203.0.113.5 remote-as 64500
neighbor 203.0.113.5 description TRANSIT-2
neighbor 203.0.113.5 bfd
neighbor 203.0.113.5 bfd profile fast&lt;/p&gt;
&lt;/code&gt;&lt;p&gt;&lt;code&gt;address-family ipv4 unicast
redistribute connected route-map ANYCAST-HEALTH
neighbor 203.0.113.1 route-map SET-REGION-COMMUNITY out
neighbor 203.0.113.5 route-map SET-REGION-COMMUNITY out
exit-address-family
!
bfd
profile fast
detect-multiplier 3
transmit-interval 150
receive-interval 150
exit
!
! redistribute connected advertises the VIP only while its loopback
! (connected) address exists. The health agent removes that loopback
! address on SLO breach, so bgpd withdraws the prefix from every eBGP peer.
route-map ANYCAST-HEALTH permit 10
match ip address prefix-list ANYCAST-VIP
!
route-map SET-REGION-COMMUNITY permit 10
set community 65001:100 65001:910 additive
!
ip prefix-list ANYCAST-VIP seq 5 permit 198.51.100.10/32
&lt;/code&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;65001:910&lt;/code&gt; community is an internal signal. In this scheme, &lt;code&gt;9xx&lt;/code&gt; communities mark region priority tiers that a route-reflector or upstream policy can act on, say de-preferring a region running at reduced GPU capacity without withdrawing it entirely. BFD at 150ms/×3 gives sub-second peer failure detection. That matters more than people expect: default BGP hold timers (180s) are far too slow for an inference SLO measured in hundreds of milliseconds.&lt;/p&gt;
&lt;p&gt;The health agent itself is a small, boring script, deliberately so. This is not where you want cleverness:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# health-agent.sh: runs every 2s via systemd timer on each edge router.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Ties the BGP-advertised anycast VIP to actual inference SLO health,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# not just &quot;is bgpd running.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;P99_MS&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; http://localhost:9100/metrics/p99_inference_latency_ms&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;QUEUE_DEPTH&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; http://localhost:9100/metrics/gpu_queue_depth&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; (( $(echo &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;$P99_MS&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &gt; 250&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; bc &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;l) )) &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; (( QUEUE_DEPTH &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; )); &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;  ip&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; del&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; 198.51.100.10/32&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; lo&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; 2&gt;&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;  logger&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; health-agent&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;WITHDRAWN region=us-east-1 p99=${&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;P99_MS&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;}ms queue=${&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;QUEUE_DEPTH&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;  ip&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; 198.51.100.10/32&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; lo&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; 2&gt;&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;  logger&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; health-agent&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;HEALTHY region=us-east-1 p99=${&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;P99_MS&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;}ms queue=${&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;QUEUE_DEPTH&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This pattern (redistribute a connected loopback address into BGP, then let a health agent add or remove that address) is deliberately simple. It keeps the failure domain small. If the health agent crashes, the route just stays in whatever state it was last in, instead of flapping unpredictably.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-and-what-id-do-in-production&quot;&gt;Pitfalls and what I’d do in production&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BGP dampening&lt;/strong&gt; will punish a flapping health check. If your health agent oscillates, withdrawing and re-announcing every time a metric crosses a threshold, upstream route flap dampening (RFC 2439-style) can suppress your prefix for 30-60 minutes, long after the region actually recovered. What I’d do: require N consecutive bad probes before withdrawal and a longer streak of good probes before re-announcing (I typically use 3 bad / 5 good over a rolling window), and confirm with your transit providers whether they still apply dampening to customer-originated prefixes. Many disabled it after RFC 7196, but not all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Global convergence&lt;/strong&gt; is not instant, even when your local withdrawal is. Your edge router can pull the route in milliseconds, but propagation across the internet’s BGP mesh can take tens of seconds in the worst case, especially during path hunting. If your client-facing timeout is 2-5 seconds, some in-flight and newly-initiated requests will still land on the degraded region during that window. What I’d do: treat BGP withdrawal as capacity steering, not a request-level correctness guarantee. Pair it with LB-level connection draining and a client SDK that retries against a secondary regional endpoint on failure. Don’t make BGP the only line of defense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MED and AS-path prepending&lt;/strong&gt; are weaker levers than they look. MED is only compared between routes from the same neighboring AS and is non-transitive, and plenty of transit providers ignore or reset it entirely, so don’t rely on it for cross-provider steering. AS-path prepending is coarse, and because you can’t guarantee how every downstream AS weighs path length against local policy, “symmetric” traffic engineering built on prepending often breaks asymmetrically during partial outages. One direction reroutes cleanly, the other doesn’t, and you get latency degradation on returning traffic that’s hard to diagnose. What I’d do: use LOCAL_PREF for steering when you control both ends (iBGP between owned regions or DCs) where the result is deterministic, and treat inter-AS prepending/communities as advisory hints, not guarantees.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Health checks&lt;/strong&gt; need to understand inference, not just liveness. A GPU node can be “up” (process healthy, port open) while still failing its actual job: model not loaded, request queue backed up from a traffic burst, thermal throttling reducing throughput. What I’d do: feed the health agent real SLO telemetry (p99 latency, queue depth, GPU utilization and temperature, model load state), not a synthetic ping.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Withdrawal order&lt;/strong&gt; matters, or you strand live sessions. Pulling the BGP route before draining the load balancer cuts in-flight streaming inference sessions mid-token. What I’d do: drain new connections at the LB first, let existing sessions finish or hit their natural timeout, then withdraw the route, and verify the withdrawal actually propagated (check a couple of external looking-glass vantage points) before marking the region fully out of rotation. Also audit graceful-restart / GR-helper configuration on your edge routers. It exists to survive planned bgpd restarts without dropping sessions, but misconfigured GR timers can leave a withdrawn region’s routes looking valid to peers longer than intended.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;p&gt;The protocol specifications and FRRouting manual describe the mechanisms behind this design. Validate timers, route policy, and health-agent behavior against your deployed release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc4271.html&quot;&gt;RFC 4271: BGP-4&lt;/a&gt;. Reachability advertisements, path attributes, and route withdrawal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5880.html&quot;&gt;RFC 5880: Bidirectional Forwarding Detection&lt;/a&gt;. Detecting forwarding-path failures independently of application health.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.frrouting.org/en/latest/bgp.html&quot;&gt;FRRouting BGP manual&lt;/a&gt;. Neighbor configuration, route maps, redistribution, and BGP policy controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;: the full pillar on routing architecture for modern infrastructure&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;: networking design specifically for AI/ML workloads&lt;/li&gt;
&lt;li&gt;Multi-Region Connectivity for Distributed GPU Clusters: coming soon, private backbone and inter-region transport design for training and inference&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/ipv6-at-enterprise-scale-a-migration-playbook/&quot;&gt;IPv6 at Enterprise Scale: A Migration Playbook&lt;/a&gt;: dual-stack, a real address plan, and NAT64/DNS64 for IPv6-only GPU fabrics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lets-talk-routing&quot;&gt;Let’s talk routing&lt;/h2&gt;
&lt;p&gt;If you’re designing multi-region routing for an inference platform and want a second opinion on the architecture, I’m happy to compare notes. Connect with me on &lt;a href=&quot;https://www.linkedin.com/in/vkafed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; or reach out via &lt;a href=&quot;/contact/&quot;&gt;Contact&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>AI Infrastructure Security</category><category>Networking</category></item><item><title>Service Mesh vs eBPF-Native Data Planes: How to Choose</title><link>https://vkafed.com/service-mesh-vs-ebpf-native-data-planes-how-to-choose/</link><guid isPermaLink="true">https://vkafed.com/service-mesh-vs-ebpf-native-data-planes-how-to-choose/</guid><description>Compare sidecar meshes, ambient meshes, and eBPF-native data planes across performance, identity, L7 policy, and Kubernetes operational complexity.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every platform team that runs Kubernetes past a few dozen services eventually has the service mesh vs eBPF argument, usually in a design review where one engineer points at fleet-wide CPU graphs and says the Envoy sidecars are costing too much, and another engineer points at a canary rollout ticket and says none of that matters if you can’t shift 10% of traffic to a new version without touching application code. Both of them are right. That’s the actual problem. The choice isn’t “sidecars bad” versus “eBPF hype.” It’s a real trade-off between how much a data plane costs to run and how much it can do with a single request once it’s in flight.&lt;/p&gt;
&lt;p&gt;I wrote about eBPF for kernel-level observability and security in an earlier piece: Tetragon watching process exec, Cilium enforcing identity-aware policy in the kernel. This one is narrower and more contested: what should actually carry your service-to-service traffic, terminate mTLS, and make routing decisions on a live request. That’s a different question from “should I run a kernel agent instead of a log-tailing daemon,” and it deserves its own answer.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-what-a-traffic-data-plane-actually-has-to-do&quot;&gt;The problem: what a traffic data plane actually has to do&lt;/h2&gt;
&lt;p&gt;Strip away the marketing and a service mesh data plane answers four questions on every request: who is this caller, are they allowed to reach this destination, where should this specific request go, and what happens if the destination is slow or down. The first two are identity and policy. The last two are traffic management, and that’s where the real disagreement lives.&lt;/p&gt;
&lt;p&gt;Identity-aware network policy and transport protection are available in both approaches, but the guarantees differ. Sidecar meshes use proxies for workload mutual TLS. Cilium can enforce L3/L4 policy in the kernel and offers separately configured encryption mechanisms. Check workload authentication, encryption coverage, and policy enforcement as separate requirements for the release you run.&lt;/p&gt;
&lt;p&gt;The argument starts at layer 7. A canary rollout that shifts 10% of traffic to a new version based on a request header. A retry policy that gives a flaky downstream two attempts with a two-second per-try timeout, but only for idempotent methods. A circuit breaker that stops sending traffic to an instance once it starts erroring, without a human paging in to do it. These are per-request, protocol-aware decisions. Something has to parse HTTP framing, read headers, count errors per upstream, and hold that state. A raw packet or a TCP segment doesn’t carry any of it. That something has to be a proxy in the request path that understands the protocol. Without one, those decisions don’t get made.&lt;/p&gt;
&lt;p&gt;That’s the trade-off in one sentence: every L7 feature you want costs you a proxy hop somewhere, and every proxy hop you remove costs you an L7 feature. The trade-off itself hasn’t changed. What has changed is how much middle ground now exists between “proxy on every pod” and “no proxy anywhere.”&lt;/p&gt;
&lt;h2 id=&quot;reference-architecture-sidecar-mesh-vs-ambient-vs-ebpf-native-l3l4&quot;&gt;Reference architecture: sidecar mesh vs ambient vs eBPF-native L3/L4&lt;/h2&gt;
&lt;p&gt;Three shapes run in production today, not the two that the usual framing assumes. It helps to draw them side by side rather than pick a side first.&lt;/p&gt;
&lt;p&gt;The classic sidecar model (Istio with Envoy, Linkerd with its own Rust micro-proxy) injects a proxy into every pod’s network namespace. Every request leaves the app container, hits the local sidecar, crosses the network to the destination’s sidecar, and only then reaches the destination app container. Two extra hops and two TLS terminations, per pod, for every request, whether or not that request needed any of the L7 features the proxy provides.&lt;/p&gt;
&lt;p&gt;The ambient model (Istio’s ztunnel plus optional waypoint proxies, structurally similar to what Cilium’s own service mesh does) moves the always-on part down to one proxy per node instead of one per pod. That per-node proxy (ztunnel) handles mTLS and L4 authorization for every pod on the node. It does not parse HTTP. When a namespace or service account actually needs L7 behavior (retries, header routing, canary weighting), you deploy a waypoint proxy for just that workload, and only that traffic takes the extra hop through it. Everything else gets identity and encryption without an L7 proxy anywhere near it.&lt;/p&gt;
&lt;p&gt;The eBPF-native model, in its purest form, skips the proxy entirely for L3/L4. Cilium’s agent programs the kernel data path (tc/eBPF and socket-level load balancing) to enforce identity-based policy and, optionally, transparent WireGuard or IPsec encryption between nodes. No per-pod or per-node proxy process handles this traffic; the kernel does. L7 policy, where Cilium supports it, runs through a shared per-node Envoy instance invoked only for the specific traffic that needs it. That’s architecturally close to the waypoint idea, just approached from the CNI side of the fence instead of the mesh side.&lt;/p&gt;
&lt;img alt=&quot;A sidecar mesh sends traffic between application pods through a proxy beside each pod, with mutual TLS between the proxies. An ambient mesh uses a tunnel on each node for mutual TLS and layer 4 authorization, with an optional waypoint for layer 7 processing. The eBPF-native path uses kernel programs on each node for load balancing and identity policy, with WireGuard or IPsec encryption between nodes and no layer 7 proxy in the illustrated path.&quot; height=&quot;223&quot; id=&quot;mermaid-0&quot; src=&quot;data:image/svg+xml,%3csvg id=&amp;#x27;mermaid-0&amp;#x27; width=&amp;#x27;100%25&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; xmlns:xlink=&amp;#x27;http://www.w3.org/1999/xlink&amp;#x27; class=&amp;#x27;flowchart&amp;#x27; style=&amp;#x27;max-width: 4294.28125px%3b&amp;#x27; viewBox=&amp;#x27;0 0 4294.28125 223&amp;#x27; role=&amp;#x27;graphics-document document&amp;#x27; aria-roledescription=&amp;#x27;flowchart-v2&amp;#x27; aria-describedby=&amp;#x27;chart-desc-mermaid-0&amp;#x27; aria-labelledby=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3e%3ctitle id=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3eSidecar%2c ambient%2c and eBPF-native traffic paths%3c/title%3e%3cdesc id=&amp;#x27;chart-desc-mermaid-0&amp;#x27;%3eA sidecar mesh sends traffic between application pods through a proxy beside each pod%2c with mutual TLS between the proxies. An ambient mesh uses a tunnel on each node for mutual TLS and layer 4 authorization%2c with an optional waypoint for layer 7 processing. The eBPF-native path uses kernel programs on each node for load balancing and identity policy%2c with WireGuard or IPsec encryption between nodes and no layer 7 proxy in the illustrated path.%3c/desc%3e%3cstyle%3e%23mermaid-0%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3bfill:black%3b%7d%40keyframes edge-animation-frame%7bfrom%7bstroke-dashoffset:0%3b%7d%7d%40keyframes dash%7bto%7bstroke-dashoffset:0%3b%7d%7d%23mermaid-0 .edge-animation-slow%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 50s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .edge-animation-fast%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 20s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .error-icon%7bfill:%23552222%3b%7d%23mermaid-0 .error-text%7bfill:%23552222%3bstroke:%23552222%3b%7d%23mermaid-0 .edge-thickness-normal%7bstroke-width:1px%3b%7d%23mermaid-0 .edge-thickness-thick%7bstroke-width:3.5px%3b%7d%23mermaid-0 .edge-pattern-solid%7bstroke-dasharray:0%3b%7d%23mermaid-0 .edge-thickness-invisible%7bstroke-width:0%3bfill:none%3b%7d%23mermaid-0 .edge-pattern-dashed%7bstroke-dasharray:3%3b%7d%23mermaid-0 .edge-pattern-dotted%7bstroke-dasharray:2%3b%7d%23mermaid-0 .marker%7bfill:%23666%3bstroke:%23666%3b%7d%23mermaid-0 .marker.cross%7bstroke:%23666%3b%7d%23mermaid-0 svg%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3b%7d%23mermaid-0 p%7bmargin:0%3b%7d%23mermaid-0 .label%7bfont-family:system-ui%2csans-serif%3bcolor:black%3b%7d%23mermaid-0 .cluster-label text%7bfill:%23333%3b%7d%23mermaid-0 .cluster-label span%7bcolor:%23333%3b%7d%23mermaid-0 .cluster-label span p%7bbackground-color:transparent%3b%7d%23mermaid-0 .label text%2c%23mermaid-0 span%7bfill:black%3bcolor:black%3b%7d%23mermaid-0 .node rect%2c%23mermaid-0 .node circle%2c%23mermaid-0 .node ellipse%2c%23mermaid-0 .node polygon%2c%23mermaid-0 .node path%7bfill:%23eee%3bstroke:%23999%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label text%2c%23mermaid-0 .node .label text%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-anchor:middle%3b%7d%23mermaid-0 .node .katex path%7bfill:black%3bstroke:black%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label%2c%23mermaid-0 .node .label%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-align:center%3b%7d%23mermaid-0 .node.clickable%7bcursor:pointer%3b%7d%23mermaid-0 .root .anchor path%7bfill:%23666!important%3bstroke-width:0%3bstroke:%23666%3b%7d%23mermaid-0 .arrowheadPath%7bfill:%23333333%3b%7d%23mermaid-0 .edgePaths .path%7bstroke:%23666%3bstroke-width:1px%3b%7d%23mermaid-0 .flowchart-link%7bstroke:%23666%3bfill:none%3b%7d%23mermaid-0 .edgeLabel%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .edgeLabel p%7bbackground-color:white%3b%7d%23mermaid-0 .edgeLabel rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .labelBkg%7bbackground-color:rgba(255%2c 255%2c 255%2c 0.5)%3b%7d%23mermaid-0 .cluster rect%7bfill:hsl(0%2c 0%25%2c 98.9215686275%25)%3bstroke:%23707070%3bstroke-width:1px%3b%7d%23mermaid-0 .cluster text%7bfill:%23333%3b%7d%23mermaid-0 .cluster span%7bcolor:%23333%3b%7d%23mermaid-0 .node .collapsed-indicator%7bfill:%23707070%3bstroke:none%3bopacity:0.6%3b%7d%23mermaid-0 .node .collapsed-separator%7bstroke:%23707070%3bstroke-width:0.75px%3b%7d%23mermaid-0 div.mermaidTooltip%7bposition:absolute%3btext-align:center%3bmax-width:200px%3bpadding:2px%3bfont-family:system-ui%2csans-serif%3bfont-size:12px%3bbackground:hsl(-160%2c 0%25%2c 93.3333333333%25)%3bborder:1px solid %23707070%3bborder-radius:2px%3bpointer-events:none%3bz-index:100%3b%7d%23mermaid-0 .flowchartTitleText%7btext-anchor:middle%3bfont-size:18px%3bfill:black%3b%7d%23mermaid-0 rect.text%7bfill:none%3bstroke-width:0%3b%7d%23mermaid-0 .icon-shape%2c%23mermaid-0 .image-shape%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .icon-shape p%2c%23mermaid-0 .image-shape p%7bbackground-color:white%3bpadding:2px%3b%7d%23mermaid-0 .icon-shape .label rect%2c%23mermaid-0 .image-shape .label rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .label-icon%7bdisplay:inline-block%3bheight:1em%3boverflow:visible%3bvertical-align:-0.125em%3b%7d%23mermaid-0 .node .label-icon path%7bfill:currentColor%3bstroke:revert%3bstroke-width:revert%3b%7d%23mermaid-0 .node .neo-node%7bstroke:%23999%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.cluster rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node polygon%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.swimlane.cluster rect%7bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node path%7bstroke:url(%23mermaid-0-gradient)%3bstroke-width:1px%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .outer-path%7bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .neo-line path%7bstroke:%23999%3bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle .state-start%7bfill:black%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon%7bfill:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon-neo path%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 :root%7b--mermaid-font-family:system-ui%2csans-serif%3b%7d%3c/style%3e%3cg%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 10 5 L 0 10 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;4.5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 5 L 10 10 L 10 0 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;11.5&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;10.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 11.5 7 L 0 14 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;1&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpolygon points=&amp;#x27;0%2c7 11.5%2c14 11.5%2c0&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;11&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refY=&amp;#x27;5&amp;#x27; refX=&amp;#x27;12.25&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-2&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;12&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;17.7&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;-3.5&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cg class=&amp;#x27;root&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;/%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;/%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;/%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;root&amp;#x27; transform=&amp;#x27;translate(0%2c 41.5)&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-EbpfModel&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;1430.375&amp;#x27; height=&amp;#x27;124&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(560.015625%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;326.34375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eeBPF-Native L3/L4 - Cilium core%2c no L7 proxy%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M262.5%2c70L268.75%2c70C275%2c70%2c287.5%2c70%2c299.333%2c70C311.167%2c70%2c322.333%2c70%2c327.917%2c70L333.5%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_EP1_EK1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_EP1_EK1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MjYyLjUsInkiOjcwfSx7IngiOjMwMCwieSI6NzB9LHsieCI6MzM3LjUsInkiOjcwfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M585.875%2c70L608.792%2c70C631.708%2c70%2c677.542%2c70%2c722.708%2c70C767.875%2c70%2c812.375%2c70%2c834.625%2c70L856.875%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_EK1_EK2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_EK1_EK2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTg1Ljg3NSwieSI6NzB9LHsieCI6NzIzLjM3NSwieSI6NzB9LHsieCI6ODYwLjg3NSwieSI6NzB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1109.25%2c70L1115.5%2c70C1121.75%2c70%2c1134.25%2c70%2c1146.083%2c70C1157.917%2c70%2c1169.083%2c70%2c1174.667%2c70L1180.25%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_EK2_EP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_EK2_EP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTEwOS4yNSwieSI6NzB9LHsieCI6MTE0Ni43NSwieSI6NzB9LHsieCI6MTE4NC4yNSwieSI6NzB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_EP1_EK1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(723.375%2c 70)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_EK1_EK2_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eWireGuard/IPsec %2b identity policy%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_EK2_EP2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-EP1-16&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(154%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-108.5&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;217&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-78.5%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;157&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod E - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-EK1-17&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(461.6875%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-124.1875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;248.375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-94.1875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;188.375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eeBPF - tc/socket LB%2c node%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-EK2-19&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(985.0625%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-124.1875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;248.375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-94.1875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;188.375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eeBPF - tc/socket LB%2c node%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-EP2-21&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1292.5625%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-108.3125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;216.625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-78.3125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;156.625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod F - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;root&amp;#x27; transform=&amp;#x27;translate(1480.375%2c 0)&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-AmbientModel&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;1560.3125&amp;#x27; height=&amp;#x27;207&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(577.6484375%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;421.015625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eAmbient / Sidecarless - Istio ambient%2c Cilium Service Mesh%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M264.422%2c98L270.672%2c98C276.922%2c98%2c289.422%2c98%2c301.255%2c98C313.089%2c98%2c324.255%2c98%2c329.839%2c98L335.422%2c98&amp;#x27; id=&amp;#x27;mermaid-0-L_AP1_AZ1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_AP1_AZ1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MjY0LjQyMTg3NSwieSI6OTh9LHsieCI6MzAxLjkyMTg3NSwieSI6OTh9LHsieCI6MzM5LjQyMTg3NSwieSI6OTh9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M533.234%2c75.383L547.79%2c71.986C562.346%2c68.589%2c591.458%2c61.794%2c642.237%2c58.397C693.016%2c55%2c765.461%2c55%2c829.6%2c55C893.74%2c55%2c949.573%2c55%2c985.19%2c57.464C1020.807%2c59.927%2c1036.207%2c64.854%2c1043.908%2c67.318L1051.608%2c69.781&amp;#x27; id=&amp;#x27;mermaid-0-L_AZ1_AZ2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_AZ1_AZ2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTMzLjIzNDM3NSwieSI6NzUuMzgzMTk5NzYyNTQwODF9LHsieCI6NjIwLjU3MDMxMjUsInkiOjU1fSx7IngiOjgzNy45MDYyNSwieSI6NTV9LHsieCI6MTAwNS40MDYyNSwieSI6NTV9LHsieCI6MTA1NS40MTc4Nzc5MDY5NzY2LCJ5Ijo3MX1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1236.719%2c98L1242.969%2c98C1249.219%2c98%2c1261.719%2c98%2c1273.552%2c98C1285.385%2c98%2c1296.552%2c98%2c1302.135%2c98L1307.719%2c98&amp;#x27; id=&amp;#x27;mermaid-0-L_AZ2_AP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_AZ2_AP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTIzNi43MTg3NSwieSI6OTh9LHsieCI6MTI3NC4yMTg3NSwieSI6OTh9LHsieCI6MTMxMS43MTg3NSwieSI6OTh9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M533.234%2c120.617L547.79%2c124.014C562.346%2c127.411%2c591.458%2c134.206%2c619.904%2c137.603C648.349%2c141%2c676.128%2c141%2c690.017%2c141L703.906%2c141&amp;#x27; id=&amp;#x27;mermaid-0-L_AZ1_WP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_AZ1_WP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTMzLjIzNDM3NSwieSI6MTIwLjYxNjgwMDIzNzQ1OTE5fSx7IngiOjYyMC41NzAzMTI1LCJ5IjoxNDF9LHsieCI6NzA3LjkwNjI1LCJ5IjoxNDF9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M967.906%2c141L974.156%2c141C980.406%2c141%2c992.906%2c141%2c1006.857%2c138.536C1020.807%2c136.073%2c1036.207%2c131.146%2c1043.908%2c128.682L1051.608%2c126.219&amp;#x27; id=&amp;#x27;mermaid-0-L_WP_AZ2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_WP_AZ2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTY3LjkwNjI1LCJ5IjoxNDF9LHsieCI6MTAwNS40MDYyNSwieSI6MTQxfSx7IngiOjEwNTUuNDE3ODc3OTA2OTc2NiwieSI6MTI1fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_AP1_AZ1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(837.90625%2c 55)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_AZ1_AZ2_0&amp;#x27; transform=&amp;#x27;translate(-61.15625%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;122.3125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3emTLS %2b L4 authz%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_AZ2_AP2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(620.5703125%2c 141)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_AZ1_WP_0&amp;#x27; transform=&amp;#x27;translate(-49.8359375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;99.671875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eopt-in L7 only%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_WP_AZ2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-AP1-6&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(154.9609375%2c 98)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-109.4609375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;218.921875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-79.4609375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;158.921875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod C - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-AZ1-7&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(436.328125%2c 98)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-96.90625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;193.8125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-66.90625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;133.8125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eztunnel - per node%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-AZ2-9&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1139.8125%2c 98)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-96.90625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;193.8125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-66.90625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;133.8125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eztunnel - per node%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-AP2-11&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1421.265625%2c 98)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-109.546875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;219.09375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-79.546875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;159.09375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod D - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-WP-13&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(837.90625%2c 141)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eWaypoint proxy - per namespace/SA%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;root&amp;#x27; transform=&amp;#x27;translate(3090.6875%2c 41.5)&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-SidecarModel&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;1187.59375&amp;#x27; height=&amp;#x27;124&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(469.7578125%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;264.078125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSidecar Mesh - Istio classic / Linkerd%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M263.75%2c70L270%2c70C276.25%2c70%2c288.75%2c70%2c300.583%2c70C312.417%2c70%2c323.583%2c70%2c329.167%2c70L334.75%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_SP1_SS1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SP1_SS1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MjYzLjc1LCJ5Ijo3MH0seyJ4IjozMDEuMjUsInkiOjcwfSx7IngiOjMzOC43NSwieSI6NzB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M497.953%2c70L515.283%2c70C532.612%2c70%2c567.271%2c70%2c601.263%2c70C635.255%2c70%2c668.581%2c70%2c685.243%2c70L701.906%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_SS1_SS2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SS1_SS2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NDk3Ljk1MzEyNSwieSI6NzB9LHsieCI6NjAxLjkyOTY4NzUsInkiOjcwfSx7IngiOjcwNS45MDYyNSwieSI6NzB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M865.109%2c70L871.359%2c70C877.609%2c70%2c890.109%2c70%2c901.943%2c70C913.776%2c70%2c924.943%2c70%2c930.526%2c70L936.109%2c70&amp;#x27; id=&amp;#x27;mermaid-0-L_SS2_SP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SS2_SP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6ODY1LjEwOTM3NSwieSI6NzB9LHsieCI6OTAyLjYwOTM3NSwieSI6NzB9LHsieCI6OTQwLjEwOTM3NSwieSI6NzB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SP1_SS1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(601.9296875%2c 70)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SS1_SS2_0&amp;#x27; transform=&amp;#x27;translate(-66.4765625%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;132.953125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3emTLS%2c per request%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SS2_SP2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SP1-0&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(154.625%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-109.125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;218.25&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-79.125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;158.25&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod A - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SS1-1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(418.3515625%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-79.6015625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;159.203125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-49.6015625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;99.203125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSidecar proxy%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SS2-3&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(785.5078125%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-79.6015625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;159.203125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-49.6015625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;99.203125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSidecar proxy%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SP2-5&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1049.1015625%2c 70)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-108.9921875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;217.984375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-78.9921875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;157.984375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod B - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow&amp;#x27; height=&amp;#x27;130%25&amp;#x27; width=&amp;#x27;130%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;4&amp;#x27; dy=&amp;#x27;4&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow-small&amp;#x27; height=&amp;#x27;150%25&amp;#x27; width=&amp;#x27;150%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;2&amp;#x27; dy=&amp;#x27;2&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3clinearGradient id=&amp;#x27;mermaid-0-gradient&amp;#x27; gradientUnits=&amp;#x27;objectBoundingBox&amp;#x27; x1=&amp;#x27;0%25&amp;#x27; y1=&amp;#x27;0%25&amp;#x27; x2=&amp;#x27;100%25&amp;#x27; y2=&amp;#x27;0%25&amp;#x27;%3e%3cstop offset=&amp;#x27;0%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 83.3333333333%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3cstop offset=&amp;#x27;100%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 88.9215686275%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3c/linearGradient%3e%3c/svg%3e&quot; title=&quot;Sidecar, ambient, and eBPF-native traffic paths&quot; width=&quot;4294.28125&quot;&gt;
&lt;p&gt;The design choice that matters across all three: where does the always-on cost live, and how much of your traffic pays it. Sidecar, ambient, and eBPF-based deployments place that work in different parts of the traffic path. Istio ambient separates its L4 tunnel from optional L7 waypoints. For Cilium, check the configured policy, encryption, and proxy paths together before comparing their cost with a mesh.&lt;/p&gt;
&lt;h2 id=&quot;service-mesh-vs-ebpf-decision-criteria-for-the-data-plane&quot;&gt;Service mesh vs eBPF: decision criteria for the data plane&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Sidecar Mesh (Istio/Linkerd classic)&lt;/th&gt;
&lt;th&gt;Ambient / Sidecarless (Istio ambient, Cilium Service Mesh)&lt;/th&gt;
&lt;th&gt;eBPF-Native L3/L4 (Cilium core, no L7 proxy)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L7 feature richness&lt;/td&gt;
&lt;td&gt;Full: retries with budgets, timeouts, outlier detection, weighted/canary routing, header and path routing, fault injection, on every meshed pod&lt;/td&gt;
&lt;td&gt;Full, but opt-in: same feature set, available only where you deploy a waypoint (or Cilium’s per-node Envoy) for a given workload&lt;/td&gt;
&lt;td&gt;None at the pure L3/L4 layer; Cilium’s embedded L7 support covers method/path/header authorization but not weighted traffic splitting or retry budgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mTLS / identity model&lt;/td&gt;
&lt;td&gt;SPIFFE-based workload identity, cert issued and rotated by the mesh CA, TLS terminated per-connection on both sidecars&lt;/td&gt;
&lt;td&gt;Same SPIFFE identity model, terminated at ztunnel (node-level) instead of per-pod; waypoint adds L7-aware authorization where deployed&lt;/td&gt;
&lt;td&gt;WireGuard/IPsec encryption when configured; policy uses Cilium security identities. Workload authentication and encryption coverage depend on the enabled mechanism and release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-request overhead / latency&lt;/td&gt;
&lt;td&gt;Highest: two proxy hops and two TLS terminations per request, per pod, regardless of features used&lt;/td&gt;
&lt;td&gt;Lower: one node-level hop for L4; an extra hop only for workloads with a waypoint&lt;/td&gt;
&lt;td&gt;Lowest: kernel data path, no userspace proxy hop for L3/L4 traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational maturity&lt;/td&gt;
&lt;td&gt;Very high: years of production use, large operator community, well-understood failure modes&lt;/td&gt;
&lt;td&gt;Newer: same control-plane maturity underneath (Istio), smaller deployed base, fewer war stories at scale&lt;/td&gt;
&lt;td&gt;Cilium as a CNI/L3-L4 enforcement layer is mature and widely run; the L7 mesh story built on top of it is younger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debuggability&lt;/td&gt;
&lt;td&gt;Well-trodden: Envoy admin API, access logs, &lt;code&gt;kubectl exec&lt;/code&gt; into a specific pod’s sidecar&lt;/td&gt;
&lt;td&gt;Harder to attribute: one ztunnel serves many pods, so per-flow correlation takes more work; waypoint adds per-workload logs back where deployed&lt;/td&gt;
&lt;td&gt;Different skill set entirely: Hubble flow logs, &lt;code&gt;cilium monitor&lt;/code&gt;, eBPF map dumps instead of proxy logs; no L7 retry/circuit-breaker state to inspect because it doesn’t exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel requirements&lt;/td&gt;
&lt;td&gt;None: runs in userspace, portable across kernel versions&lt;/td&gt;
&lt;td&gt;ztunnel/waypoint run in userspace; the underlying CNI may still want a modern kernel depending on choice&lt;/td&gt;
&lt;td&gt;Real: wants a modern kernel with BTF for CO-RE, the same constraint covered in depth in the eBPF observability piece linked below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Teams that need L7 traffic shaping broadly and already operate Envoy comfortably&lt;/td&gt;
&lt;td&gt;Teams that want mTLS and L4 policy everywhere cheaply, but only need L7 traffic shaping on a handful of services&lt;/td&gt;
&lt;td&gt;Teams whose actual requirement is identity-aware network policy and encryption, not per-request traffic shaping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The way I’d sort a real decision: if more than a handful of your services need canary weighting, retry budgets, or header-based routing, you’re going to end up running an L7 proxy somewhere no matter which camp you start from. The only question is whether it sits on every pod or on the handful of workloads that actually need it. If your services mostly need to prove who’s calling and enforce who’s allowed to reach what, that’s an L3/L4 problem, and paying for a full L7 proxy on every pod to solve it is overhead you don’t need to carry.&lt;/p&gt;
&lt;h2 id=&quot;traffic-policy-in-practice-an-istio-canary-vs-a-cilium-identity-policy&quot;&gt;Traffic policy in practice: an Istio canary vs a Cilium identity policy&lt;/h2&gt;
&lt;p&gt;Nothing makes the capability gap concrete like putting the two config models side by side for the same rollout: shifting traffic to a new version of a payments service, with retries, while still restricting who can reach it at all.&lt;/p&gt;
&lt;p&gt;Here’s the Istio side, a canary that sends 10% of traffic to &lt;code&gt;v2&lt;/code&gt;, routes anyone with an &lt;code&gt;x-beta-user&lt;/code&gt; header straight to &lt;code&gt;v2&lt;/code&gt; regardless of the split, and retries idempotent failures twice with a two-second per-try timeout:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;networking.istio.io/v1beta1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;VirtualService&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments-svc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  hosts&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments.prod.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  http&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        x-beta-user&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;          exact&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    route&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;destination&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        host&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments.prod.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        subset&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;route&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;destination&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        host&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments.prod.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        subset&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      weight&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;90&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;destination&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        host&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments.prod.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        subset&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      weight&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    retries&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      attempts&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      perTryTimeout&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;2s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      retryOn&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;5xx,reset,connect-failure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;networking.istio.io/v1beta1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;DestinationRule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments-svc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  host&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments.prod.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  subsets&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    labels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      version&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    labels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      version&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s roughly fifteen lines expressing three separate per-request decisions, and it works identically whether the proxy executing it is a classic sidecar or an Istio ambient waypoint. The config model doesn’t change, only where the proxy that runs it happens to live.&lt;/p&gt;
&lt;p&gt;Now the identity side, expressed as a &lt;code&gt;CiliumNetworkPolicy&lt;/code&gt;, where only pods labeled &lt;code&gt;app: checkout&lt;/code&gt; may reach &lt;code&gt;payments&lt;/code&gt; on port 8080, enforced by identity rather than IP, in the kernel:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;cilium.io/v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;CiliumNetworkPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments-allow-checkout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  endpointSelector&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    matchLabels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      app&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  ingress&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;fromEndpoints&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;matchLabels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        app&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;checkout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    toPorts&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;ports&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;8080&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        protocol&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;TCP&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This policy is enforced by the kernel data path on every packet, survives pod IP churn because it matches on Cilium’s security identity rather than a source address, and adds essentially no per-packet latency. It also can’t do one thing the &lt;code&gt;VirtualService&lt;/code&gt; above does in three different ways: it has no concept of a request, so there is no header to match, no percentage to weight, and no retry counter. You can extend it with Cilium’s own &lt;code&gt;toPorts.rules.http&lt;/code&gt; block to match an HTTP method or path for authorization purposes (that’s real and useful), but it still won’t give you a 90/10 weighted split or a per-try timeout. That’s not a missing feature waiting on a future release. It’s a different layer of the stack answering a different question. Weighted canary and retry budgets are inherently request-level concerns, and something has to hold per-request state to answer them. A stateless, per-packet kernel policy structurally can’t.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-trade-offs-and-what-id-actually-ship&quot;&gt;Pitfalls, trade-offs, and what I’d actually ship&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Don’t migrate off a working mesh because eBPF is the interesting conference talk this year.&lt;/strong&gt; I’ve seen teams burn a quarter ripping out Istio because sidecar CPU showed up as a line item, then spend the next two quarters rebuilding canary rollouts and retry policies that used to be free. If your mesh works, your team can operate it, and the overhead isn’t blocking anything, that’s not a broken system. It’s a working one with a cost you already understand. Measure the sidecar tax on your own fleet before committing to a rewrite, not the number from someone else’s blog post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Know exactly which L7 features you’re giving up before you go sidecarless.&lt;/strong&gt; Retry budgets, outlier detection that ejects a bad instance automatically, fault injection for chaos testing, header-based routing for staged rollouts: none of that exists at the pure eBPF L3/L4 layer, and it only exists in ambient mode wherever a waypoint has been deployed. Audit which services actually use these features today (your mesh’s own telemetry will tell you) before assuming you can drop them fleet-wide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The hybrid is usually the right answer, not a compromise.&lt;/strong&gt; Run eBPF for L3/L4 identity and encryption everywhere: it’s cheap, it survives IP churn, and every workload benefits regardless of whether it needs L7 anything. Then add an L7 proxy, whether that’s an Istio waypoint or Cilium’s per-node Envoy, only for the services that actually do canaries, retries, or header routing. That’s a handful of services in most fleets, not all of them, and it’s exactly the architecture ambient mode and Cilium Service Mesh are both converging on from opposite directions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get precise about what “mTLS” means for the option you pick.&lt;/strong&gt; Check where peer identities are verified, where traffic is encrypted, and which connections are covered. Cilium&apos;s WireGuard/IPsec modes require configuration, and a node tunnel provides different guarantees from a workload TLS handshake. Check the authentication mechanism supported by your release, then test the coverage you need. An encryption setting alone does not establish policy parity with an existing mesh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Budget real time for learning to debug a kernel data path.&lt;/strong&gt; There’s no Envoy admin endpoint to curl, no access log with a request ID to grep. You’re in &lt;code&gt;cilium monitor&lt;/code&gt;, Hubble flow logs, and eBPF map dumps, and tracing a slow request back to a specific policy decision takes a different set of habits than reading a sidecar’s access log. Send at least one engineer through this before the migration, not during the first incident after it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Treat the migration itself as the risky part, not the destination.&lt;/strong&gt; The config models don’t translate: a &lt;code&gt;VirtualService&lt;/code&gt; doesn’t map onto a &lt;code&gt;CiliumNetworkPolicy&lt;/code&gt;, and running both control planes at once means two identity systems and two sources of truth for who’s allowed to talk to whom. Pick one low-traffic, non-critical service as the pilot, run it in parallel with the old path for a full deployment cycle, and confirm policy parity against real traffic before touching anything customer-facing.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;p&gt;Use these project documents to check which traffic paths and policy features your deployed releases support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://istio.io/latest/docs/ambient/architecture/data-plane/&quot;&gt;Istio ambient data plane&lt;/a&gt;. The roles of ztunnel and waypoint proxies.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://istio.io/latest/docs/reference/config/networking/virtual-service/&quot;&gt;Istio VirtualService reference&lt;/a&gt;. Request matching, weighted routes, retries, and timeouts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/security/policy/layer7/&quot;&gt;Cilium Layer 7 policies&lt;/a&gt;. HTTP authorization and application-aware policy handling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/security/network/encryption/&quot;&gt;Cilium transparent encryption&lt;/a&gt;. Encryption mechanisms, configuration, and coverage limitations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;: the full pillar on service meshes, eBPF-native data planes, and cloud networking trade-offs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/zero-trust-platform-security/&quot;&gt;Zero Trust&lt;/a&gt;: identity-aware segmentation and workload authentication patterns&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/ebpf-in-production-kernel-level-observability-and-security/&quot;&gt;eBPF in Production: Kernel-Level Observability and Security&lt;/a&gt;: the companion piece on eBPF for runtime security and observability, not the traffic data plane&lt;/li&gt;
&lt;li&gt;Gateway API Migration: Retiring Ingress Without Breaking Traffic Management (coming soon): moving L7 routing off legacy Ingress controllers and onto Gateway API, sidecar or not&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lets-talk-data-planes&quot;&gt;Let’s talk data planes&lt;/h2&gt;
&lt;p&gt;If you’re weighing a sidecar mesh against ambient mode or an eBPF-native data plane and want a second opinion on the architecture, I’m happy to compare notes. Connect with me on &lt;a href=&quot;https://www.linkedin.com/in/vkafed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; or reach out via &lt;a href=&quot;/contact/&quot;&gt;Contact&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Kubernetes Security</category><category>Zero Trust</category></item><item><title>Zero Trust Networking Beyond the Buzzword: An Enterprise Reference Architecture</title><link>https://vkafed.com/zero-trust-networking-beyond-the-buzzword-an-enterprise-reference-architecture/</link><guid isPermaLink="true">https://vkafed.com/zero-trust-networking-beyond-the-buzzword-an-enterprise-reference-architecture/</guid><description>An enterprise Zero Trust reference architecture connecting workload identity, policy decisions, access enforcement, and network microsegmentation.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every vendor booth at RSA sells “Zero Trust” like it’s a SKU. It isn’t. A zero trust network architecture is a set of design principles: identity-aware access, least privilege by default, policy enforced in the data path, and an assume-breach posture. It is not a box you rack, a license you renew, or an agent you install once and forget. The vendors aren’t wrong that the components matter; they’re wrong about the sequencing. Architecture first, product selection second.&lt;/p&gt;
&lt;p&gt;This is the reference architecture I use when an organization wants to move off a flat, VPN-fronted network toward something that survives a compromised laptop or a leaked service-account credential without turning into a two-year segmentation rewrite. It assumes you already know the vocabulary (mTLS, RBAC, network segmentation). This is about how the pieces actually fit together in production, not a vendor’s marketing diagram.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-why-the-perimeter-model-fails&quot;&gt;The problem: why the perimeter model fails&lt;/h2&gt;
&lt;p&gt;The perimeter model rests on an assumption that stopped being true roughly a decade ago: that everything inside the network boundary is trustworthy and everything outside is not. A VPN concentrator, a firewall ring, and an implicit trust grant to anything that gets past both. It worked reasonably well when “inside the network” meant an office building and a data center you controlled end to end.&lt;/p&gt;
&lt;p&gt;It breaks down for four concrete reasons:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lateral movement is free once you’re in.&lt;/strong&gt; A phished credential or an unpatched VPN appliance (a recurring theme in ransomware incident reports for years now) gives an attacker the same implicit trust as an employee at their desk. Once inside, most enterprise networks have almost no internal friction. A compromised host reaches a database three hops away because nothing in the data path checks whether it should.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identity got disconnected from network location.&lt;/strong&gt; Employees, contractors, and service-to-service SaaS integrations connect from home networks, coffee shops, and third-party clouds that never touch a corporate LAN. “Is this traffic coming from inside the network” stopped being a meaningful security signal long before most enterprises admitted it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workloads move faster than firewall rules.&lt;/strong&gt; Autoscaling groups, ephemeral containers, and multi-cloud deployments mean an IP address is not a stable identity. It can be reused by an entirely different service ten minutes later. IP-based ACLs and subnet segmentation are chasing a target that no longer holds still.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assume-breach is now a compliance expectation.&lt;/strong&gt; Frameworks enterprises are already accountable to (NIST SP 800-207, CISA’s Zero Trust Maturity Model, most cyber insurance questionnaires) now explicitly ask how you contain a compromised identity or workload, not just how you keep attackers off the network.&lt;/p&gt;
&lt;p&gt;What actually has to change, architecturally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access decisions are identity-aware.&lt;/strong&gt; Every request (user-to-app or service-to-service) is authorized on verified identity and context, not source IP or network segment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Least privilege is the default.&lt;/strong&gt; Access is scoped to the specific resource and action needed, time-bounded, and re-evaluated continuously rather than granted once at login and trusted forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy enforcement lives in the data path.&lt;/strong&gt; Enforcement points sit between services, not only between the internet and your network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design for blast-radius containment.&lt;/strong&gt; The design question shifts from “how do we keep attackers out” to “when something is compromised, how little can it actually reach.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this requires ripping out your identity provider or rebuilding the network from scratch. It requires being deliberate about where policy decisions get made, where they get enforced, and what identity means for a workload versus a human. Most half-finished zero trust projects never separate those three things cleanly.&lt;/p&gt;
&lt;h2 id=&quot;reference-architecture-a-zero-trust-network-architecture-for-the-enterprise&quot;&gt;Reference architecture: a zero trust network architecture for the enterprise&lt;/h2&gt;
&lt;p&gt;Here’s the layout I keep coming back to in enterprise environments: a single policy decision point consulted by multiple, purpose-placed enforcement points, backed by workload identity that’s independent of IP address, with microsegmentation as the default network posture rather than an add-on.&lt;/p&gt;
&lt;img alt=&quot;Employee and contractor devices authenticate through an identity provider. Identity assertions, device posture, and a versioned policy store feed a shared policy decision point. An identity-aware edge proxy asks that decision point whether to allow a request to the payments service. Requests from payments to orders pass through a separate enforcement point that also asks for authorization and permits only approved mutual TLS traffic. SPIFFE or SPIRE agents issue workload identities to both services.&quot; height=&quot;1193.426513671875&quot; id=&quot;mermaid-0&quot; src=&quot;data:image/svg+xml,%3csvg id=&amp;#x27;mermaid-0&amp;#x27; width=&amp;#x27;100%25&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; xmlns:xlink=&amp;#x27;http://www.w3.org/1999/xlink&amp;#x27; class=&amp;#x27;flowchart&amp;#x27; style=&amp;#x27;max-width: 1906.75390625px%3b&amp;#x27; viewBox=&amp;#x27;0 0 1906.75390625 1193.426513671875&amp;#x27; role=&amp;#x27;graphics-document document&amp;#x27; aria-roledescription=&amp;#x27;flowchart-v2&amp;#x27; aria-describedby=&amp;#x27;chart-desc-mermaid-0&amp;#x27; aria-labelledby=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3e%3ctitle id=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3eIdentity%2c policy decisions%2c and Zero Trust enforcement%3c/title%3e%3cdesc id=&amp;#x27;chart-desc-mermaid-0&amp;#x27;%3eEmployee and contractor devices authenticate through an identity provider. Identity assertions%2c device posture%2c and a versioned policy store feed a shared policy decision point. An identity-aware edge proxy asks that decision point whether to allow a request to the payments service. Requests from payments to orders pass through a separate enforcement point that also asks for authorization and permits only approved mutual TLS traffic. SPIFFE or SPIRE agents issue workload identities to both services.%3c/desc%3e%3cstyle%3e%23mermaid-0%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3bfill:black%3b%7d%40keyframes edge-animation-frame%7bfrom%7bstroke-dashoffset:0%3b%7d%7d%40keyframes dash%7bto%7bstroke-dashoffset:0%3b%7d%7d%23mermaid-0 .edge-animation-slow%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 50s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .edge-animation-fast%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 20s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .error-icon%7bfill:%23552222%3b%7d%23mermaid-0 .error-text%7bfill:%23552222%3bstroke:%23552222%3b%7d%23mermaid-0 .edge-thickness-normal%7bstroke-width:1px%3b%7d%23mermaid-0 .edge-thickness-thick%7bstroke-width:3.5px%3b%7d%23mermaid-0 .edge-pattern-solid%7bstroke-dasharray:0%3b%7d%23mermaid-0 .edge-thickness-invisible%7bstroke-width:0%3bfill:none%3b%7d%23mermaid-0 .edge-pattern-dashed%7bstroke-dasharray:3%3b%7d%23mermaid-0 .edge-pattern-dotted%7bstroke-dasharray:2%3b%7d%23mermaid-0 .marker%7bfill:%23666%3bstroke:%23666%3b%7d%23mermaid-0 .marker.cross%7bstroke:%23666%3b%7d%23mermaid-0 svg%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3b%7d%23mermaid-0 p%7bmargin:0%3b%7d%23mermaid-0 .label%7bfont-family:system-ui%2csans-serif%3bcolor:black%3b%7d%23mermaid-0 .cluster-label text%7bfill:%23333%3b%7d%23mermaid-0 .cluster-label span%7bcolor:%23333%3b%7d%23mermaid-0 .cluster-label span p%7bbackground-color:transparent%3b%7d%23mermaid-0 .label text%2c%23mermaid-0 span%7bfill:black%3bcolor:black%3b%7d%23mermaid-0 .node rect%2c%23mermaid-0 .node circle%2c%23mermaid-0 .node ellipse%2c%23mermaid-0 .node polygon%2c%23mermaid-0 .node path%7bfill:%23eee%3bstroke:%23999%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label text%2c%23mermaid-0 .node .label text%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-anchor:middle%3b%7d%23mermaid-0 .node .katex path%7bfill:black%3bstroke:black%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label%2c%23mermaid-0 .node .label%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-align:center%3b%7d%23mermaid-0 .node.clickable%7bcursor:pointer%3b%7d%23mermaid-0 .root .anchor path%7bfill:%23666!important%3bstroke-width:0%3bstroke:%23666%3b%7d%23mermaid-0 .arrowheadPath%7bfill:%23333333%3b%7d%23mermaid-0 .edgePaths .path%7bstroke:%23666%3bstroke-width:1px%3b%7d%23mermaid-0 .flowchart-link%7bstroke:%23666%3bfill:none%3b%7d%23mermaid-0 .edgeLabel%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .edgeLabel p%7bbackground-color:white%3b%7d%23mermaid-0 .edgeLabel rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .labelBkg%7bbackground-color:rgba(255%2c 255%2c 255%2c 0.5)%3b%7d%23mermaid-0 .cluster rect%7bfill:hsl(0%2c 0%25%2c 98.9215686275%25)%3bstroke:%23707070%3bstroke-width:1px%3b%7d%23mermaid-0 .cluster text%7bfill:%23333%3b%7d%23mermaid-0 .cluster span%7bcolor:%23333%3b%7d%23mermaid-0 .node .collapsed-indicator%7bfill:%23707070%3bstroke:none%3bopacity:0.6%3b%7d%23mermaid-0 .node .collapsed-separator%7bstroke:%23707070%3bstroke-width:0.75px%3b%7d%23mermaid-0 div.mermaidTooltip%7bposition:absolute%3btext-align:center%3bmax-width:200px%3bpadding:2px%3bfont-family:system-ui%2csans-serif%3bfont-size:12px%3bbackground:hsl(-160%2c 0%25%2c 93.3333333333%25)%3bborder:1px solid %23707070%3bborder-radius:2px%3bpointer-events:none%3bz-index:100%3b%7d%23mermaid-0 .flowchartTitleText%7btext-anchor:middle%3bfont-size:18px%3bfill:black%3b%7d%23mermaid-0 rect.text%7bfill:none%3bstroke-width:0%3b%7d%23mermaid-0 .icon-shape%2c%23mermaid-0 .image-shape%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .icon-shape p%2c%23mermaid-0 .image-shape p%7bbackground-color:white%3bpadding:2px%3b%7d%23mermaid-0 .icon-shape .label rect%2c%23mermaid-0 .image-shape .label rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .label-icon%7bdisplay:inline-block%3bheight:1em%3boverflow:visible%3bvertical-align:-0.125em%3b%7d%23mermaid-0 .node .label-icon path%7bfill:currentColor%3bstroke:revert%3bstroke-width:revert%3b%7d%23mermaid-0 .node .neo-node%7bstroke:%23999%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.cluster rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node polygon%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.swimlane.cluster rect%7bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node path%7bstroke:url(%23mermaid-0-gradient)%3bstroke-width:1px%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .outer-path%7bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .neo-line path%7bstroke:%23999%3bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle .state-start%7bfill:black%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon%7bfill:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon-neo path%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 :root%7b--mermaid-font-family:system-ui%2csans-serif%3b%7d%3c/style%3e%3cg%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 10 5 L 0 10 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;4.5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 5 L 10 10 L 10 0 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;11.5&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;10.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 11.5 7 L 0 14 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;1&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpolygon points=&amp;#x27;0%2c7 11.5%2c14 11.5%2c0&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;11&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refY=&amp;#x27;5&amp;#x27; refX=&amp;#x27;12.25&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-2&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;12&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;17.7&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;-3.5&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cg class=&amp;#x27;root&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-EW&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1119.25390625&amp;#x27; y=&amp;#x27;904.4264755249023&amp;#x27; width=&amp;#x27;400.359375&amp;#x27; height=&amp;#x27;128&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1234.06640625%2c 904.4264755249023)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;170.734375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEast-West Enforcement%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-SegB&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1539.61328125&amp;#x27; y=&amp;#x27;904.4264755249023&amp;#x27; width=&amp;#x27;359.140625&amp;#x27; height=&amp;#x27;281&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1657.51171875%2c 904.4264755249023)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;123.34375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSegment: Orders%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-SegA&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1002.15234375&amp;#x27; y=&amp;#x27;573.4264755249023&amp;#x27; width=&amp;#x27;362.3359375&amp;#x27; height=&amp;#x27;257&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1110.9609375%2c 573.4264755249023)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;144.71875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSegment: Payments%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Edge&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;573.4264755249023&amp;#x27; width=&amp;#x27;974.15234375&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(428.240234375%2c 573.4264755249023)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;133.671875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEdge Enforcement%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Policy&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;771.8671875&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;772.8125&amp;#x27; height=&amp;#x27;313.42647552490234&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1114.78125%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;86.984375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePolicy Layer%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Identity&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;111.8671875&amp;#x27; y=&amp;#x27;186&amp;#x27; width=&amp;#x27;640&amp;#x27; height=&amp;#x27;160.42647552490234&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(382.7734375%2c 186)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;98.1875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eIdentity Layer%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Users&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;765.0390625&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(331.00390625%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;119.03125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eUsers %26amp%3b Devices%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M228.469%2c79.484L254.263%2c84.903C280.057%2c90.322%2c331.646%2c101.161%2c357.44%2c112.747C383.234%2c124.333%2c383.234%2c136.667%2c383.234%2c149C383.234%2c161.333%2c383.234%2c173.667%2c400.052%2c186.458C416.869%2c199.249%2c450.504%2c212.498%2c467.321%2c219.123L484.138%2c225.747&amp;#x27; id=&amp;#x27;mermaid-0-L_U1_IdP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_U1_IdP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MjI4LjQ2ODc1LCJ5Ijo3OS40ODM1ODU4NTg1ODU4NX0seyJ4IjozODMuMjM0Mzc1LCJ5IjoxMTJ9LHsieCI6MzgzLjIzNDM3NSwieSI6MTQ5fSx7IngiOjM4My4yMzQzNzUsInkiOjE4Nn0seyJ4Ijo0ODcuODYwMDkyMDUwMDA2OCwieSI6MjI3LjIxMzIzNzc2MjQ1MTE3fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M642.117%2c87L642.117%2c91.167C642.117%2c95.333%2c642.117%2c103.667%2c642.117%2c114C642.117%2c124.333%2c642.117%2c136.667%2c642.117%2c149C642.117%2c161.333%2c642.117%2c173.667%2c637.764%2c186.153C633.411%2c198.64%2c624.705%2c211.279%2c620.352%2c217.599L615.999%2c223.919&amp;#x27; id=&amp;#x27;mermaid-0-L_U2_IdP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_U2_IdP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NjQyLjExNzE4NzUsInkiOjg3fSx7IngiOjY0Mi4xMTcxODc1LCJ5IjoxMTJ9LHsieCI6NjQyLjExNzE4NzUsInkiOjE0OX0seyJ4Ijo2NDIuMTE3MTg3NSwieSI6MTg2fSx7IngiOjYxMy43Mjk5NjA1Mjk4MjM1LCJ5IjoyMjcuMjEzMjM3NzYyNDUxMTd9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M276.867%2c305.213L276.867%2c312.082C276.867%2c318.951%2c276.867%2c332.689%2c371.207%2c345.724C465.547%2c358.76%2c654.227%2c371.093%2c765.709%2c383.208C877.191%2c395.323%2c911.477%2c407.219%2c928.619%2c413.167L945.762%2c419.115&amp;#x27; id=&amp;#x27;mermaid-0-L_Posture_PDP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Posture_PDP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6Mjc2Ljg2NzE4NzUsInkiOjMwNS4yMTMyMzc3NjI0NTEyfSx7IngiOjI3Ni44NjcxODc1LCJ5IjozNDYuNDI2NDc1NTI0OTAyMzR9LHsieCI6ODQyLjkwNjI1LCJ5IjozODMuNDI2NDc1NTI0OTAyMzR9LHsieCI6OTQ5LjU0MDk1NDU4OTg0MzgsInkiOjQyMC40MjY0NzU1MjQ5MDIzNH1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M586.867%2c305.213L586.867%2c312.082C586.867%2c318.951%2c586.867%2c332.689%2c682.009%2c345.724C777.151%2c358.76%2c967.435%2c371.093%2c1050.614%2c383.133C1133.794%2c395.172%2c1109.868%2c406.918%2c1097.906%2c412.791L1085.943%2c418.664&amp;#x27; id=&amp;#x27;mermaid-0-L_IdP_PDP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_IdP_PDP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTg2Ljg2NzE4NzUsInkiOjMwNS4yMTMyMzc3NjI0NTEyfSx7IngiOjU4Ni44NjcxODc1LCJ5IjozNDYuNDI2NDc1NTI0OTAyMzR9LHsieCI6MTE1Ny43MTg3NSwieSI6MzgzLjQyNjQ3NTUyNDkwMjM0fSx7IngiOjEwODIuMzUyNDc4MDI3MzQzOCwieSI6NDIwLjQyNjQ3NTUyNDkwMjM0fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1402.18%2c321.426L1402.18%2c325.593C1402.18%2c329.76%2c1402.18%2c338.093%2c1402.18%2c348.426C1402.18%2c358.76%2c1402.18%2c371.093%2c1361.813%2c384.152C1321.446%2c397.212%2c1240.712%2c410.997%2c1200.345%2c417.889L1159.978%2c424.782&amp;#x27; id=&amp;#x27;mermaid-0-L_Store_PDP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Store_PDP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTQwMi4xNzk2ODc1LCJ5IjozMjEuNDI2NDc1NTI0OTAyMzR9LHsieCI6MTQwMi4xNzk2ODc1LCJ5IjozNDYuNDI2NDc1NTI0OTAyMzR9LHsieCI6MTQwMi4xNzk2ODc1LCJ5IjozODMuNDI2NDc1NTI0OTAyMzR9LHsieCI6MTE1Ni4wMzUxNTYyNSwieSI6NDI1LjQ1NDg0Mjk4ODgxNzc1fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M112.957%2c87L109.442%2c91.167C105.927%2c95.333%2c98.897%2c103.667%2c95.382%2c114C91.867%2c124.333%2c91.867%2c136.667%2c91.867%2c149C91.867%2c161.333%2c91.867%2c173.667%2c91.867%2c193.202C91.867%2c212.738%2c91.867%2c239.475%2c91.867%2c266.213C91.867%2c292.951%2c91.867%2c319.689%2c91.867%2c339.224C91.867%2c358.76%2c91.867%2c371.093%2c91.867%2c387.926C91.867%2c404.76%2c91.867%2c426.093%2c91.867%2c445.426C91.867%2c464.76%2c91.867%2c482.093%2c91.867%2c496.926C91.867%2c511.76%2c91.867%2c524.093%2c91.867%2c536.426C91.867%2c548.76%2c91.867%2c561.093%2c180.962%2c574.218C270.057%2c587.342%2c448.248%2c601.257%2c537.343%2c608.215L626.438%2c615.173&amp;#x27; id=&amp;#x27;mermaid-0-L_U1_IAP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_U1_IAP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTEyLjk1NzE4MTQ5MDM4NDYxLCJ5Ijo4N30seyJ4Ijo5MS44NjcxODc1LCJ5IjoxMTJ9LHsieCI6OTEuODY3MTg3NSwieSI6MTQ5fSx7IngiOjkxLjg2NzE4NzUsInkiOjE4Nn0seyJ4Ijo5MS44NjcxODc1LCJ5IjoyNjYuMjEzMjM3NzYyNDUxMn0seyJ4Ijo5MS44NjcxODc1LCJ5IjozNDYuNDI2NDc1NTI0OTAyMzR9LHsieCI6OTEuODY3MTg3NSwieSI6MzgzLjQyNjQ3NTUyNDkwMjM0fSx7IngiOjkxLjg2NzE4NzUsInkiOjQ0Ny40MjY0NzU1MjQ5MDIzNH0seyJ4Ijo5MS44NjcxODc1LCJ5Ijo0OTkuNDI2NDc1NTI0OTAyMzR9LHsieCI6OTEuODY3MTg3NSwieSI6NTM2LjQyNjQ3NTUyNDkwMjN9LHsieCI6OTEuODY3MTg3NSwieSI6NTczLjQyNjQ3NTUyNDkwMjN9LHsieCI6NjMwLjQyNTc4MTI1LCJ5Ijo2MTUuNDg0MjM1ODU5OTg5N31d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M851.843%2c598.426L866.365%2c594.26C880.887%2c590.093%2c909.932%2c581.76%2c924.454%2c571.426C938.977%2c561.093%2c938.977%2c548.76%2c938.977%2c536.426C938.977%2c524.093%2c938.977%2c511.76%2c945.484%2c501.765C951.991%2c491.769%2c965.005%2c484.112%2c971.512%2c480.284L978.019%2c476.455&amp;#x27; id=&amp;#x27;mermaid-0-L_IAP_PDP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_IAP_PDP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6ODUxLjg0Mjc3MzQzNzUsInkiOjU5OC40MjY0NzU1MjQ5MDIzfSx7IngiOjkzOC45NzY1NjI1LCJ5Ijo1NzMuNDI2NDc1NTI0OTAyM30seyJ4Ijo5MzguOTc2NTYyNSwieSI6NTM2LjQyNjQ3NTUyNDkwMjN9LHsieCI6OTM4Ljk3NjU2MjUsInkiOjQ5OS40MjY0NzU1MjQ5MDIzNH0seyJ4Ijo5ODEuNDY2NDIxMjc0MDM4NSwieSI6NDc0LjQyNjQ3NTUyNDkwMjM0fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M931.641%2c474.426L916.87%2c478.593C902.099%2c482.76%2c872.557%2c491.093%2c857.786%2c501.426C843.016%2c511.76%2c843.016%2c524.093%2c843.016%2c536.426C843.016%2c548.76%2c843.016%2c561.093%2c836.752%2c571.079C830.488%2c581.066%2c817.96%2c588.705%2c811.696%2c592.524L805.432%2c596.344&amp;#x27; id=&amp;#x27;mermaid-0-L_PDP_IAP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_PDP_IAP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTMxLjY0MDU0OTg3OTgwNzcsInkiOjQ3NC40MjY0NzU1MjQ5MDIzNH0seyJ4Ijo4NDMuMDE1NjI1LCJ5Ijo0OTkuNDI2NDc1NTI0OTAyMzR9LHsieCI6ODQzLjAxNTYyNSwieSI6NTM2LjQyNjQ3NTUyNDkwMjN9LHsieCI6ODQzLjAxNTYyNSwieSI6NTczLjQyNjQ3NTUyNDkwMjN9LHsieCI6ODAyLjAxNjkwMjA0MzI2OTMsInkiOjU5OC40MjY0NzU1MjQ5MDIzfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M757.738%2c652.426L757.738%2c656.593C757.738%2c660.76%2c757.738%2c669.093%2c814.112%2c679.426C870.486%2c689.76%2c983.233%2c702.093%2c1045.436%2c713.96C1107.64%2c725.828%2c1119.299%2c737.229%2c1125.129%2c742.929L1130.958%2c748.63&amp;#x27; id=&amp;#x27;mermaid-0-L_IAP_SvcA_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_IAP_SvcA_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NzU3LjczODI4MTI1LCJ5Ijo2NTIuNDI2NDc1NTI0OTAyM30seyJ4Ijo3NTcuNzM4MjgxMjUsInkiOjY3Ny40MjY0NzU1MjQ5MDIzfSx7IngiOjEwOTUuOTgwNDY4NzUsInkiOjcxNC40MjY0NzU1MjQ5MDIzfSx7IngiOjExMzMuODE4Mjk4MzM5ODQzOCwieSI6NzUxLjQyNjQ3NTUyNDkwMjN9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1161.43%2c805.426L1161.43%2c809.593C1161.43%2c813.76%2c1161.43%2c822.093%2c1161.43%2c832.426C1161.43%2c842.76%2c1161.43%2c855.093%2c1161.43%2c867.426C1161.43%2c879.76%2c1161.43%2c892.093%2c1171.999%2c902.194C1182.568%2c912.295%2c1203.706%2c920.163%2c1214.275%2c924.097L1224.844%2c928.031&amp;#x27; id=&amp;#x27;mermaid-0-L_SvcA_PEP2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SvcA_PEP2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTE2MS40Mjk2ODc1LCJ5Ijo4MDUuNDI2NDc1NTI0OTAyM30seyJ4IjoxMTYxLjQyOTY4NzUsInkiOjgzMC40MjY0NzU1MjQ5MDIzfSx7IngiOjExNjEuNDI5Njg3NSwieSI6ODY3LjQyNjQ3NTUyNDkwMjN9LHsieCI6MTE2MS40Mjk2ODc1LCJ5Ijo5MDQuNDI2NDc1NTI0OTAyM30seyJ4IjoxMjI4LjU5Mjc3MzQzNzUsInkiOjkyOS40MjY0NzU1MjQ5MDIzfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1387.523%2c929.426L1393.309%2c925.26C1399.095%2c921.093%2c1410.667%2c912.76%2c1416.452%2c902.426C1422.238%2c892.093%2c1422.238%2c879.76%2c1422.238%2c867.426C1422.238%2c855.093%2c1422.238%2c842.76%2c1422.238%2c827.926C1422.238%2c813.093%2c1422.238%2c795.76%2c1422.238%2c776.426C1422.238%2c757.093%2c1422.238%2c735.76%2c1422.238%2c718.926C1422.238%2c702.093%2c1422.238%2c689.76%2c1422.238%2c674.926C1422.238%2c660.093%2c1422.238%2c642.76%2c1422.238%2c625.426C1422.238%2c608.093%2c1422.238%2c590.76%2c1422.238%2c575.926C1422.238%2c561.093%2c1422.238%2c548.76%2c1422.238%2c536.426C1422.238%2c524.093%2c1422.238%2c511.76%2c1378.532%2c499.838C1334.826%2c487.916%2c1247.413%2c476.405%2c1203.707%2c470.649L1160.001%2c464.894&amp;#x27; id=&amp;#x27;mermaid-0-L_PEP2_PDP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_PEP2_PDP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTM4Ny41MjMwMTAyNTM5MDYyLCJ5Ijo5MjkuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo5MDQuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo4NjcuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo4MzAuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo3NzguNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo3MTQuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo2NzcuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo2MjUuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo1NzMuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo1MzYuNDI2NDc1NTI0OTAyM30seyJ4IjoxNDIyLjIzODI4MTI1LCJ5Ijo0OTkuNDI2NDc1NTI0OTAyMzR9LHsieCI6MTE1Ni4wMzUxNTYyNSwieSI6NDY0LjM3MTYxMzUyMDc0NzY0fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1333.367%2c1007.426L1333.367%2c1011.593C1333.367%2c1015.76%2c1333.367%2c1024.093%2c1382.653%2c1034.426C1431.939%2c1044.76%2c1530.51%2c1057.093%2c1591.921%2c1069.136C1653.332%2c1081.178%2c1677.581%2c1092.93%2c1689.706%2c1098.806L1701.831%2c1104.682&amp;#x27; id=&amp;#x27;mermaid-0-L_PEP2_SvcB_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_PEP2_SvcB_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTMzMy4zNjcxODc1LCJ5IjoxMDA3LjQyNjQ3NTUyNDkwMjN9LHsieCI6MTMzMy4zNjcxODc1LCJ5IjoxMDMyLjQyNjQ3NTUyNDkwMjN9LHsieCI6MTYyOS4wODIwMzEyNSwieSI6MTA2OS40MjY0NzU1MjQ5MDIzfSx7IngiOjE3MDUuNDMwNjY0MDYyNSwieSI6MTEwNi40MjY0NzU1MjQ5MDIzfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1226.879%2c652.426L1226.879%2c656.593C1226.879%2c660.76%2c1226.879%2c669.093%2c1226.879%2c679.426C1226.879%2c689.76%2c1226.879%2c702.093%2c1221.049%2c713.96C1215.22%2c725.828%2c1203.56%2c737.229%2c1197.731%2c742.929L1191.901%2c748.63&amp;#x27; id=&amp;#x27;mermaid-0-L_SPIRE1_SvcA_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SPIRE1_SvcA_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTIyNi44Nzg5MDYyNSwieSI6NjUyLjQyNjQ3NTUyNDkwMjN9LHsieCI6MTIyNi44Nzg5MDYyNSwieSI6Njc3LjQyNjQ3NTUyNDkwMjN9LHsieCI6MTIyNi44Nzg5MDYyNSwieSI6NzE0LjQyNjQ3NTUyNDkwMjN9LHsieCI6MTE4OS4wNDEwNzY2NjAxNTYyLCJ5Ijo3NTEuNDI2NDc1NTI0OTAyM31d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1761.145%2c995.426L1761.145%2c1001.593C1761.145%2c1007.76%2c1761.145%2c1020.093%2c1761.145%2c1032.426C1761.145%2c1044.76%2c1761.145%2c1057.093%2c1761.145%2c1068.76C1761.145%2c1080.426%2c1761.145%2c1091.426%2c1761.145%2c1096.926L1761.145%2c1102.426&amp;#x27; id=&amp;#x27;mermaid-0-L_SPIRE2_SvcB_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_SPIRE2_SvcB_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTc2MS4xNDQ1MzEyNSwieSI6OTk1LjQyNjQ3NTUyNDkwMjN9LHsieCI6MTc2MS4xNDQ1MzEyNSwieSI6MTAzMi40MjY0NzU1MjQ5MDIzfSx7IngiOjE3NjEuMTQ0NTMxMjUsInkiOjEwNjkuNDI2NDc1NTI0OTAyM30seyJ4IjoxNzYxLjE0NDUzMTI1LCJ5IjoxMTA2LjQyNjQ3NTUyNDkwMjN9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(383.234375%2c 149)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_U1_IdP_0&amp;#x27; transform=&amp;#x27;translate(-45.25%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;90.5&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eauthenticate%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(642.1171875%2c 149)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_U2_IdP_0&amp;#x27; transform=&amp;#x27;translate(-45.25%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;90.5&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eauthenticate%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(842.90625%2c 383.42647552490234)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Posture_PDP_0&amp;#x27; transform=&amp;#x27;translate(-51.0390625%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;102.078125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eposture signal%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1157.71875%2c 383.42647552490234)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_IdP_PDP_0&amp;#x27; transform=&amp;#x27;translate(-62.3828125%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;124.765625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eidentity assertion%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Store_PDP_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(91.8671875%2c 383.42647552490234)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_U1_IAP_0&amp;#x27; transform=&amp;#x27;translate(-56.828125%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;113.65625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3erequest %2b token%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(938.9765625%2c 536.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_IAP_PDP_0&amp;#x27; transform=&amp;#x27;translate(-37.75%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;75.5&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eauthorize%3f%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(843.015625%2c 536.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_PDP_IAP_0&amp;#x27; transform=&amp;#x27;translate(-38.2109375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;76.421875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eallow/deny%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1095.98046875%2c 714.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_IAP_SvcA_0&amp;#x27; transform=&amp;#x27;translate(-68.3046875%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;136.609375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eallowed traffic only%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1161.4296875%2c 867.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SvcA_PEP2_0&amp;#x27; transform=&amp;#x27;translate(-88.453125%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;176.90625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3erequest%2c SVID presented%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1422.23828125%2c 714.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_PEP2_PDP_0&amp;#x27; transform=&amp;#x27;translate(-37.75%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;75.5&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eauthorize%3f%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1629.08203125%2c 1069.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_PEP2_SvcB_0&amp;#x27; transform=&amp;#x27;translate(-69.46875%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;138.9375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3emTLS%2c allowed only%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1226.87890625%2c 714.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SPIRE1_SvcA_0&amp;#x27; transform=&amp;#x27;translate(-42.59375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;85.1875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eissues SVID%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1761.14453125%2c 1069.4264755249023)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_SPIRE2_SvcB_0&amp;#x27; transform=&amp;#x27;translate(-42.59375%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;85.1875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eissues SVID%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-U1-0&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(135.734375%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-92.734375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;185.46875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-62.734375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;125.46875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eEmployee Laptop%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-U2-1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(642.1171875%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-95.921875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;191.84375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-65.921875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;131.84375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eContractor Device%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-IdP-2&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(586.8671875%2c 266.2132377624512)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eIdentity Provider - Okta/Entra/Ping%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Posture-3&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(276.8671875%2c 266.2132377624512)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eDevice Posture Signal - EDR/MDM%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-PDP-4&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1027.35546875%2c 447.42647552490234)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-128.6796875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;257.359375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-98.6796875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;197.359375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePolicy Decision Point - PDP%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Store-5&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1402.1796875%2c 266.2132377624512)&amp;#x27;%3e%3cpath d=&amp;#x27;M0%2c15.808823529411764 a107.5%2c15.808823529411764 0%2c0%2c0 215%2c0 a107.5%2c15.808823529411764 0%2c0%2c0 -215%2c0 l0%2c78.80882352941177 a107.5%2c15.808823529411764 0%2c0%2c0 215%2c0 l0%2c-78.80882352941177&amp;#x27; class=&amp;#x27;basic label-container outer-path&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-107.5%2c -55.21323529411765)&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -14)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePolicy Store - versioned%2c as code%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-IAP-6&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(757.73828125%2c 625.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-127.3125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;254.625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-97.3125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;194.625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eIdentity-Aware Proxy - PEP%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SPIRE1-7&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1226.87890625%2c 625.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-102.609375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;205.21875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-72.609375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;145.21875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSPIFFE/SPIRE Agent%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SvcA-8&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1161.4296875%2c 778.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-64.3515625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;128.703125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-34.3515625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;68.703125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eService A%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SPIRE2-9&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1761.14453125%2c 968.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-102.609375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;205.21875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-72.609375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;145.21875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSPIFFE/SPIRE Agent%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SvcB-10&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1761.14453125%2c 1133.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-64.21875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;128.4375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-34.21875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;68.4375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eService B%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-PEP2-11&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1333.3671875%2c 968.4264755249023)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePEP - eBPF/Cilium or mesh sidecar%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow&amp;#x27; height=&amp;#x27;130%25&amp;#x27; width=&amp;#x27;130%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;4&amp;#x27; dy=&amp;#x27;4&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow-small&amp;#x27; height=&amp;#x27;150%25&amp;#x27; width=&amp;#x27;150%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;2&amp;#x27; dy=&amp;#x27;2&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3clinearGradient id=&amp;#x27;mermaid-0-gradient&amp;#x27; gradientUnits=&amp;#x27;objectBoundingBox&amp;#x27; x1=&amp;#x27;0%25&amp;#x27; y1=&amp;#x27;0%25&amp;#x27; x2=&amp;#x27;100%25&amp;#x27; y2=&amp;#x27;0%25&amp;#x27;%3e%3cstop offset=&amp;#x27;0%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 83.3333333333%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3cstop offset=&amp;#x27;100%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 88.9215686275%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3c/linearGradient%3e%3c/svg%3e&quot; title=&quot;Identity, policy decisions, and Zero Trust enforcement&quot; width=&quot;1906.75390625&quot;&gt;
&lt;p&gt;The distinction most half-finished rollouts get muddled: &lt;strong&gt;policy decision&lt;/strong&gt; and &lt;strong&gt;policy enforcement&lt;/strong&gt; are different responsibilities. Conflating them is why so many zero trust projects turn into an unmaintainable pile of duplicated, drifting rules across a dozen products.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity Provider (IdP)&lt;/strong&gt;: Okta, Azure AD/Entra, Ping, etc. Authenticates humans and, increasingly, is the source of truth for device posture via EDR/MDM integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy Decision Point (PDP)&lt;/strong&gt;: the brain. Given an identity, a posture signal, a requested resource, and context (time, risk score, request type), it returns allow or deny. Implemented as an OPA-based service, a cloud provider’s policy engine, or a ZTNA vendor’s control plane.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy Enforcement Points (PEPs)&lt;/strong&gt; are the muscle, placed everywhere traffic actually flows: an identity-aware proxy at the edge for user-to-app traffic, and eBPF- or sidecar-based enforcement between services for east-west traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workload identity&lt;/strong&gt;: SPIFFE/SPIRE (or a mesh’s built-in equivalent) issues short-lived cryptographic identities (SVIDs) to workloads, independent of IP address. East-west PEPs check &lt;em&gt;that&lt;/em&gt; identity, not source subnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsegmentation&lt;/strong&gt;: workloads are grouped by identity and label into segments where communication is deny-by-default and explicitly allow-listed, so a compromised pod in one segment can’t reach a database in another without a policy that says it can.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;decision-criteria-perimetervpn-vs-managed-ztnasase-vs-self-hosted-microsegmentation&quot;&gt;Decision criteria: perimeter/VPN vs managed ZTNA/SASE vs self-hosted microsegmentation&lt;/h2&gt;
&lt;p&gt;Before picking a product, be honest about which model actually fits your team’s operational reality.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Perimeter/VPN&lt;/th&gt;
&lt;th&gt;Managed ZTNA/SASE&lt;/th&gt;
&lt;th&gt;Self-Hosted Microsegmentation (IAP + mesh/eBPF)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security model&lt;/td&gt;
&lt;td&gt;Implicit trust once connected; network location = trust&lt;/td&gt;
&lt;td&gt;Identity-aware per-app access, brokered by vendor control plane&lt;/td&gt;
&lt;td&gt;Identity-aware, policy enforced in-house at edge and east-west&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blast radius&lt;/td&gt;
&lt;td&gt;Large: flat network behind the VPN, broad lateral movement&lt;/td&gt;
&lt;td&gt;Contained per-app, but bounded by how granular the vendor’s policy model actually gets&lt;/td&gt;
&lt;td&gt;Smallest, if microsegmentation and workload identity are implemented correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Low once connected, but concentrator hairpin adds overhead&lt;/td&gt;
&lt;td&gt;Depends on vendor PoP density; extra hop through vendor cloud&lt;/td&gt;
&lt;td&gt;Lowest for east-west (in-cluster/eBPF); edge adds one proxy hop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;Low to maintain, but rules rot into an unauditable mess over years&lt;/td&gt;
&lt;td&gt;Low: vendor manages PDP, PEP, and posture integration&lt;/td&gt;
&lt;td&gt;High: you own PDP uptime, PEP rollout, identity issuance, and policy lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Low license cost, high hidden cost of breaches and audit findings&lt;/td&gt;
&lt;td&gt;Per-user/per-app subscription; scales with headcount and app count&lt;/td&gt;
&lt;td&gt;Engineering time is the real cost; infrastructure itself is often open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor lock-in&lt;/td&gt;
&lt;td&gt;Low, but the security debt is its own lock-in&lt;/td&gt;
&lt;td&gt;High: policy logic, posture signals, and often identity live in the vendor’s control plane&lt;/td&gt;
&lt;td&gt;Low: SPIFFE, OPA, and Cilium/Envoy are portable, standards-based building blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Legacy environments not yet ready to change, as a bridge, not a destination&lt;/td&gt;
&lt;td&gt;Teams that want managed simplicity and don’t have platform security headcount to spare&lt;/td&gt;
&lt;td&gt;Teams with platform engineering capacity who need fine-grained east-west control and want to avoid control-plane lock-in&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The heuristic I use: if you don’t have a platform team that already owns Kubernetes networking or service mesh operations, don’t self-host microsegmentation as your first move. You’ll spend a year building PDP/PEP plumbing instead of shipping policy. Start with managed ZTNA/SASE for user-to-app access, and reserve self-hosted microsegmentation for east-west traffic between your own services, where you already have the operational muscle and the vendor’s edge-only model doesn’t reach anyway. The two are not mutually exclusive. Most mature environments I’ve built end up running both, with a shared PDP contract between them.&lt;/p&gt;
&lt;h2 id=&quot;policy-in-practice-identity-aware-microsegmentation-with-cilium&quot;&gt;Policy in practice: identity-aware microsegmentation with Cilium&lt;/h2&gt;
&lt;p&gt;Here’s a representative &lt;code&gt;CiliumNetworkPolicy&lt;/code&gt; enforcing microsegmentation by workload identity rather than IP or subnet. The &lt;code&gt;orders&lt;/code&gt; service can only be reached by the &lt;code&gt;payments&lt;/code&gt; service, on a specific port, at L7, and only when Cilium has verified the caller’s identity via its own security-identity mechanism (derived from Kubernetes labels/ServiceAccount, not source address).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;cilium.io/v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;CiliumNetworkPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;orders-allow-from-payments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  namespace&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  endpointSelector&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    matchLabels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      app&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;orders-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  ingress&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;fromEndpoints&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;matchLabels&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;            app&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;            io.kubernetes.pod.namespace&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;payments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      toPorts&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;ports&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;8443&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;              protocol&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;TCP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;          rules&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;            http&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;              - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;method&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;                path&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;/v1/orders/reserve&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # Deny everything else implicitly: Cilium network policies are&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # default-deny once any policy selects an endpoint.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cilium derives a &lt;strong&gt;security identity&lt;/strong&gt; from workload labels and uses it for network policy. Its L3/L4 checks run in the eBPF datapath. The HTTP method and path in this example require &lt;a href=&quot;https://docs.cilium.io/en/stable/security/policy/layer7/&quot;&gt;Cilium&apos;s Layer 7 proxy handling&lt;/a&gt;. Port 8443 alone does not configure TLS or make encrypted HTTP visible to that proxy; configure a supported TLS visibility path when inspecting HTTPS. Workload authentication and transport encryption need their own configuration. For example, services can use SPIFFE/SPIRE-issued X.509 SVIDs to establish mutual TLS. Check the authentication and encryption guarantees of your deployed Cilium release separately from this authorization policy.&lt;/p&gt;
&lt;p&gt;For the PDP layer itself (the decision that gates edge, user-facing access), a short Rego rule shows the shape of the logic an OPA-based PDP evaluates on every request:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rego&quot;&gt;package authz

default allow = false

# Allow if the user&apos;s role can access the resource, their device posture
# is compliant, and the request isn&apos;t a stale/expired session.
allow {
    input.user.role == &quot;finance-analyst&quot;
    input.resource.name == &quot;billing-api&quot;
    input.device.posture == &quot;compliant&quot;
    time.now_ns() &amp;#x3C; input.session.expires_at_ns
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing exotic. That’s the point. The PDP should be boring, testable, and versioned like application code, because it is the single place every access decision in the system ultimately traces back to.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-and-what-id-do-in-production&quot;&gt;Pitfalls and what I’d do in production&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Don’t try to boil the ocean.&lt;/strong&gt; A big-bang “segment everything, enforce mTLS everywhere, migrate the whole IdP” rollout is how zero trust programs die in year two. What I’d do: phase it. Start with edge, user-to-app access behind an identity-aware proxy for your highest-risk applications, then extend to east-west for your most sensitive service-to-service paths (payments, PII stores), then broaden. Six months of narrow, working zero trust beats eighteen months of broad, half-finished zero trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your identity provider is now tier-0 infrastructure.&lt;/strong&gt; When every access decision (human and increasingly workload) traces back to the IdP and PDP, an IdP outage doesn’t just block logins, it can block your entire access-control fabric. What I’d do: treat IdP and PDP availability like you’d treat DNS or your BGP edge: redundant, monitored with real SLOs, and with a documented behavior for what happens to in-flight requests during an outage (fail closed for new requests is usually correct; fail open is rarely acceptable once you’ve made this claim to auditors).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Policy sprawl is the silent killer.&lt;/strong&gt; Policies accumulate across the IAP, the PDP, the mesh, and half-remembered legacy firewall rules nobody dares delete. Six months in, nobody can answer “who can reach the billing database” with confidence. What I’d do: policy-as-code from day one, in version control, with CI checks that diff policy changes and a quarterly access review that actually revokes what it finds unused, not just a report that gets filed away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Break-glass access needs to exist and be audited harder than normal access.&lt;/strong&gt; Zero trust done rigidly enough will lock out the on-call engineer during an actual incident. What I’d do: build an explicit, time-boxed break-glass path: separate credentials, mandatory second-approver or post-hoc review, and an alert that fires the moment it’s used. The absence of a break-glass path isn’t more secure, it just means someone will improvise one under pressure, unaudited.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Log every PDP decision, both allow and deny.&lt;/strong&gt; Denies get logged reflexively; allows often don’t, and allows are exactly what you need during an incident to reconstruct what a compromised identity actually touched. What I’d do: every PDP decision, both directions, streamed to your SIEM with enough context (identity, resource, posture, policy version) to reconstruct a full access timeline without guessing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enforcement adds latency. Measure it, don’t assume it away.&lt;/strong&gt; A PDP round-trip or proxy processing adds work to the request path. What I’d do: cache PDP decisions at the PEP for short, bounded windows where staleness risk is acceptable, and benchmark the actual enforcement path. Cilium&apos;s L3/L4 path and the HTTP proxy path used by the example above have different costs. Include TLS handling and application traffic in that measurement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Legacy apps that can’t do mTLS or modern auth are your long pole, not an excuse to skip them.&lt;/strong&gt; What I’d do: front them with a gateway or proxy that terminates modern auth and mTLS on their behalf, place them in their own tightly-scoped, elevated-monitoring segment, and treat that segment as a known, bounded exception, not a silent gap in the architecture diagram.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://csrc.nist.gov/pubs/sp/800/207/final&quot;&gt;NIST SP 800-207: Zero Trust Architecture&lt;/a&gt;. Resource-focused access decisions and policy decision and enforcement components.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spiffe.io/docs/latest/spiffe-about/overview/&quot;&gt;SPIFFE overview&lt;/a&gt;. Workload identities, SVIDs, and authentication across environments.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/security/policy/layer7/&quot;&gt;Cilium Layer 7 policies&lt;/a&gt;. HTTP policy semantics and proxy requirements.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/security/tls-visibility/&quot;&gt;Cilium TLS visibility&lt;/a&gt;. Inspecting encrypted traffic for application-layer policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/topics/zero-trust-platform-security/&quot;&gt;Zero Trust&lt;/a&gt;: the full pillar on identity-aware security architecture&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;: networking design for modern, multi-cloud platforms&lt;/li&gt;
&lt;li&gt;SPIFFE/SPIRE for Multi-Cluster Workload Identity: coming soon, issuing and rotating workload identity across Kubernetes clusters&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/service-mesh-vs-ebpf-native-data-planes-how-to-choose/&quot;&gt;Service Mesh vs eBPF-Native Data Planes: How to Choose&lt;/a&gt;: the head-to-head on sidecar vs sidecar-less policy enforcement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lets-talk-zero-trust&quot;&gt;Let’s talk zero trust&lt;/h2&gt;
&lt;p&gt;If you’re designing a zero trust rollout and want a second opinion on where to draw the PDP/PEP boundaries, or how much to self-host versus buy, I’m happy to compare notes. Connect with me on &lt;a href=&quot;https://www.linkedin.com/in/vkafed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; or reach out via &lt;a href=&quot;/contact/&quot;&gt;Contact&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Zero Trust</category><category>Networking</category></item><item><title>eBPF in Production: Kernel-Level Observability and Security</title><link>https://vkafed.com/ebpf-in-production-kernel-level-observability-and-security/</link><guid isPermaLink="true">https://vkafed.com/ebpf-in-production-kernel-level-observability-and-security/</guid><description>Use eBPF for kernel-level observability and runtime security, with Cilium, Tetragon, bpftrace examples, and the trade-offs against sidecars and host agents.</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every platform team that has bolted a service mesh sidecar onto every pod eventually asks the same question: why run a full proxy per pod just to see and control traffic the kernel already handles? That question is what pushed a lot of us toward eBPF observability and security. Rather than stack another layer on top, you move visibility and enforcement into the kernel, at the same hook points the traffic and system calls already pass through.&lt;/p&gt;
&lt;p&gt;This is the architecture I reach for when a team’s sidecar mesh is eating double-digit percentages of fleet-wide CPU and memory, or when a security team needs process-level enforcement that a network-only agent can’t provide. It assumes you already know basic Linux networking and container runtime concepts. This is about applying eBPF to production observability and security, not an introduction to eBPF itself.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-why-sidecars-and-host-agents-miss-what-production-needs&quot;&gt;The problem: why sidecars and host agents miss what production needs&lt;/h2&gt;
&lt;p&gt;A sidecar-based service mesh solves a real problem (consistent mTLS, retries, and L7 routing without touching application code), but it does so by inserting a full userspace proxy into the request path of every pod. That has three costs that compound at scale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overhead is per-pod, not per-node.&lt;/strong&gt; A typical Envoy sidecar adds 50-100MB of memory and a meaningful CPU tax per pod, and every request now makes two extra hops (client-side proxy, server-side proxy) instead of zero. On a fleet running thousands of pods, that’s not a rounding error. It’s a standing tax you pay whether or not the mesh’s advanced routing features are in use that hour. Latency-sensitive services feel it directly: 1-2ms per proxy hop doesn’t sound like much until it’s stacked twice on every call in a deep service graph.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sidecars only see what passes through them.&lt;/strong&gt; A proxy can only inspect traffic that’s actually routed through it. Traffic that bypasses the proxy (raw sockets, UDP flows some meshes don’t intercept, traffic between processes on the same host outside the mesh’s iptables/nftables redirect rules) is invisible. And a sidecar has zero visibility into what’s happening inside the container’s process tree: which binary executed, which file got opened, whether a shell spawned unexpectedly inside a database pod. That’s a security blind spot, worse than a mere observability gap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traditional host agents trade depth for compatibility, and usually lose both.&lt;/strong&gt; Kernel modules give deep visibility but require per-kernel-version builds and carry real crash risk if buggy: a bad kernel module panics the box. Userspace agents that poll &lt;code&gt;/proc&lt;/code&gt;, tail logs, or sample syscalls trade accuracy for safety: you get eventual, incomplete signal instead of an accurate event stream, and high-frequency polling itself adds load.&lt;/p&gt;
&lt;p&gt;eBPF runs small programs at kernel hook points such as kprobes, tracepoints, XDP, and LSM hooks. The verifier checks program state and memory access before loading and rejects programs that violate its rules. Those checks reduce risk; they do not replace kernel patching or testing. CO-RE helps compiled programs adapt to kernel data layouts. Kernel support, hook availability, and the behavior of the chosen tools still need validation on the hosts where they will run.&lt;/p&gt;
&lt;h2 id=&quot;reference-architecture-an-ebpf-data-plane-without-sidecars&quot;&gt;Reference architecture: an eBPF data plane without sidecars&lt;/h2&gt;
&lt;p&gt;The setup I keep landing on: eBPF programs attached directly to kernel hook points on every node, feeding both a network policy path and an observability/security event path, with a single node agent (Cilium for networking, Tetragon for runtime security, often deployed together) doing the userspace coordination. No per-pod proxy anywhere in the diagram.&lt;/p&gt;
&lt;img alt=&quot;Pod and host workloads reach Linux kernel hook points. Verified eBPF programs use these hooks for network policy and process tracing. Programs store identity, policy, and connection state in hash maps and send tracing events to a ring buffer. A Cilium or Tetragon node agent reads the maps and events, sends telemetry to observability tools and the SIEM, and updates policy maps without reloading programs.&quot; height=&quot;1087&quot; id=&quot;mermaid-0&quot; src=&quot;data:image/svg+xml,%3csvg id=&amp;#x27;mermaid-0&amp;#x27; width=&amp;#x27;100%25&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; xmlns:xlink=&amp;#x27;http://www.w3.org/1999/xlink&amp;#x27; class=&amp;#x27;flowchart&amp;#x27; style=&amp;#x27;max-width: 1761.3203125px%3b&amp;#x27; viewBox=&amp;#x27;0 0 1761.3203125 1087&amp;#x27; role=&amp;#x27;graphics-document document&amp;#x27; aria-roledescription=&amp;#x27;flowchart-v2&amp;#x27; aria-describedby=&amp;#x27;chart-desc-mermaid-0&amp;#x27; aria-labelledby=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3e%3ctitle id=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3eeBPF observability and security without sidecars%3c/title%3e%3cdesc id=&amp;#x27;chart-desc-mermaid-0&amp;#x27;%3ePod and host workloads reach Linux kernel hook points. Verified eBPF programs use these hooks for network policy and process tracing. Programs store identity%2c policy%2c and connection state in hash maps and send tracing events to a ring buffer. A Cilium or Tetragon node agent reads the maps and events%2c sends telemetry to observability tools and the SIEM%2c and updates policy maps without reloading programs.%3c/desc%3e%3cstyle%3e%23mermaid-0%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3bfill:black%3b%7d%40keyframes edge-animation-frame%7bfrom%7bstroke-dashoffset:0%3b%7d%7d%40keyframes dash%7bto%7bstroke-dashoffset:0%3b%7d%7d%23mermaid-0 .edge-animation-slow%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 50s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .edge-animation-fast%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 20s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .error-icon%7bfill:%23552222%3b%7d%23mermaid-0 .error-text%7bfill:%23552222%3bstroke:%23552222%3b%7d%23mermaid-0 .edge-thickness-normal%7bstroke-width:1px%3b%7d%23mermaid-0 .edge-thickness-thick%7bstroke-width:3.5px%3b%7d%23mermaid-0 .edge-pattern-solid%7bstroke-dasharray:0%3b%7d%23mermaid-0 .edge-thickness-invisible%7bstroke-width:0%3bfill:none%3b%7d%23mermaid-0 .edge-pattern-dashed%7bstroke-dasharray:3%3b%7d%23mermaid-0 .edge-pattern-dotted%7bstroke-dasharray:2%3b%7d%23mermaid-0 .marker%7bfill:%23666%3bstroke:%23666%3b%7d%23mermaid-0 .marker.cross%7bstroke:%23666%3b%7d%23mermaid-0 svg%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3b%7d%23mermaid-0 p%7bmargin:0%3b%7d%23mermaid-0 .label%7bfont-family:system-ui%2csans-serif%3bcolor:black%3b%7d%23mermaid-0 .cluster-label text%7bfill:%23333%3b%7d%23mermaid-0 .cluster-label span%7bcolor:%23333%3b%7d%23mermaid-0 .cluster-label span p%7bbackground-color:transparent%3b%7d%23mermaid-0 .label text%2c%23mermaid-0 span%7bfill:black%3bcolor:black%3b%7d%23mermaid-0 .node rect%2c%23mermaid-0 .node circle%2c%23mermaid-0 .node ellipse%2c%23mermaid-0 .node polygon%2c%23mermaid-0 .node path%7bfill:%23eee%3bstroke:%23999%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label text%2c%23mermaid-0 .node .label text%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-anchor:middle%3b%7d%23mermaid-0 .node .katex path%7bfill:black%3bstroke:black%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label%2c%23mermaid-0 .node .label%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-align:center%3b%7d%23mermaid-0 .node.clickable%7bcursor:pointer%3b%7d%23mermaid-0 .root .anchor path%7bfill:%23666!important%3bstroke-width:0%3bstroke:%23666%3b%7d%23mermaid-0 .arrowheadPath%7bfill:%23333333%3b%7d%23mermaid-0 .edgePaths .path%7bstroke:%23666%3bstroke-width:1px%3b%7d%23mermaid-0 .flowchart-link%7bstroke:%23666%3bfill:none%3b%7d%23mermaid-0 .edgeLabel%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .edgeLabel p%7bbackground-color:white%3b%7d%23mermaid-0 .edgeLabel rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .labelBkg%7bbackground-color:rgba(255%2c 255%2c 255%2c 0.5)%3b%7d%23mermaid-0 .cluster rect%7bfill:hsl(0%2c 0%25%2c 98.9215686275%25)%3bstroke:%23707070%3bstroke-width:1px%3b%7d%23mermaid-0 .cluster text%7bfill:%23333%3b%7d%23mermaid-0 .cluster span%7bcolor:%23333%3b%7d%23mermaid-0 .node .collapsed-indicator%7bfill:%23707070%3bstroke:none%3bopacity:0.6%3b%7d%23mermaid-0 .node .collapsed-separator%7bstroke:%23707070%3bstroke-width:0.75px%3b%7d%23mermaid-0 div.mermaidTooltip%7bposition:absolute%3btext-align:center%3bmax-width:200px%3bpadding:2px%3bfont-family:system-ui%2csans-serif%3bfont-size:12px%3bbackground:hsl(-160%2c 0%25%2c 93.3333333333%25)%3bborder:1px solid %23707070%3bborder-radius:2px%3bpointer-events:none%3bz-index:100%3b%7d%23mermaid-0 .flowchartTitleText%7btext-anchor:middle%3bfont-size:18px%3bfill:black%3b%7d%23mermaid-0 rect.text%7bfill:none%3bstroke-width:0%3b%7d%23mermaid-0 .icon-shape%2c%23mermaid-0 .image-shape%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .icon-shape p%2c%23mermaid-0 .image-shape p%7bbackground-color:white%3bpadding:2px%3b%7d%23mermaid-0 .icon-shape .label rect%2c%23mermaid-0 .image-shape .label rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .label-icon%7bdisplay:inline-block%3bheight:1em%3boverflow:visible%3bvertical-align:-0.125em%3b%7d%23mermaid-0 .node .label-icon path%7bfill:currentColor%3bstroke:revert%3bstroke-width:revert%3b%7d%23mermaid-0 .node .neo-node%7bstroke:%23999%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.cluster rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node polygon%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.swimlane.cluster rect%7bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node path%7bstroke:url(%23mermaid-0-gradient)%3bstroke-width:1px%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .outer-path%7bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .neo-line path%7bstroke:%23999%3bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle .state-start%7bfill:black%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon%7bfill:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon-neo path%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 :root%7b--mermaid-font-family:system-ui%2csans-serif%3b%7d%3c/style%3e%3cg%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 10 5 L 0 10 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;4.5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 5 L 10 10 L 10 0 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;11.5&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;10.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 11.5 7 L 0 14 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;1&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpolygon points=&amp;#x27;0%2c7 11.5%2c14 11.5%2c0&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;11&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refY=&amp;#x27;5&amp;#x27; refX=&amp;#x27;12.25&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-2&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;12&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;17.7&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;-3.5&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cg class=&amp;#x27;root&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Control&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1087.3046875&amp;#x27; y=&amp;#x27;647&amp;#x27; width=&amp;#x27;666.015625&amp;#x27; height=&amp;#x27;432&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1296.1484375%2c 647)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;248.328125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eUserspace Control %2b Observability%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Maps&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;213.703125&amp;#x27; y=&amp;#x27;518&amp;#x27; width=&amp;#x27;853.6015625&amp;#x27; height=&amp;#x27;561&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(604.10546875%2c 518)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;72.796875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eBPF Maps%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-BPFProg&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;65.25390625&amp;#x27; y=&amp;#x27;340&amp;#x27; width=&amp;#x27;1344.15234375&amp;#x27; height=&amp;#x27;128&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(595.041015625%2c 340)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;284.578125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eeBPF Programs - verified%2c JIT-compiled%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Kernel&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;162&amp;#x27; width=&amp;#x27;1546.40625&amp;#x27; height=&amp;#x27;128&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(685.4375%2c 162)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;191.53125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eLinux Kernel - Hook Points%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Workloads&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;625.28125&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;877.1015625&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(928.33984375%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;270.984375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod / Process Workloads - no sidecar%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M769.406%2c87L769.406%2c91.167C769.406%2c95.333%2c769.406%2c103.667%2c769.406%2c112C769.406%2c120.333%2c769.406%2c128.667%2c769.406%2c137C769.406%2c145.333%2c769.406%2c153.667%2c769.406%2c161.333C769.406%2c169%2c769.406%2c176%2c769.406%2c179.5L769.406%2c183&amp;#x27; id=&amp;#x27;mermaid-0-L_P1_KP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_P1_KP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NzY5LjQwNjI1LCJ5Ijo4N30seyJ4Ijo3NjkuNDA2MjUsInkiOjExMn0seyJ4Ijo3NjkuNDA2MjUsInkiOjEzN30seyJ4Ijo3NjkuNDA2MjUsInkiOjE2Mn0seyJ4Ijo3NjkuNDA2MjUsInkiOjE4N31d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1079.406%2c87L1079.406%2c91.167C1079.406%2c95.333%2c1079.406%2c103.667%2c1079.406%2c112C1079.406%2c120.333%2c1079.406%2c128.667%2c1079.406%2c137C1079.406%2c145.333%2c1079.406%2c153.667%2c1079.406%2c161.333C1079.406%2c169%2c1079.406%2c176%2c1079.406%2c179.5L1079.406%2c183&amp;#x27; id=&amp;#x27;mermaid-0-L_P2_TP_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_P2_TP_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTA3OS40MDYyNSwieSI6ODd9LHsieCI6MTA3OS40MDYyNSwieSI6MTEyfSx7IngiOjEwNzkuNDA2MjUsInkiOjEzN30seyJ4IjoxMDc5LjQwNjI1LCJ5IjoxNjJ9LHsieCI6MTA3OS40MDYyNSwieSI6MTg3fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1389.406%2c87L1389.406%2c91.167C1389.406%2c95.333%2c1389.406%2c103.667%2c1389.406%2c112C1389.406%2c120.333%2c1389.406%2c128.667%2c1389.406%2c137C1389.406%2c145.333%2c1389.406%2c153.667%2c1389.406%2c161.333C1389.406%2c169%2c1389.406%2c176%2c1389.406%2c179.5L1389.406%2c183&amp;#x27; id=&amp;#x27;mermaid-0-L_P3_LSM_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_P3_LSM_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTM4OS40MDYyNSwieSI6ODd9LHsieCI6MTM4OS40MDYyNSwieSI6MTEyfSx7IngiOjEzODkuNDA2MjUsInkiOjEzN30seyJ4IjoxMzg5LjQwNjI1LCJ5IjoxNjJ9LHsieCI6MTM4OS40MDYyNSwieSI6MTg3fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M769.406%2c265L769.406%2c269.167C769.406%2c273.333%2c769.406%2c281.667%2c769.406%2c290C769.406%2c298.333%2c769.406%2c306.667%2c769.406%2c315C769.406%2c323.333%2c769.406%2c331.667%2c779.262%2c339.754C789.118%2c347.841%2c808.829%2c355.681%2c818.685%2c359.601L828.54%2c363.522&amp;#x27; id=&amp;#x27;mermaid-0-L_KP_B2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_KP_B2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NzY5LjQwNjI1LCJ5IjoyNjV9LHsieCI6NzY5LjQwNjI1LCJ5IjoyOTB9LHsieCI6NzY5LjQwNjI1LCJ5IjozMTV9LHsieCI6NzY5LjQwNjI1LCJ5IjozNDB9LHsieCI6ODMyLjI1NzIwMjE0ODQzNzUsInkiOjM2NX1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1079.406%2c265L1079.406%2c269.167C1079.406%2c273.333%2c1079.406%2c281.667%2c1079.406%2c290C1079.406%2c298.333%2c1079.406%2c306.667%2c1079.406%2c315C1079.406%2c323.333%2c1079.406%2c331.667%2c1070.312%2c339.737C1061.217%2c347.807%2c1043.028%2c355.615%2c1033.934%2c359.519L1024.839%2c363.422&amp;#x27; id=&amp;#x27;mermaid-0-L_TP_B2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_TP_B2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTA3OS40MDYyNSwieSI6MjY1fSx7IngiOjEwNzkuNDA2MjUsInkiOjI5MH0seyJ4IjoxMDc5LjQwNjI1LCJ5IjozMTV9LHsieCI6MTA3OS40MDYyNSwieSI6MzQwfSx7IngiOjEwMjEuMTYzNDUyMTQ4NDM3NSwieSI6MzY1fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1389.406%2c265L1389.406%2c269.167C1389.406%2c273.333%2c1389.406%2c281.667%2c1389.406%2c290C1389.406%2c298.333%2c1389.406%2c306.667%2c1389.406%2c315C1389.406%2c323.333%2c1389.406%2c331.667%2c1335.216%2c343.388C1281.026%2c355.108%2c1172.646%2c370.217%2c1118.456%2c377.771L1064.266%2c385.325&amp;#x27; id=&amp;#x27;mermaid-0-L_LSM_B2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_LSM_B2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTM4OS40MDYyNSwieSI6MjY1fSx7IngiOjEzODkuNDA2MjUsInkiOjI5MH0seyJ4IjoxMzg5LjQwNjI1LCJ5IjozMTV9LHsieCI6MTM4OS40MDYyNSwieSI6MzQwfSx7IngiOjEwNjAuMzA0Njg3NSwieSI6Mzg1Ljg3NzY0ODI2MDAxODd9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M161.203%2c253L161.203%2c259.167C161.203%2c265.333%2c161.203%2c277.667%2c161.203%2c288C161.203%2c298.333%2c161.203%2c306.667%2c161.203%2c315C161.203%2c323.333%2c161.203%2c331.667%2c174.957%2c341.737C188.711%2c351.807%2c216.219%2c363.615%2c229.973%2c369.519L243.727%2c375.422&amp;#x27; id=&amp;#x27;mermaid-0-L_XDP_B1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_XDP_B1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTYxLjIwMzEyNSwieSI6MjUzfSx7IngiOjE2MS4yMDMxMjUsInkiOjI5MH0seyJ4IjoxNjEuMjAzMTI1LCJ5IjozMTV9LHsieCI6MTYxLjIwMzEyNSwieSI6MzQwfSx7IngiOjI0Ny40MDI0NjU4MjAzMTI1LCJ5IjozNzd9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M459.406%2c265L459.406%2c269.167C459.406%2c273.333%2c459.406%2c281.667%2c459.406%2c290C459.406%2c298.333%2c459.406%2c306.667%2c459.406%2c315C459.406%2c323.333%2c459.406%2c331.667%2c445.652%2c341.737C431.898%2c351.807%2c404.39%2c363.615%2c390.637%2c369.519L376.883%2c375.422&amp;#x27; id=&amp;#x27;mermaid-0-L_TC_B1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_TC_B1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NDU5LjQwNjI1LCJ5IjoyNjV9LHsieCI6NDU5LjQwNjI1LCJ5IjoyOTB9LHsieCI6NDU5LjQwNjI1LCJ5IjozMTV9LHsieCI6NDU5LjQwNjI1LCJ5IjozNDB9LHsieCI6MzczLjIwNjkwOTE3OTY4NzUsInkiOjM3N31d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M310.305%2c431L310.305%2c437.167C310.305%2c443.333%2c310.305%2c455.667%2c310.305%2c466C310.305%2c476.333%2c310.305%2c484.667%2c310.305%2c493C310.305%2c501.333%2c310.305%2c509.667%2c310.305%2c522.5C310.305%2c535.333%2c310.305%2c552.667%2c310.305%2c570C310.305%2c587.333%2c310.305%2c604.667%2c310.305%2c617.5C310.305%2c630.333%2c310.305%2c638.667%2c310.305%2c653.5C310.305%2c668.333%2c310.305%2c689.667%2c310.305%2c711C310.305%2c732.333%2c310.305%2c753.667%2c310.305%2c775C310.305%2c796.333%2c310.305%2c817.667%2c310.305%2c843C310.305%2c868.333%2c310.305%2c897.667%2c324.049%2c920.17C337.794%2c942.673%2c365.284%2c958.346%2c379.029%2c966.182L392.773%2c974.019&amp;#x27; id=&amp;#x27;mermaid-0-L_B1_M2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_B1_M2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MzEwLjMwNDY4NzUsInkiOjQzMX0seyJ4IjozMTAuMzA0Njg3NSwieSI6NDY4fSx7IngiOjMxMC4zMDQ2ODc1LCJ5Ijo0OTN9LHsieCI6MzEwLjMwNDY4NzUsInkiOjUxOH0seyJ4IjozMTAuMzA0Njg3NSwieSI6NTcwfSx7IngiOjMxMC4zMDQ2ODc1LCJ5Ijo2MjJ9LHsieCI6MzEwLjMwNDY4NzUsInkiOjY0N30seyJ4IjozMTAuMzA0Njg3NSwieSI6NzExfSx7IngiOjMxMC4zMDQ2ODc1LCJ5Ijo3NzV9LHsieCI6MzEwLjMwNDY4NzUsInkiOjgzOX0seyJ4IjozMTAuMzA0Njg3NSwieSI6OTI3fSx7IngiOjM5Ni4yNDgyNjg4MjEwMjI3NSwieSI6OTc2fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M930.305%2c443L930.305%2c447.167C930.305%2c451.333%2c930.305%2c459.667%2c930.305%2c468C930.305%2c476.333%2c930.305%2c484.667%2c930.305%2c493C930.305%2c501.333%2c930.305%2c509.667%2c930.305%2c517.333C930.305%2c525%2c930.305%2c532%2c930.305%2c535.5L930.305%2c539&amp;#x27; id=&amp;#x27;mermaid-0-L_B2_M1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_B2_M1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTMwLjMwNDY4NzUsInkiOjQ0M30seyJ4Ijo5MzAuMzA0Njg3NSwieSI6NDY4fSx7IngiOjkzMC4zMDQ2ODc1LCJ5Ijo0OTN9LHsieCI6OTMwLjMwNDY4NzUsInkiOjUxOH0seyJ4Ijo5MzAuMzA0Njg3NSwieSI6NTQzfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M613.754%2c443L613.754%2c447.167C613.754%2c451.333%2c613.754%2c459.667%2c613.754%2c468C613.754%2c476.333%2c613.754%2c484.667%2c613.754%2c493C613.754%2c501.333%2c613.754%2c509.667%2c613.754%2c522.5C613.754%2c535.333%2c613.754%2c552.667%2c613.754%2c570C613.754%2c587.333%2c613.754%2c604.667%2c613.754%2c617.5C613.754%2c630.333%2c613.754%2c638.667%2c613.754%2c653.5C613.754%2c668.333%2c613.754%2c689.667%2c613.754%2c711C613.754%2c732.333%2c613.754%2c753.667%2c613.754%2c775C613.754%2c796.333%2c613.754%2c817.667%2c613.754%2c843C613.754%2c868.333%2c613.754%2c897.667%2c600.491%2c920.161C587.228%2c942.656%2c560.702%2c958.311%2c547.439%2c966.139L534.176%2c973.967&amp;#x27; id=&amp;#x27;mermaid-0-L_B3_M2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_B3_M2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NjEzLjc1MzkwNjI1LCJ5Ijo0NDN9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo0Njh9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo0OTN9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo1MTh9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo1NzB9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo2MjJ9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo2NDd9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo3MTF9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo3NzV9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo4Mzl9LHsieCI6NjEzLjc1MzkwNjI1LCJ5Ijo5Mjd9LHsieCI6NTMwLjczMTQ0NTMxMjUsInkiOjk3Nn1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M930.305%2c597L930.305%2c601.167C930.305%2c605.333%2c930.305%2c613.667%2c930.305%2c622C930.305%2c630.333%2c930.305%2c638.667%2c1000.243%2c650.919C1070.181%2c663.171%2c1210.057%2c679.341%2c1279.995%2c687.426L1349.933%2c695.512&amp;#x27; id=&amp;#x27;mermaid-0-L_M1_Agent_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_M1_Agent_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTMwLjMwNDY4NzUsInkiOjU5N30seyJ4Ijo5MzAuMzA0Njg3NSwieSI6NjIyfSx7IngiOjkzMC4zMDQ2ODc1LCJ5Ijo2NDd9LHsieCI6MTM1My45MDYyNSwieSI6Njk1Ljk3MTE0MDY4Mzg3NDF9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M594.652%2c1002.991L731.761%2c990.326C868.87%2c977.661%2c1143.087%2c952.33%2c1280.196%2c924.999C1417.305%2c897.667%2c1417.305%2c868.333%2c1417.305%2c843C1417.305%2c817.667%2c1417.305%2c796.333%2c1421.16%2c781.962C1425.015%2c767.591%2c1432.726%2c760.181%2c1436.581%2c756.476L1440.437%2c752.772&amp;#x27; id=&amp;#x27;mermaid-0-L_M2_Agent_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_M2_Agent_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTk0LjY1MjM0Mzc1LCJ5IjoxMDAyLjk5MTQyMTk3NTY1MTl9LHsieCI6MTQxNy4zMDQ2ODc1LCJ5Ijo5Mjd9LHsieCI6MTQxNy4zMDQ2ODc1LCJ5Ijo4Mzl9LHsieCI6MTQxNy4zMDQ2ODc1LCJ5Ijo3NzV9LHsieCI6MTQ0My4zMjA5MjI4NTE1NjI1LCJ5Ijo3NTB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1353.906%2c746.924L1336.973%2c751.603C1320.039%2c756.283%2c1286.172%2c765.641%2c1269.238%2c773.821C1252.305%2c782%2c1252.305%2c789%2c1252.305%2c792.5L1252.305%2c796&amp;#x27; id=&amp;#x27;mermaid-0-L_Agent_Policy_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Agent_Policy_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTM1My45MDYyNSwieSI6NzQ2LjkyMzc2NDU0NzE0MTJ9LHsieCI6MTI1Mi4zMDQ2ODc1LCJ5Ijo3NzV9LHsieCI6MTI1Mi4zMDQ2ODc1LCJ5Ijo4MDB9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1545.701%2c750L1552.303%2c754.167C1558.905%2c758.333%2c1572.109%2c766.667%2c1578.711%2c774.333C1585.313%2c782%2c1585.313%2c789%2c1585.313%2c792.5L1585.313%2c796&amp;#x27; id=&amp;#x27;mermaid-0-L_Agent_Obs_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Agent_Obs_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTU0NS43MDA2ODM1OTM3NSwieSI6NzUwfSx7IngiOjE1ODUuMzEyNSwieSI6Nzc1fSx7IngiOjE1ODUuMzEyNSwieSI6ODAwfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1585.313%2c878L1585.313%2c886.167C1585.313%2c894.333%2c1585.313%2c910.667%2c1585.313%2c928.333C1585.313%2c946%2c1585.313%2c965%2c1585.313%2c974.5L1585.313%2c984&amp;#x27; id=&amp;#x27;mermaid-0-L_Obs_SIEM_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Obs_SIEM_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTU4NS4zMTI1LCJ5Ijo4Nzh9LHsieCI6MTU4NS4zMTI1LCJ5Ijo5Mjd9LHsieCI6MTU4NS4zMTI1LCJ5Ijo5ODh9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1252.305%2c878L1252.305%2c886.167C1252.305%2c894.333%2c1252.305%2c910.667%2c1143.359%2c931.005C1034.412%2c951.344%2c816.52%2c975.688%2c707.574%2c987.86L598.628%2c1000.032&amp;#x27; id=&amp;#x27;mermaid-0-L_Policy_M2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_Policy_M2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTI1Mi4zMDQ2ODc1LCJ5Ijo4Nzh9LHsieCI6MTI1Mi4zMDQ2ODc1LCJ5Ijo5Mjd9LHsieCI6NTk0LjY1MjM0Mzc1LCJ5IjoxMDAwLjQ3NTgyNTYwOTEzMzJ9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_P1_KP_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_P2_TP_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_P3_LSM_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_KP_B2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_TP_B2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_LSM_B2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_XDP_B1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_TC_B1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_B1_M2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_B2_M1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_B3_M2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_M1_Agent_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_M2_Agent_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Agent_Policy_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Agent_Obs_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Obs_SIEM_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1252.3046875%2c 927)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_Policy_M2_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eupdates maps%2c no program reload%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-P1-0&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(769.40625%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-109.125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;218.25&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-79.125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;158.25&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod A - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-P2-1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1079.40625%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-108.9921875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;217.984375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-78.9921875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;157.984375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePod B - app container%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-P3-2&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1389.40625%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-77.9765625&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;155.953125&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-47.9765625%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;95.953125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eHost process%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-KP-3&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(769.40625%2c 226)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ekprobes/kretprobes - syscalls%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-TP-4&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1079.40625%2c 226)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eTracepoints - stable ABI events%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-XDP-5&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(161.203125%2c 226)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-118.203125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;236.40625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-88.203125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;176.40625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eXDP - NIC driver ingress%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-TC-6&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(459.40625%2c 226)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3etc/eBPF - egress%2c L3/L4 policy%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-LSM-7&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1389.40625%2c 226)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eLSM hooks - exec%2c file%2c socket%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-B1-8&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(310.3046875%2c 404)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-116.8984375&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;233.796875&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-86.8984375%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;173.796875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eNetwork policy program%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-B2-9&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(930.3046875%2c 404)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eProcess/exec tracing program%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-B3-10&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(613.75390625%2c 404)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSocket-level LB/redirect program%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-M1-11&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(930.3046875%2c 570)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-102&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;204&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-72%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;144&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eRing buffer - events%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-M2-12&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(464.65234375%2c 1015)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eHash maps - identity%2c policy%2c conn state%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Agent-13&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1483.90625%2c 711)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eNode Agent - Cilium/Tetragon%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Policy-14&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1252.3046875%2c 839)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3ePolicy Engine - identity-aware L3-L7%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-Obs-15&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1585.3125%2c 839)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-133.0078125&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;266.015625&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-103.0078125%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;206.015625&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eObservability Backend - Hubble/Prometheus/Grafana%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-SIEM-16&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1585.3125%2c 1015)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-83.125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;166.25&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-53.125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;106.25&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eSIEM / Alerting%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow&amp;#x27; height=&amp;#x27;130%25&amp;#x27; width=&amp;#x27;130%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;4&amp;#x27; dy=&amp;#x27;4&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow-small&amp;#x27; height=&amp;#x27;150%25&amp;#x27; width=&amp;#x27;150%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;2&amp;#x27; dy=&amp;#x27;2&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3clinearGradient id=&amp;#x27;mermaid-0-gradient&amp;#x27; gradientUnits=&amp;#x27;objectBoundingBox&amp;#x27; x1=&amp;#x27;0%25&amp;#x27; y1=&amp;#x27;0%25&amp;#x27; x2=&amp;#x27;100%25&amp;#x27; y2=&amp;#x27;0%25&amp;#x27;%3e%3cstop offset=&amp;#x27;0%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 83.3333333333%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3cstop offset=&amp;#x27;100%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 88.9215686275%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3c/linearGradient%3e%3c/svg%3e&quot; title=&quot;eBPF observability and security without sidecars&quot; width=&quot;1761.3203125&quot;&gt;
&lt;p&gt;The design choice that matters: policy and identity live in BPF maps that the kernel programs read on every packet or syscall, and the userspace agent updates those maps live. Changing a network policy or a security rule doesn’t mean recompiling or reloading the eBPF program. It means writing a new map entry, which is why policy changes propagate in milliseconds instead of requiring a rolling proxy restart.&lt;/p&gt;
&lt;p&gt;The diagram focuses on kernel paths. Cilium&apos;s HTTP policy uses a shared Envoy proxy for the traffic selected for Layer 7 inspection. Include that proxy path when assessing overhead and encryption coverage.&lt;/p&gt;
&lt;h2 id=&quot;decision-criteria-ebpf-native-vs-sidecar-service-mesh-vs-traditional-host-agents&quot;&gt;Decision criteria: eBPF-native vs sidecar service mesh vs traditional host agents&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;eBPF-Native (Cilium/Tetragon)&lt;/th&gt;
&lt;th&gt;Sidecar Service Mesh (Istio/Linkerd)&lt;/th&gt;
&lt;th&gt;Traditional Host Agents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance overhead&lt;/td&gt;
&lt;td&gt;Low: in-kernel processing, no extra hops, shared per-node cost instead of per-pod&lt;/td&gt;
&lt;td&gt;High: proxy per pod, two extra hops per request, meaningful memory/CPU tax at scale&lt;/td&gt;
&lt;td&gt;Medium: depends on polling frequency; kernel modules add near-zero runtime overhead but real crash risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility depth&lt;/td&gt;
&lt;td&gt;Deep: syscalls, process exec, file access, and network, correlated by kernel-verified identity&lt;/td&gt;
&lt;td&gt;Network/L7 only, and only for traffic actually routed through the proxy&lt;/td&gt;
&lt;td&gt;Shallow to deep depending on tooling; usually sampled or delayed, rarely both broad and real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security enforcement&lt;/td&gt;
&lt;td&gt;In-kernel packet filtering, process termination, and supported return-value overrides; prevention guarantees depend on the hook and action&lt;/td&gt;
&lt;td&gt;L7 policy (mTLS, authz) only for meshed traffic; no process-level enforcement&lt;/td&gt;
&lt;td&gt;Detection-oriented; enforcement usually requires a separate LSM or firewall layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;Medium-high: requires kernel/BPF literacy on the team, but a single agent replaces mesh + several point tools&lt;/td&gt;
&lt;td&gt;Medium: well-documented, but adds a proxy lifecycle (upgrades, cert rotation, resource tuning) to manage per workload&lt;/td&gt;
&lt;td&gt;Low to medium: familiar tooling, but often means stitching together separate network, process, and file monitoring products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel/version constraints&lt;/td&gt;
&lt;td&gt;Real: needs a reasonably modern kernel (5.x+ recommended) with BTF for CO-RE; older or heavily customized kernels need work&lt;/td&gt;
&lt;td&gt;None specific to the kernel: runs in userspace, portable across kernel versions&lt;/td&gt;
&lt;td&gt;Kernel modules are tightly kernel-version coupled; userspace agents are portable but lose depth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Platforms already on Kubernetes/cloud-native stacks with kernel expertise in-house, needing both network policy and runtime security from one data plane&lt;/td&gt;
&lt;td&gt;Teams that need mesh features (traffic shaping, canary routing, mTLS) more than raw performance, and don’t have in-house kernel expertise&lt;/td&gt;
&lt;td&gt;Simple environments, legacy (non-containerized) hosts, or teams unwilling to take on kernel-level tooling yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Where I draw the line: if you’re running Kubernetes at meaningful scale and already fighting sidecar tax or gaps in runtime security visibility, eBPF-native tooling is worth the ramp-up. If your primary need is mesh-style traffic management (canaries, retries, fine-grained L7 routing) and your fleet is small enough that the sidecar tax doesn’t hurt yet, a service mesh is still the pragmatic choice. Several mesh projects are themselves adopting eBPF for the data plane while keeping the control plane familiar, which is a reasonable middle path.&lt;/p&gt;
&lt;h2 id=&quot;a-concrete-example-bpftrace-for-ad-hoc-observability-tetragon-for-enforcement&quot;&gt;A concrete example: bpftrace for ad hoc observability, Tetragon for enforcement&lt;/h2&gt;
&lt;p&gt;Two levels of “real code,” because production eBPF work spans both: quick ad hoc tracing during an incident, and durable, declarative policies that run continuously.&lt;/p&gt;
&lt;p&gt;For ad hoc observability, a single bpftrace line attached to a kernel function, with no agent or daemon, and no code deployed to the application:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Count TCP retransmissions per process command, every 10 seconds.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Useful for correlating network degradation with a specific service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# without touching application code or adding a sidecar.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;bpftrace&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -e&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;kprobe:tcp_retransmit_skb { @retransmits[comm] = count(); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;interval:s:10 { print(@retransmits); clear(@retransmits); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This attaches a kprobe to &lt;code&gt;tcp_retransmit_skb&lt;/code&gt;, the kernel function invoked on every TCP retransmission, and aggregates a count per process name (&lt;code&gt;comm&lt;/code&gt;) in a BPF map, printing and clearing it every ten seconds. During an incident, this is the fastest way to answer “which service is actually seeing retransmits right now.” No log shipping, no dashboards to build, no sidecar to inspect.&lt;/p&gt;
&lt;p&gt;For a process-termination example, this Tetragon &lt;code&gt;TracingPolicy&lt;/code&gt; matches the file path at &lt;code&gt;security_file_permission&lt;/code&gt; and sends &lt;code&gt;SIGKILL&lt;/code&gt;. Check hook availability and coverage on your target kernel before using it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;cilium.io/v1alpha1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;TracingPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;block-shadow-read&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  kprobes&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;security_file_permission&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    syscall&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    args&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      type&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      type&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;int&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    selectors&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;matchArgs&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        operator&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;Prefix&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;        values&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        - &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;/etc/shadow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      matchActions&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;Sigkill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The selector matches paths prefixed with &lt;code&gt;/etc/shadow&lt;/code&gt;. &lt;code&gt;Sigkill&lt;/code&gt; terminates the matching process, but does not guarantee that the triggering operation is denied. For access prevention, &lt;a href=&quot;https://tetragon.io/docs/concepts/enforcement/&quot;&gt;Tetragon documents combining a signal with a supported return-value override&lt;/a&gt;. This example contains no override. Validate both the returned error and whether data was accessed when testing a prevention policy.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-and-what-id-do-in-production&quot;&gt;Pitfalls and what I’d do in production&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kernel and CO-RE portability.&lt;/strong&gt; This isn’t automatic. CO-RE relies on BTF (BPF Type Format) being present in the running kernel so a program compiled once can adjust to that kernel’s actual struct layouts at load time. Most distros ship BTF by default on kernels 5.x+, but older kernels, minimal/embedded images, or heavily customized kernels sometimes strip it. What I’d do: verify &lt;code&gt;/sys/kernel/btf/vmlinux&lt;/code&gt; exists on your actual target hosts before committing to an eBPF-based rollout, not just in a dev VM. Keep a fallback plan (bundling BTF, or building per-kernel) for the hosts that don’t have it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The verifier.&lt;/strong&gt; It will reject programs that look fine to you. The BPF verifier enforces a bounded stack (512 bytes), limits on program complexity, and restrictions on loops and pointer arithmetic, all necessary to guarantee a program terminates and can’t read arbitrary memory. Programs that need to do more get split across tail calls (up to 32 chained programs) or use BPF-to-BPF function calls. What I’d do: budget verifier iteration into the timeline for anything non-trivial. Expect to restructure logic around the verifier’s rules rather than around what’s algorithmically simplest, and lean on existing map-based patterns from mature projects instead of reinventing state-tracking logic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Observability cardinality.&lt;/strong&gt; It gets expensive fast. eBPF makes it trivially easy to trace every syscall, every packet, or every function call, which means it’s just as easy to generate more events than any backend can ingest or you can afford to store. What I’d do: aggregate in-kernel using BPF maps (counts, histograms, top-N) before anything crosses into userspace, and treat full per-event export as a targeted, time-boxed debugging tool rather than a standing collection default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loading eBPF programs is privileged.&lt;/strong&gt; Treat it that way. Loading a program has historically required &lt;code&gt;CAP_SYS_ADMIN&lt;/code&gt;; kernels 5.8+ split this into more granular capabilities (&lt;code&gt;CAP_BPF&lt;/code&gt;, &lt;code&gt;CAP_PERFMON&lt;/code&gt;, &lt;code&gt;CAP_NET_ADMIN&lt;/code&gt;), but it’s still meaningful kernel access, and kernel lockdown mode can block &lt;code&gt;bpf()&lt;/code&gt; entirely in confidentiality mode. What I’d do: restrict which nodes and service accounts can load programs, use signed/vetted images from the project you’re standardizing on rather than ad hoc custom programs in production, and audit &lt;code&gt;bpf()&lt;/code&gt; syscall usage itself. An attacker who can load their own eBPF program has kernel-level access.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measure real overhead.&lt;/strong&gt; XDP’s performance profile changes enormously between native mode (running in the NIC driver) and generic mode (running later in the stack, when the driver doesn’t support native XDP). The difference can be an order of magnitude in packets-per-second. What I’d do: benchmark on your actual NIC/driver combination under your actual traffic shape before trusting any published number, and re-verify after driver or kernel upgrades since native XDP support is driver-specific and can regress silently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When I wouldn’t reach for eBPF at all.&lt;/strong&gt; Rolling your own eBPF programs for problems mature projects already solve (Cilium, Tetragon, Falco, Pixie) is rarely worth it without in-house kernel engineering capacity. You inherit verifier debugging, BTF/CO-RE edge cases, and upgrade risk that a maintained project has already absorbed. It’s also a poor fit on kernels too old for BTF/CO-RE, on managed platforms that restrict the capabilities needed to load programs, or when the actual need is L7 application routing logic. That’s still better served by a proxy that understands the protocol semantics than by kernel-level packet inspection.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;p&gt;These project documents explain the kernel checks, tracing language, and enforcement actions discussed here. Use the documentation for the versions deployed on your hosts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.kernel.org/bpf/verifier.html&quot;&gt;Linux kernel: eBPF verifier&lt;/a&gt;. Load-time checks on program state and memory access.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bpftrace.org/docs/release_024/language&quot;&gt;bpftrace 0.24 language reference&lt;/a&gt;. Probe syntax and aggregation used by the tracing example.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tetragon.io/docs/concepts/enforcement/&quot;&gt;Tetragon enforcement&lt;/a&gt;. The distinction between terminating a process and overriding an operation&apos;s return value.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/security/policy/layer7/&quot;&gt;Cilium Layer 7 policies&lt;/a&gt;. Application-aware policy and the proxy path it requires.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/initv0/ebpf-observability-samples&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ebpf-observability-samples&lt;/a&gt;. The companion repo: the bpftrace one-liner, the Tetragon &lt;code&gt;block-shadow-read&lt;/code&gt; policy, and Cilium L3/L4 + L7 policies from this article, plus BTF/CO-RE and XDP-mode readiness checks. All runnable.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;. The full pillar on service meshes, eBPF-native data planes, and cloud networking trade-offs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/zero-trust-platform-security/&quot;&gt;Zero Trust&lt;/a&gt;. Identity-aware segmentation and kernel-level policy enforcement patterns.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/service-mesh-vs-ebpf-native-data-planes-how-to-choose/&quot;&gt;Service Mesh vs eBPF-Native Data Planes: How to Choose&lt;/a&gt;. The head-to-head on when sidecars still win.&lt;/li&gt;
&lt;li&gt;Zero-Trust Segmentation with Cilium Network Policies. Coming soon: identity-aware L3-L7 policy design for multi-tenant clusters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lets-talk-ebpf&quot;&gt;Let’s talk eBPF&lt;/h2&gt;
&lt;p&gt;If you’re weighing eBPF-native tooling against a sidecar mesh or legacy host agents and want a second opinion on the architecture, I’m happy to compare notes. Connect with me on &lt;a href=&quot;https://www.linkedin.com/in/vkafed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; or reach out via &lt;a href=&quot;/contact/&quot;&gt;Contact&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>AI Infrastructure Security</category><category>Kubernetes Security</category></item><item><title>IPv6 at Enterprise Scale: A Migration Playbook</title><link>https://vkafed.com/ipv6-at-enterprise-scale-a-migration-playbook/</link><guid isPermaLink="true">https://vkafed.com/ipv6-at-enterprise-scale-a-migration-playbook/</guid><description>Plan an enterprise IPv6 migration with a dual-stack core, IPv6-only GPU and Kubernetes networks, NAT64/DNS64, and a phased operational rollout.</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ask a network architect why they’re finally doing an enterprise IPv6 migration and “we’re running out of IPv4 addresses” is almost never the honest answer. Nobody sitting in a data center cares about the global IPv4 free pool. That argument was settled a decade ago, and either way it was never their problem. The trigger that actually shows up on a change ticket is that 10.0.0.0/8 is spoken for twice inside the same routing domain, or that this quarter’s GPU cluster can’t get a subnet large enough for its back-end fabric without carving into a block someone else already owns.&lt;/p&gt;
&lt;p&gt;This is the playbook I reach for when RFC1918 space has actually run out (not in theory, in the IPAM tool), usually after a run of acquisitions, a few years of multi-cluster Kubernetes sprawl, and a GPU buildout that eats subnets faster than anyone budgeted for. I’m assuming you already know IPv6 basics: SLAAC, the address format, that /64 is the standard subnet size. What follows is about sequencing a migration a large organization can survive, not another argument for why IPv6 is good for you.&lt;/p&gt;
&lt;h2 id=&quot;why-enterprise-ipv6-migration-stops-being-optional&quot;&gt;Why enterprise IPv6 migration stops being optional&lt;/h2&gt;
&lt;p&gt;RFC1918 was never sized for GPU fabrics. A single GPU node in a modern training or inference cluster carries multiple NICs for the compute fabric, plus a separate management/BMC network, plus a storage network. One rack of eight GPU servers can burn a few hundred addresses before a workload ever runs. Multiply that across dozens of racks and several clusters (training, inference, staging, DR) and you’re allocating subnets by the thousand. Private space handles that arithmetic fine in isolation. It stops working the moment every business unit, region, and cluster is drawing from the same finite 10.0.0.0/8.&lt;/p&gt;
&lt;p&gt;Kubernetes multiplies the allocation problem instead of solving it. Every cluster wants its own pod CIDR and service CIDR, and the easy default (carve out a /16 per cluster) burns through address space you can’t easily reclaim once workloads are scheduled against it. Cross-cluster service mesh or federation needs those CIDRs to be globally unique, or NAT’d at every cluster boundary. A platform team running fifty-plus clusters across regions runs out of non-overlapping /16s inside a /8 far sooner than the raw host count would suggest.&lt;/p&gt;
&lt;p&gt;Mergers and acquisitions guarantee overlap. Two companies have almost certainly both standardized on 10.0.0.0/8, or the same handful of common /12 and /16 blocks, entirely independently. Day one of any integration starts with subnet collisions rather than free space. The standard fix, 1:1 NAT or a renumbering project, is expensive either way: hundreds of manual mapping entries, monitoring and alerting that now has to key off the NAT’d address instead of the real one, and one missed mapping entry causes packet loss nobody can explain from the logs alone.&lt;/p&gt;
&lt;p&gt;NAT and overlapping-CIDR VPNs are a standing tax rather than a one-time cost. Every site-to-site tunnel between two overlapping networks needs static NAT or a policy-routing workaround to disambiguate traffic. Every new acquisition or partner integration adds another set of translation rules to a table that’s already hard to reason about. A packet capture during an incident needs a NAT lookup before anyone can even identify which host originated the traffic. This is the part that never makes it into the original NAT decision: it doesn’t cost you once, it costs your on-call rotation every single day you keep running it.&lt;/p&gt;
&lt;h2 id=&quot;reference-architecture-dual-stack-core-ipv6-only-islands-and-nat64dns64-at-the-edge&quot;&gt;Reference architecture: dual-stack core, IPv6-only islands, and NAT64/DNS64 at the edge&lt;/h2&gt;
&lt;p&gt;The target I aim for, phased over twelve to twenty-four months depending on estate size, looks like this: a dual-stack core and WAN backbone that everything still routes through, new capacity built as IPv6-only islands from day one, and a NAT64/DNS64 gateway sitting at the boundary so those islands can still reach the IPv4-only world that isn’t going anywhere soon.&lt;/p&gt;
&lt;img alt=&quot;IPv6-only GPU and Kubernetes workloads connect to regional routers in a dual-stack core. The regional routers exchange routes and retain connectivity to legacy IPv4 servers and databases. To reach an IPv4-only service, an IPv6 workload asks a DNS64 resolver for an address. DNS64 synthesizes an IPv6 address using the 64:ff9b::/96 prefix, and a NAT64 gateway translates traffic sent to that address into IPv4.&quot; height=&quot;749&quot; id=&quot;mermaid-0&quot; src=&quot;data:image/svg+xml,%3csvg id=&amp;#x27;mermaid-0&amp;#x27; width=&amp;#x27;100%25&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; xmlns:xlink=&amp;#x27;http://www.w3.org/1999/xlink&amp;#x27; class=&amp;#x27;flowchart&amp;#x27; style=&amp;#x27;max-width: 1865.703125px%3b&amp;#x27; viewBox=&amp;#x27;0 0 1865.703125 749&amp;#x27; role=&amp;#x27;graphics-document document&amp;#x27; aria-roledescription=&amp;#x27;flowchart-v2&amp;#x27; aria-describedby=&amp;#x27;chart-desc-mermaid-0&amp;#x27; aria-labelledby=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3e%3ctitle id=&amp;#x27;chart-title-mermaid-0&amp;#x27;%3eIPv6-only islands connected through a dual-stack core%3c/title%3e%3cdesc id=&amp;#x27;chart-desc-mermaid-0&amp;#x27;%3eIPv6-only GPU and Kubernetes workloads connect to regional routers in a dual-stack core. The regional routers exchange routes and retain connectivity to legacy IPv4 servers and databases. To reach an IPv4-only service%2c an IPv6 workload asks a DNS64 resolver for an address. DNS64 synthesizes an IPv6 address using the 64:ff9b::/96 prefix%2c and a NAT64 gateway translates traffic sent to that address into IPv4.%3c/desc%3e%3cstyle%3e%23mermaid-0%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3bfill:black%3b%7d%40keyframes edge-animation-frame%7bfrom%7bstroke-dashoffset:0%3b%7d%7d%40keyframes dash%7bto%7bstroke-dashoffset:0%3b%7d%7d%23mermaid-0 .edge-animation-slow%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 50s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .edge-animation-fast%7bstroke-dasharray:9%2c5!important%3bstroke-dashoffset:900%3banimation:dash 20s linear infinite%3bstroke-linecap:round%3b%7d%23mermaid-0 .error-icon%7bfill:%23552222%3b%7d%23mermaid-0 .error-text%7bfill:%23552222%3bstroke:%23552222%3b%7d%23mermaid-0 .edge-thickness-normal%7bstroke-width:1px%3b%7d%23mermaid-0 .edge-thickness-thick%7bstroke-width:3.5px%3b%7d%23mermaid-0 .edge-pattern-solid%7bstroke-dasharray:0%3b%7d%23mermaid-0 .edge-thickness-invisible%7bstroke-width:0%3bfill:none%3b%7d%23mermaid-0 .edge-pattern-dashed%7bstroke-dasharray:3%3b%7d%23mermaid-0 .edge-pattern-dotted%7bstroke-dasharray:2%3b%7d%23mermaid-0 .marker%7bfill:%23666%3bstroke:%23666%3b%7d%23mermaid-0 .marker.cross%7bstroke:%23666%3b%7d%23mermaid-0 svg%7bfont-family:system-ui%2csans-serif%3bfont-size:16px%3b%7d%23mermaid-0 p%7bmargin:0%3b%7d%23mermaid-0 .label%7bfont-family:system-ui%2csans-serif%3bcolor:black%3b%7d%23mermaid-0 .cluster-label text%7bfill:%23333%3b%7d%23mermaid-0 .cluster-label span%7bcolor:%23333%3b%7d%23mermaid-0 .cluster-label span p%7bbackground-color:transparent%3b%7d%23mermaid-0 .label text%2c%23mermaid-0 span%7bfill:black%3bcolor:black%3b%7d%23mermaid-0 .node rect%2c%23mermaid-0 .node circle%2c%23mermaid-0 .node ellipse%2c%23mermaid-0 .node polygon%2c%23mermaid-0 .node path%7bfill:%23eee%3bstroke:%23999%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label text%2c%23mermaid-0 .node .label text%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-anchor:middle%3b%7d%23mermaid-0 .node .katex path%7bfill:black%3bstroke:black%3bstroke-width:1px%3b%7d%23mermaid-0 .rough-node .label%2c%23mermaid-0 .node .label%2c%23mermaid-0 .image-shape .label%2c%23mermaid-0 .icon-shape .label%7btext-align:center%3b%7d%23mermaid-0 .node.clickable%7bcursor:pointer%3b%7d%23mermaid-0 .root .anchor path%7bfill:%23666!important%3bstroke-width:0%3bstroke:%23666%3b%7d%23mermaid-0 .arrowheadPath%7bfill:%23333333%3b%7d%23mermaid-0 .edgePaths .path%7bstroke:%23666%3bstroke-width:1px%3b%7d%23mermaid-0 .flowchart-link%7bstroke:%23666%3bfill:none%3b%7d%23mermaid-0 .edgeLabel%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .edgeLabel p%7bbackground-color:white%3b%7d%23mermaid-0 .edgeLabel rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .labelBkg%7bbackground-color:rgba(255%2c 255%2c 255%2c 0.5)%3b%7d%23mermaid-0 .cluster rect%7bfill:hsl(0%2c 0%25%2c 98.9215686275%25)%3bstroke:%23707070%3bstroke-width:1px%3b%7d%23mermaid-0 .cluster text%7bfill:%23333%3b%7d%23mermaid-0 .cluster span%7bcolor:%23333%3b%7d%23mermaid-0 .node .collapsed-indicator%7bfill:%23707070%3bstroke:none%3bopacity:0.6%3b%7d%23mermaid-0 .node .collapsed-separator%7bstroke:%23707070%3bstroke-width:0.75px%3b%7d%23mermaid-0 div.mermaidTooltip%7bposition:absolute%3btext-align:center%3bmax-width:200px%3bpadding:2px%3bfont-family:system-ui%2csans-serif%3bfont-size:12px%3bbackground:hsl(-160%2c 0%25%2c 93.3333333333%25)%3bborder:1px solid %23707070%3bborder-radius:2px%3bpointer-events:none%3bz-index:100%3b%7d%23mermaid-0 .flowchartTitleText%7btext-anchor:middle%3bfont-size:18px%3bfill:black%3b%7d%23mermaid-0 rect.text%7bfill:none%3bstroke-width:0%3b%7d%23mermaid-0 .icon-shape%2c%23mermaid-0 .image-shape%7bbackground-color:white%3btext-align:center%3b%7d%23mermaid-0 .icon-shape p%2c%23mermaid-0 .image-shape p%7bbackground-color:white%3bpadding:2px%3b%7d%23mermaid-0 .icon-shape .label rect%2c%23mermaid-0 .image-shape .label rect%7bopacity:0.5%3bbackground-color:white%3bfill:white%3b%7d%23mermaid-0 .label-icon%7bdisplay:inline-block%3bheight:1em%3boverflow:visible%3bvertical-align:-0.125em%3b%7d%23mermaid-0 .node .label-icon path%7bfill:currentColor%3bstroke:revert%3bstroke-width:revert%3b%7d%23mermaid-0 .node .neo-node%7bstroke:%23999%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.cluster rect%2c%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node polygon%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.swimlane.cluster rect%7bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node path%7bstroke:url(%23mermaid-0-gradient)%3bstroke-width:1px%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .outer-path%7bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node .neo-line path%7bstroke:%23999%3bfilter:none%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.node circle .state-start%7bfill:black%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon%7bfill:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 %5bdata-look=&amp;#x27;neo&amp;#x27;%5d.icon-shape .icon-neo path%7bstroke:url(%23mermaid-0-gradient)%3bfilter:drop-shadow( 1px 2px 2px rgba(185%2c185%2c185%2c1))%3b%7d%23mermaid-0 :root%7b--mermaid-font-family:system-ui%2csans-serif%3b%7d%3c/style%3e%3cg%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 10 5 L 0 10 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;4.5&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;8&amp;#x27; markerHeight=&amp;#x27;8&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 5 L 10 10 L 10 0 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;11.5&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;10.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 0 0 L 11.5 7 L 0 14 z&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-pointStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11.5 14&amp;#x27; refX=&amp;#x27;1&amp;#x27; refY=&amp;#x27;7&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11.5&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpolygon points=&amp;#x27;0%2c7 11.5%2c14 11.5%2c0&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;11&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 1%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleEnd-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refY=&amp;#x27;5&amp;#x27; refX=&amp;#x27;12.25&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-circleStart-margin&amp;#x27; class=&amp;#x27;marker flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 10 10&amp;#x27; refX=&amp;#x27;-2&amp;#x27; refY=&amp;#x27;5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;14&amp;#x27; markerHeight=&amp;#x27;14&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3ccircle cx=&amp;#x27;5&amp;#x27; cy=&amp;#x27;5&amp;#x27; r=&amp;#x27;5&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 0%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;12&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 11 11&amp;#x27; refX=&amp;#x27;-1&amp;#x27; refY=&amp;#x27;5.2&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;11&amp;#x27; markerHeight=&amp;#x27;11&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 l 9%2c9 M 10%2c1 l -9%2c9&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossEnd-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;17.7&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b&amp;#x27;/%3e%3c/marker%3e%3cmarker id=&amp;#x27;mermaid-0_flowchart-v2-crossStart-margin&amp;#x27; class=&amp;#x27;marker cross flowchart-v2&amp;#x27; viewBox=&amp;#x27;0 0 15 15&amp;#x27; refX=&amp;#x27;-3.5&amp;#x27; refY=&amp;#x27;7.5&amp;#x27; markerUnits=&amp;#x27;userSpaceOnUse&amp;#x27; markerWidth=&amp;#x27;12&amp;#x27; markerHeight=&amp;#x27;12&amp;#x27; orient=&amp;#x27;auto&amp;#x27;%3e%3cpath d=&amp;#x27;M 1%2c1 L 14%2c14 M 1%2c14 L 14%2c1&amp;#x27; class=&amp;#x27;arrowMarkerPath&amp;#x27; style=&amp;#x27;stroke-width: 2.5%3b stroke-dasharray: 1%2c 0%3b&amp;#x27;/%3e%3c/marker%3e%3cg class=&amp;#x27;root&amp;#x27;%3e%3cg class=&amp;#x27;clusters&amp;#x27;%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Island2&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;411&amp;#x27; width=&amp;#x27;609.59375&amp;#x27; height=&amp;#x27;128&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(183.2734375%2c 411)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;259.046875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eIPv6-Only Island: New Regional Site%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Island1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;8&amp;#x27; y=&amp;#x27;185&amp;#x27; width=&amp;#x27;640&amp;#x27; height=&amp;#x27;128&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(192.1484375%2c 185)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;271.703125&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eIPv6-Only Island: GPU Training Fabric%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Core&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;668&amp;#x27; y=&amp;#x27;8&amp;#x27; width=&amp;#x27;625.359375&amp;#x27; height=&amp;#x27;733&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(858.03125%2c 8)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;245.296875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eDual-Stack Core / WAN Backbone%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;cluster&amp;#x27; id=&amp;#x27;mermaid-0-Legacy&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;%3e%3crect style=&amp;#x27;&amp;#x27; x=&amp;#x27;1313.359375&amp;#x27; y=&amp;#x27;637&amp;#x27; width=&amp;#x27;544.34375&amp;#x27; height=&amp;#x27;104&amp;#x27;/%3e%3cg class=&amp;#x27;cluster-label&amp;#x27; transform=&amp;#x27;translate(1496.2578125%2c 637)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;178.546875&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eLegacy IPv4-Only Estate%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgePaths&amp;#x27;%3e%3cpath d=&amp;#x27;M173%2c288L173%2c292.167C173%2c296.333%2c173%2c304.667%2c275.243%2c317C377.486%2c329.333%2c581.971%2c345.667%2c684.214%2c362C786.457%2c378.333%2c786.457%2c394.667%2c792.834%2c406.657C799.211%2c418.648%2c811.965%2c426.295%2c818.343%2c430.119L824.72%2c433.943&amp;#x27; id=&amp;#x27;mermaid-0-L_GPU1_R1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_GPU1_R1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTczLCJ5IjoyODh9LHsieCI6MTczLCJ5IjozMTN9LHsieCI6Nzg2LjQ1NzAzMTI1LCJ5IjozNjJ9LHsieCI6Nzg2LjQ1NzAzMTI1LCJ5Ijo0MTF9LHsieCI6ODI4LjE1MDE0NjQ4NDM3NSwieSI6NDM2fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M394.641%2c288L385.201%2c292.167C375.76%2c296.333%2c356.88%2c304.667%2c452.342%2c317C547.805%2c329.333%2c757.609%2c345.667%2c862.512%2c362C967.414%2c378.333%2c967.414%2c394.667%2c963.087%2c406.565C958.759%2c418.463%2c950.105%2c425.925%2c945.777%2c429.657L941.45%2c433.388&amp;#x27; id=&amp;#x27;mermaid-0-L_K8S1_R1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_K8S1_R1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6Mzk0LjY0MDYyNSwieSI6Mjg4fSx7IngiOjMzOCwieSI6MzEzfSx7IngiOjk2Ny40MTQwNjI1LCJ5IjozNjJ9LHsieCI6OTY3LjQxNDA2MjUsInkiOjQxMX0seyJ4Ijo5MzguNDIwODM3NDAyMzQzOCwieSI6NDM2fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M157.797%2c502L157.797%2c508.167C157.797%2c514.333%2c157.797%2c526.667%2c256.55%2c541C355.303%2c555.333%2c552.81%2c571.667%2c651.563%2c588C750.316%2c604.333%2c750.316%2c620.667%2c756.349%2c632.644C762.381%2c644.621%2c774.445%2c652.242%2c780.478%2c656.053L786.51%2c659.864&amp;#x27; id=&amp;#x27;mermaid-0-L_K8S2_R2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_K8S2_R2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTU3Ljc5Njg3NSwieSI6NTAyfSx7IngiOjE1Ny43OTY4NzUsInkiOjUzOX0seyJ4Ijo3NTAuMzE2NDA2MjUsInkiOjU4OH0seyJ4Ijo3NTAuMzE2NDA2MjUsInkiOjYzN30seyJ4Ijo3ODkuODkxNjAxNTYyNSwieSI6NjYyfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M452.594%2c514L452.594%2c518.167C452.594%2c522.333%2c452.594%2c530.667%2c505.548%2c543C558.501%2c555.333%2c664.409%2c571.667%2c717.363%2c588C770.316%2c604.333%2c770.316%2c620.667%2c774.798%2c632.573C779.279%2c644.479%2c788.242%2c651.958%2c792.724%2c655.698L797.205%2c659.437&amp;#x27; id=&amp;#x27;mermaid-0-L_APP2_R2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_APP2_R2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NDUyLjU5Mzc1LCJ5Ijo1MTR9LHsieCI6NDUyLjU5Mzc1LCJ5Ijo1Mzl9LHsieCI6NzcwLjMxNjQwNjI1LCJ5Ijo1ODh9LHsieCI6NzcwLjMxNjQwNjI1LCJ5Ijo2Mzd9LHsieCI6ODAwLjI3NjIxNjk0NzExNTQsInkiOjY2Mn1d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M870.323%2c517.523L868.398%2c521.102C866.473%2c524.682%2c862.623%2c531.841%2c860.698%2c543.587C858.773%2c555.333%2c858.773%2c571.667%2c858.773%2c588C858.773%2c604.333%2c858.773%2c620.667%2c856.978%2c632.404C855.183%2c644.142%2c851.593%2c651.284%2c849.798%2c654.855L848.002%2c658.426&amp;#x27; id=&amp;#x27;mermaid-0-L_R1_R2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_R1_R2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6ODcyLjIxNzk1NjU0Mjk2ODgsInkiOjUxNH0seyJ4Ijo4NTguNzczNDM3NSwieSI6NTM5fSx7IngiOjg1OC43NzM0Mzc1LCJ5Ijo1ODh9LHsieCI6ODU4Ljc3MzQzNzUsInkiOjYzN30seyJ4Ijo4NDYuMjA1ODI5MzI2OTIzMSwieSI6NjYyfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-start=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointStart)&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M910.171%2c514L911.985%2c518.167C913.799%2c522.333%2c917.427%2c530.667%2c919.241%2c543C921.055%2c555.333%2c921.055%2c571.667%2c921.055%2c588C921.055%2c604.333%2c921.055%2c620.667%2c992.272%2c635.738C1063.49%2c650.809%2c1205.924%2c664.618%2c1277.142%2c671.523L1348.359%2c678.427&amp;#x27; id=&amp;#x27;mermaid-0-L_R1_L1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_R1_L1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTEwLjE3MDU5MzI2MTcxODgsInkiOjUxNH0seyJ4Ijo5MjEuMDU0Njg3NSwieSI6NTM5fSx7IngiOjkyMS4wNTQ2ODc1LCJ5Ijo1ODh9LHsieCI6OTIxLjA1NDY4NzUsInkiOjYzN30seyJ4IjoxMzQ4LjM1OTM3NSwieSI6Njc4LjQyNzE1NjQ2NTc1NTh9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;/%3e%3cpath d=&amp;#x27;M1023.191%2c496.885L1064.886%2c503.904C1106.581%2c510.923%2c1189.97%2c524.962%2c1231.665%2c540.148C1273.359%2c555.333%2c1273.359%2c571.667%2c1273.359%2c588C1273.359%2c604.333%2c1273.359%2c620.667%2c1330.544%2c635.497C1387.729%2c650.328%2c1502.099%2c663.656%2c1559.284%2c670.32L1616.469%2c676.983&amp;#x27; id=&amp;#x27;mermaid-0-L_R1_L2_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_R1_L2_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTAyMy4xOTE0MDYyNSwieSI6NDk2Ljg4NTA2MzE0MDI2NDl9LHsieCI6MTI3My4zNTkzNzUsInkiOjUzOX0seyJ4IjoxMjczLjM1OTM3NSwieSI6NTg4fSx7IngiOjEyNzMuMzU5Mzc1LCJ5Ijo2Mzd9LHsieCI6MTYxNi40Njg3NSwieSI6Njc2Ljk4MzQ3MjUyMTMxNTl9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27;/%3e%3cpath d=&amp;#x27;M613%2c235.309L692.613%2c226.924C772.227%2c218.539%2c931.453%2c201.77%2c1011.066%2c185.218C1090.68%2c168.667%2c1090.68%2c152.333%2c1079.715%2c136.386C1068.75%2c120.438%2c1046.821%2c104.877%2c1035.857%2c97.096L1024.892%2c89.315&amp;#x27; id=&amp;#x27;mermaid-0-L_K8S1_DNS_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_K8S1_DNS_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NjEzLCJ5IjoyMzUuMzA4NTc2NDI0MTU0Mzh9LHsieCI6MTA5MC42Nzk2ODc1LCJ5IjoxODV9LHsieCI6MTA5MC42Nzk2ODc1LCJ5IjoxMzZ9LHsieCI6MTAyMS42Mjk4ODI4MTI1LCJ5Ijo4N31d&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M945.534%2c87L934.026%2c95.167C922.518%2c103.333%2c899.501%2c119.667%2c887.993%2c136C876.484%2c152.333%2c876.484%2c168.667%2c833.228%2c183.869C789.972%2c199.071%2c703.46%2c213.142%2c660.204%2c220.178L616.948%2c227.213&amp;#x27; id=&amp;#x27;mermaid-0-L_DNS_K8S1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_DNS_K8S1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6OTQ1LjUzNDE3OTY4NzUsInkiOjg3fSx7IngiOjg3Ni40ODQzNzUsInkiOjEzNn0seyJ4Ijo4NzYuNDg0Mzc1LCJ5IjoxODV9LHsieCI6NjEzLCJ5IjoyMjcuODU1NTc3MTc1MDc4NDJ9XQ==&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M527.18%2c288L531.9%2c292.167C536.62%2c296.333%2c546.06%2c304.667%2c651.803%2c317C757.546%2c329.333%2c959.591%2c345.667%2c1060.614%2c362C1161.637%2c378.333%2c1161.637%2c394.667%2c1161.637%2c408.333C1161.637%2c422%2c1161.637%2c433%2c1161.637%2c438.5L1161.637%2c444&amp;#x27; id=&amp;#x27;mermaid-0-L_K8S1_NAT_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_K8S1_NAT_0&amp;#x27; data-points=&amp;#x27;W3sieCI6NTI3LjE3OTY4NzUsInkiOjI4OH0seyJ4Ijo1NTUuNSwieSI6MzEzfSx7IngiOjExNjEuNjM2NzE4NzUsInkiOjM2Mn0seyJ4IjoxMTYxLjYzNjcxODc1LCJ5Ijo0MTF9LHsieCI6MTE2MS42MzY3MTg3NSwieSI6NDQ4fV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3cpath d=&amp;#x27;M1158.145%2c502L1157.347%2c508.167C1156.55%2c514.333%2c1154.954%2c526.667%2c1154.157%2c541C1153.359%2c555.333%2c1153.359%2c571.667%2c1153.359%2c588C1153.359%2c604.333%2c1153.359%2c620.667%2c1185.202%2c634.279C1217.045%2c647.892%2c1280.731%2c658.783%2c1312.574%2c664.229L1344.417%2c669.675&amp;#x27; id=&amp;#x27;mermaid-0-L_NAT_L1_0&amp;#x27; class=&amp;#x27;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&amp;#x27; style=&amp;#x27;%3b&amp;#x27; data-edge=&amp;#x27;true&amp;#x27; data-et=&amp;#x27;edge&amp;#x27; data-id=&amp;#x27;L_NAT_L1_0&amp;#x27; data-points=&amp;#x27;W3sieCI6MTE1OC4xNDQ3MTQzNTU0Njg4LCJ5Ijo1MDJ9LHsieCI6MTE1My4zNTkzNzUsInkiOjUzOX0seyJ4IjoxMTUzLjM1OTM3NSwieSI6NTg4fSx7IngiOjExNTMuMzU5Mzc1LCJ5Ijo2Mzd9LHsieCI6MTM0OC4zNTkzNzUsInkiOjY3MC4zNDkyNjM4NTU3MDAzfV0=&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; marker-end=&amp;#x27;url(%23mermaid-0_flowchart-v2-pointEnd)&amp;#x27;/%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabels&amp;#x27;%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_GPU1_R1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_K8S1_R1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_K8S2_R2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_APP2_R2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(858.7734375%2c 588)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_R1_R2_0&amp;#x27; transform=&amp;#x27;translate(-32.28125%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;64.5625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eiBGP/IGP%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_R1_L1_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_R1_L2_0&amp;#x27; transform=&amp;#x27;translate(0%2c 0)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;0&amp;#x27; height=&amp;#x27;0&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1090.6796875%2c 136)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_K8S1_DNS_0&amp;#x27; transform=&amp;#x27;translate(-94.1953125%2c -12)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;188.390625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3eresolve legacy-db.internal%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(876.484375%2c 136)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_DNS_K8S1_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3esynthesize AAAA via 64:ff9b::/96%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1161.63671875%2c 362)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_K8S1_NAT_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3etraffic to synthesized address%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;edgeLabel&amp;#x27; transform=&amp;#x27;translate(1153.359375%2c 588)&amp;#x27;%3e%3cg class=&amp;#x27;label&amp;#x27; data-id=&amp;#x27;L_NAT_L1_0&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; class=&amp;#x27;labelBkg&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;edgeLabel&amp;#x27;%3e%3cp%3estateful translation to real IPv4%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;nodes&amp;#x27;%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-L1-0&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1457.4140625%2c 689)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-109.0546875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;218.109375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-79.0546875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;158.109375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eApp Servers - 10.x.x.x%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-L2-1&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1719.5859375%2c 689)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-103.1171875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;206.234375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-73.1171875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;146.234375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eDatabases - 10.x.x.x%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-R1-2&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(893.19140625%2c 475)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eCore Router - Region AMER%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-R2-3&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(832.6328125%2c 689)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-129.6328125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;259.265625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-99.6328125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;199.265625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eCore Router - Region EMEA%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-DNS-4&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(983.58203125%2c 60)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-89.5703125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;179.140625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-59.5703125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;119.140625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eDNS64 Resolver%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-NAT-5&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(1161.63671875%2c 475)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-88.4453125&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;176.890625&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-58.4453125%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;116.890625&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eNAT64 Gateway%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-GPU1-6&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(173%2c 249)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eGPU Nodes - IPv6-only fabric%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-K8S1-7&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(483%2c 249)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eK8s Cluster - IPv6-only pod/service CIDR%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-K8S2-8&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(157.796875%2c 475)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-114.796875&amp;#x27; y=&amp;#x27;-27&amp;#x27; width=&amp;#x27;229.59375&amp;#x27; height=&amp;#x27;54&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-84.796875%2c -12)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;169.59375&amp;#x27; height=&amp;#x27;24&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table-cell%3b white-space: nowrap%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eK8s Cluster - IPv6-only%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3cg class=&amp;#x27;node default&amp;#x27; id=&amp;#x27;mermaid-0-flowchart-APP2-9&amp;#x27; data-look=&amp;#x27;classic&amp;#x27; transform=&amp;#x27;translate(452.59375%2c 475)&amp;#x27;%3e%3crect class=&amp;#x27;basic label-container&amp;#x27; style=&amp;#x27;&amp;#x27; x=&amp;#x27;-130&amp;#x27; y=&amp;#x27;-39&amp;#x27; width=&amp;#x27;260&amp;#x27; height=&amp;#x27;78&amp;#x27;/%3e%3cg class=&amp;#x27;label&amp;#x27; style=&amp;#x27;&amp;#x27; transform=&amp;#x27;translate(-100%2c -24)&amp;#x27;%3e%3crect/%3e%3cforeignObject width=&amp;#x27;200&amp;#x27; height=&amp;#x27;48&amp;#x27;%3e%3cdiv xmlns=&amp;#x27;http://www.w3.org/1999/xhtml&amp;#x27; style=&amp;#x27;display: table%3b white-space: break-spaces%3b line-height: 1.5%3b max-width: 200px%3b text-align: center%3b width: 200px%3b&amp;#x27;%3e%3cspan class=&amp;#x27;nodeLabel&amp;#x27;%3e%3cp%3eNew Applications - IPv6-only%3c/p%3e%3c/span%3e%3c/div%3e%3c/foreignObject%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow&amp;#x27; height=&amp;#x27;130%25&amp;#x27; width=&amp;#x27;130%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;4&amp;#x27; dy=&amp;#x27;4&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3cdefs%3e%3cfilter id=&amp;#x27;mermaid-0-drop-shadow-small&amp;#x27; height=&amp;#x27;150%25&amp;#x27; width=&amp;#x27;150%25&amp;#x27;%3e%3cfeDropShadow dx=&amp;#x27;2&amp;#x27; dy=&amp;#x27;2&amp;#x27; stdDeviation=&amp;#x27;0&amp;#x27; flood-opacity=&amp;#x27;0.06&amp;#x27; flood-color=&amp;#x27;black&amp;#x27;/%3e%3c/filter%3e%3c/defs%3e%3clinearGradient id=&amp;#x27;mermaid-0-gradient&amp;#x27; gradientUnits=&amp;#x27;objectBoundingBox&amp;#x27; x1=&amp;#x27;0%25&amp;#x27; y1=&amp;#x27;0%25&amp;#x27; x2=&amp;#x27;100%25&amp;#x27; y2=&amp;#x27;0%25&amp;#x27;%3e%3cstop offset=&amp;#x27;0%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 83.3333333333%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3cstop offset=&amp;#x27;100%25&amp;#x27; stop-color=&amp;#x27;hsl(0%2c 0%25%2c 88.9215686275%25)&amp;#x27; stop-opacity=&amp;#x27;1&amp;#x27;/%3e%3c/linearGradient%3e%3c/svg%3e&quot; title=&quot;IPv6-only islands connected through a dual-stack core&quot; width=&quot;1865.703125&quot;&gt;
&lt;p&gt;The address plan underneath that topology is the part people underinvest in, and it’s the part that actually determines whether the migration is boring or miserable two years in. Flat is the enemy. Assign a /48 or /56 per site with a fixed hierarchy and you can summarize routes at every level and delegate blocks to regional teams without a spreadsheet fight every quarter.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise allocation&lt;/td&gt;
&lt;td&gt;/32&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8::/32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One block from your RIR (or provider PA space if you’re not running your own ASN yet). Sub-allocate internally, don’t request more than one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;/36&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8:1000::/36&lt;/code&gt; (AMER), &lt;code&gt;2001:db8:2000::/36&lt;/code&gt; (EMEA)&lt;/td&gt;
&lt;td&gt;4 bits per region = 16 regions with room to spare&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site / data center&lt;/td&gt;
&lt;td&gt;/48&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8:1210::/48&lt;/code&gt; (us-east-dc2)&lt;/td&gt;
&lt;td&gt;Roughly the guidance in RFC 6177; a small branch office doesn’t need a full /48, so I use /56 there and save /48s for real DCs and campuses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segment / VLAN / pod CIDR&lt;/td&gt;
&lt;td&gt;/64&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8:1210:a3::/64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One per L2 segment, or the block a Kubernetes cluster carves per-node pod ranges out of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router point-to-point link&lt;/td&gt;
&lt;td&gt;/127&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8:1210:ffff::1/127&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per RFC 6164. Don’t burn a /64 on a two-node link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loopback&lt;/td&gt;
&lt;td&gt;/128&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2001:db8:1210:ffff::1/128&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Router ID, anycast source&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For the Kubernetes piece specifically, dual-stack has to be declared at the cluster level before it shows up at the Service level. You can’t retrofit it onto a running cluster’s pod network without a CIDR migration, so get this right at cluster build time:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# kubeadm ClusterConfiguration fragment - dual-stack cluster networking.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# This is what actually gets you dual-stack pods and services, not just&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# a dual-stack NIC on the node.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;kubeadm.k8s.io/v1beta3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;ClusterConfiguration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;networking&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  podSubnet&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;10.244.0.0/16,2001:db8:1210:a300::/56&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  serviceSubnet&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;10.96.0.0/12,2001:db8:1210:a3ff::/108&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;inference-api&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  ipFamilyPolicy&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;PreferDualStack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  ipFamilies&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;IPv6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;IPv4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  selector&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;    app&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;inference-api&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;  ports&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#22863A&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A&quot;&gt;      targetPort&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;8443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The order in &lt;code&gt;ipFamilies&lt;/code&gt; isn’t cosmetic. The first entry becomes the primary family and gets &lt;code&gt;.spec.clusterIP&lt;/code&gt;, which matters for anything that only reads that one field instead of &lt;code&gt;clusterIPs&lt;/code&gt;. And confirm your CNI and cloud load-balancer integration actually support dual-stack before you flip this in production; Calico and Cilium do, but plenty of managed load-balancer controllers still only provision a v4 frontend even when the Service behind it is dual-stack.&lt;/p&gt;
&lt;p&gt;For the IPv6-only islands, DNS64 and NAT64 are the seam that lets them reach anything that hasn’t moved yet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# BIND9 dns64 clause - synthesizes AAAA records for IPv4-only legacy
# hosts, so an IPv6-only client gets a routable address instead of NXDOMAIN
dns64 64:ff9b::/96 {
    clients { ipv6-only-islands; };
    mapped { !10.0.0.0/8; any; };
    exclude { 64:ff9b::/96; ::ffff:0:0/96; };
};
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Jool NAT64 instance (syntax varies by version - illustrative) - translates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 64:ff9b::/96 traffic back to a real routable IPv4 address at the edge&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;jool&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; instance&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; nat64-edge&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; --netfilter&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; --pool6&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; 64:ff9b::/96&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;jool&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; nat64-edge&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; global&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; pool4&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; --tcp&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; --add&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; 203.0.113.50/32&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Neither of these is meant to be permanent architecture. Treat NAT64/DNS64 as a transition device with a removal date attached to each legacy service it’s covering. Don’t build new dependencies on it.&lt;/p&gt;
&lt;h2 id=&quot;decision-criteria-dual-stack-vs-ipv6-only--nat64dns64-vs-ipv6-mostly&quot;&gt;Decision criteria: dual-stack vs. IPv6-only + NAT64/DNS64 vs. IPv6-mostly&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Dual-Stack Everywhere&lt;/th&gt;
&lt;th&gt;IPv6-Only + NAT64/DNS64&lt;/th&gt;
&lt;th&gt;IPv6-Mostly (Dual-Stack Edge, IPv6-Only Core)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App/library compatibility&lt;/td&gt;
&lt;td&gt;Highest. Every legacy IPv4-only app and library keeps working untouched&lt;/td&gt;
&lt;td&gt;Lowest. Anything with a hardcoded IPv4 literal or a v4-only library breaks until fixed&lt;/td&gt;
&lt;td&gt;Good. Legacy stays dual-stack at the edge; only new/internal services need to be v6-clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address-exhaustion relief&lt;/td&gt;
&lt;td&gt;Minimal short-term. Every host still consumes RFC1918 space on its v4 side&lt;/td&gt;
&lt;td&gt;Complete. New fabric and clusters never touch private v4 space again&lt;/td&gt;
&lt;td&gt;Strong. The growth that was actually eating your address space (new clusters, new GPU fabric) stops doing so&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity (running two stacks)&lt;/td&gt;
&lt;td&gt;Highest, indefinitely. Every ACL, monitoring rule, and runbook exists twice, forever&lt;/td&gt;
&lt;td&gt;Lower once cut over. One internal stack; NAT64/DNS64 is one well-understood edge component&lt;/td&gt;
&lt;td&gt;Moderate. Complexity concentrated at the edge boundary instead of spread through the whole estate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security parity effort&lt;/td&gt;
&lt;td&gt;High but at least symmetric. One policy engine usually covers both families equally&lt;/td&gt;
&lt;td&gt;High and asymmetric. The v6-only interior is simpler to secure, but the NAT64 gateway becomes a chokepoint that needs its own hardening and logging&lt;/td&gt;
&lt;td&gt;Moderate. The edge needs full dual-stack parity; the core only needs v6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollout risk&lt;/td&gt;
&lt;td&gt;Low per-step, high cumulative cost. Safe, but you never actually finish&lt;/td&gt;
&lt;td&gt;Highest per-step. A broken v6-only cutover has no v4 fallback&lt;/td&gt;
&lt;td&gt;Balanced. New builds carry the risk, legacy is untouched until its own retirement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Orgs early in migration, or with a hard requirement that specific legacy IPv4-only integrations keep working indefinitely&lt;/td&gt;
&lt;td&gt;Greenfield GPU fabrics and new Kubernetes clusters where you control every workload going in&lt;/td&gt;
&lt;td&gt;Most large enterprises mid-migration. New capacity built v6-only, legacy kept dual-stack until it’s decommissioned on its own schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If I had to compress this into one line for a steering committee: don’t run dual-stack forever, and don’t flag-day your way into IPv6-only either. Build new capacity as IPv6-only from day one, keep legacy dual-stack until it’s decommissioned anyway, and let NAT64/DNS64 be the seam between the two. Keep it a transition device with a removal date, not a permanent piece of the architecture.&lt;/p&gt;
&lt;h2 id=&quot;pitfalls-and-what-id-do-in-production&quot;&gt;Pitfalls and what I’d do in production&lt;/h2&gt;
&lt;p&gt;Don’t flag-day it, and don’t let “eventually” pass for a plan either. Flipping a whole estate to dual-stack or IPv6-only in one maintenance window guarantees you discover every broken assumption at the same time, usually at 2am. What I’d do: sequence by blast radius. Greenfield workloads first, since they carry no legacy baggage, then internal east-west traffic between teams who can coordinate fixes together, then anything client-facing or regulated last, with a hard decommission date on the old path so dual-stack doesn’t quietly become permanent.&lt;/p&gt;
&lt;p&gt;Hardcoded IPv4 literals and v4-only libraries don’t announce themselves until traffic actually hits them. A config file with a literal dotted-quad, a monitoring agent that only opens v4 sockets, a vendor appliance whose management API has no v6 support at all: none of this surfaces in a design review. It surfaces in production, as a silent timeout from a v6-only pod. What I’d do: grep every config repo for IPv4 literals before cutover, and, more useful than any static scan, actually run each candidate service in an IPv6-only test namespace before anyone calls it “IPv6 ready.” A code review can’t catch what a real socket call will.&lt;/p&gt;
&lt;p&gt;Security tooling parity lags the network layer, and that gap is where the real exposure lives. Firewalls, IDS/IPS signatures, NetFlow/sFlow collectors, and SIEM parsers were tuned against years of v4 traffic and get bolted-on v6 support nobody has stress-tested. An ACL that’s airtight on v4 and default-permit on v6 because someone forgot to mirror the rule is an exploitable hole, not a theoretical one. What I’d do: audit every control on the path (firewall, ACL, IDS, flow logging) for explicit v6 parity before v6 goes live anywhere that matters, and treat “does the SIEM actually parse this v6 log format” as a launch blocker rather than a backlog ticket.&lt;/p&gt;
&lt;p&gt;Dual-stack doubles your operational surface, and it stays doubled for as long as you run it. Every ACL, monitoring rule, capacity plan, and incident runbook now has a v4 branch and a v6 branch, and they drift apart the moment one gets updated without the other. That’s the real cost of dual-stack: not a performance tax but an ongoing tax on whoever’s holding the pager. What I’d do: attach a real decommission date to dual-stack for each workload at migration time, not just an intention. No date means no plan, and you’ll be running both stacks longer than you think.&lt;/p&gt;
&lt;p&gt;Happy Eyeballs will quietly hide a broken IPv6 path from you, which is worse than an outright outage. Client OSes race both address families per RFC 8305 and use whichever connects first, so a broken v6 route on your egress path can sit broken for weeks. Traffic just falls back to v4 every time, and nothing pages anyone. What I’d do: monitor v6 connection success rate as its own signal, separate from the blended success rate, and alert on it independently. Watch only the combined number and a 100%-failing v6 path with working v4 fallback looks identical to a fully healthy dual-stack service.&lt;/p&gt;
&lt;p&gt;If your monitoring and logging stack doesn’t understand v6, you’re flying blind the moment you turn it on. Flow exporters that only emit v4 records, log parsers with a regex that matches dotted-quad and nothing else, dashboards that silently drop or mis-bucket v6 addresses: you find out during the first v6 incident, which is the worst possible time to learn it. What I’d do: validate end-to-end v6 visibility (flow collection, log parsing, alerting) before the network change goes out, using synthetic v6 traffic to confirm every hop in the observability pipeline actually sees it.&lt;/p&gt;
&lt;p&gt;ULA vs. GUA is a real decision, not a formality. Get it wrong and you re-architect later. Unique Local Addresses (RFC 4193, &lt;code&gt;fc00::/7&lt;/code&gt;) feel like the IPv6 answer to RFC1918: private, not globally routed. But they don’t get you out of NAT for anything that needs to reach the internet or a partner network, which defeats half the point of migrating in the first place. What I’d do: use GUA for anything that might ever need direct external reachability (which, once you count SaaS integrations and partner VPNs, is most things in a large enterprise), and reserve ULA narrowly, for genuinely isolated management or out-of-band networks that will never route externally. Don’t let nostalgia for RFC1918’s “private by default” model drag you into ULA everywhere; that just rebuilds a smaller version of the exhaustion problem you started this migration to escape.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7381.html&quot;&gt;RFC 7381: Enterprise IPv6 Deployment Guidelines&lt;/a&gt;. Planning and sequencing an enterprise migration.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6146.html&quot;&gt;RFC 6146: Stateful NAT64&lt;/a&gt;. Translation between IPv6 clients and IPv4 servers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6147.html&quot;&gt;RFC 6147: DNS64&lt;/a&gt;. Synthesizing IPv6 DNS answers for use with translation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8305.html&quot;&gt;RFC 8305: Happy Eyeballs Version 2&lt;/a&gt;. Connection attempts across address families and why fallback can hide a broken IPv6 path.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;. The full pillar on routing architecture for modern infrastructure&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/topics/networking/&quot;&gt;Networking&lt;/a&gt;. Networking design specifically for AI/ML workloads&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/bgp-for-the-ai-era-multi-region-routing-for-inference-workloads/&quot;&gt;BGP for the AI Era: Multi-Region Routing for Inference Workloads&lt;/a&gt;. The anycast and health-triggered withdrawal patterns there apply just as directly once your VIPs are dual-stack&lt;/li&gt;
&lt;li&gt;Zero-Downtime Renumbering: Merging Two Overlapping RFC1918 Networks After an Acquisition. Coming soon: the tactical playbook for the integration-week collision this article assumes you’ll eventually hit&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;planning-your-own-migration&quot;&gt;Planning your own migration?&lt;/h2&gt;
&lt;p&gt;If you’re mapping out an enterprise IPv6 migration and want a second opinion on the address plan or the NAT64 cutover sequence, I’m happy to compare notes. Connect with me on &lt;a href=&quot;https://www.linkedin.com/in/vkafed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; or reach out via &lt;a href=&quot;/contact/&quot;&gt;Contact&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Networking</category></item><item><title>Creating a New CA (SHA-512, 4096-bit) with PKCS #11 Smart Card Storage and Subordinate CA</title><link>https://vkafed.com/creating-a-new-ca-sha-512-4096-bit-with-pkcs-11-smart-card-storage-and-subordinate-ca/</link><guid isPermaLink="true">https://vkafed.com/creating-a-new-ca-sha-512-4096-bit-with-pkcs-11-smart-card-storage-and-subordinate-ca/</guid><description>Create a certificate authority with a 4096-bit RSA key, SHA-512 signatures, PKCS #11 smart card key storage, and a subordinate CA.</description><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Today, I will walk through the process of creating a new Certificate Authority (CA) using a 4096-bit RSA key and SHA-512 as the signature hash algorithm. I will also store the private key securely on a PKCS #11–compatible smart card, and then create a subordinate (sub) CA using the root CA. Throughout this guide, I will use recommended security controls that you should follow to protect your keys and certificates.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Why Use a Smart Card (PKCS #11)?&lt;/h2&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Storing your private key on a smart card (or Hardware Security Module, HSM) significantly enhances security by:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Preventing key extraction&lt;/strong&gt;: Private keys generated on or imported into smart cards cannot be easily exported in plain text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware-based security&lt;/strong&gt;: Many smart cards implement protections against physical tampering and side-channel attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure key usage&lt;/strong&gt;: Sign and decrypt operations occur on the card, which reduces exposure of the private key.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Recommended Security Controls&lt;/h2&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Before diving into commands, keep these best practices in mind:&lt;/p&gt;
&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Offline Root CA&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Maintain your &lt;strong&gt;root CA&lt;/strong&gt; offline (on a laptop or computer not connected to any network).&lt;/li&gt;
&lt;li&gt;Only bring it online in a secure environment when issuing or renewing certificates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Physical Security&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Store the smart card containing the root CA key in a locked safe or a secure location.&lt;/li&gt;
&lt;li&gt;Use tamper-evident bags or containers for added protection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strong Passphrase/PIN&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Use a complex PIN/passphrase for the smart card (or HSM).&lt;/li&gt;
&lt;li&gt;Never store the PIN/passphrase on the same device or in the same physical location as the smart card.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dedicated Machine for CA Operations&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Limit software installed on the CA machine to the bare minimum (e.g., OpenSSL, PKCS #11 drivers).&lt;/li&gt;
&lt;li&gt;Keep the system fully patched and hardened.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular Audits and Logging&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Maintain logs of issuance, revocation, and key usage.&lt;/li&gt;
&lt;li&gt;Periodically review who has access to the CA environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-factor Authentication (MFA)&lt;/strong&gt;:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;If possible, layer an additional form of authentication (e.g., a separate password or token) to access CA resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;With these controls in place, let’s move on to the technical steps.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Step-by-Step: Creating a Root CA (SHA-512, 4096-bit) on a Smart Card&lt;/h2&gt;
&lt;h3 class=&quot;wp-block-heading&quot;&gt;3.1 &lt;strong&gt;Install Required Packages&lt;/strong&gt;&lt;/h3&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;On most Linux systems, you will need:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install opensc openssl libengine-pkcs11-openssl pkcs11-tools
&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;OpenSSL&lt;/strong&gt;: Core cryptographic toolkit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSC&lt;/strong&gt;: Contains drivers and utilities for several PKCS #11 smart cards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pkcs11-tools&lt;/strong&gt;: Utility set for managing PKCS #11 tokens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;libengine-pkcs11-openssl&lt;/strong&gt;: Engine plugin allowing OpenSSL to communicate with PKCS #11–compatible devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;wp-block-heading&quot;&gt;3.2 &lt;strong&gt;Initialize and Prepare Your Smart Card&lt;/strong&gt;&lt;/h3&gt;
&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Insert the smart card into your reader.&lt;/li&gt;
&lt;li&gt;Initialize the card (careful—this may erase existing keys!). For example, with &lt;code&gt;pkcs15-init&lt;/code&gt; from OpenSC:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&lt;code&gt;pkcs15-init --create-pkcs15 --profile pkcs15+onepin --pin 123456 --puk 654321&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--pin 123456&lt;/strong&gt;&lt;/code&gt; – sets your user PIN (example value; use a stronger PIN in reality).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--puk 654321&lt;/strong&gt;&lt;/code&gt; – &lt;span style=&quot;color: initial&quot;&gt;sets an unblock code if the PIN is entered incorrectly too many times. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Alternatively, you can use &lt;code&gt;pkcs11-tool&lt;/code&gt; commands depending on your card’s vendor and management software.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot;&gt;3.3 &lt;strong&gt;Generate or Import the Root CA Key onto the Smart Card&lt;/strong&gt;&lt;/h3&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;There are two main approaches to get the key onto the card:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Generate directly on the card&lt;/strong&gt; (best practice, more secure).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate externally and import&lt;/strong&gt; (some cards may not support this, or you might prefer external generation).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;3.3.1 Generating the Key on the Card&lt;/strong&gt;&lt;/h4&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&lt;code&gt;pkcs11-tool --module /usr/lib/opensc-pkcs11.so \
            --login \
            --keypairgen \
            --key-type RSA:4096 \
            --label &quot;RootCA-Key&quot; \
            --id 01 \
            --pin 123456
&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--module&lt;/strong&gt;&lt;/code&gt; points to your PKCS #11 driver (path may differ by system).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--keypairgen&lt;/strong&gt;&lt;/code&gt; performs the on-card key generation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--label &quot;RootCA-Key&quot;&lt;/strong&gt;&lt;/code&gt; helps identify the key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;--id 01&lt;/strong&gt;&lt;/code&gt; sets a hex identifier for the key, which you can reference later.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;3.3.2 Creating the Root CA Certificate Request&lt;/strong&gt;&lt;/h4&gt;
&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Create a configuration file for OpenSSL (let’s call it &lt;code&gt;&lt;strong&gt;root-ca.conf&lt;/strong&gt;&lt;/code&gt;) specifying default settings, like so:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[ req ]
default_bits       = 4096
default_keyfile    = rootCA.key
distinguished_name = req_distinguished_name
req_extensions     = v3_req
prompt             = no

[ req_distinguished_name ]
C  = US
ST = YourState
L  = YourCity
O  = YourOrganization
OU = Root CA
CN = vkafed.com Root CA

[ v3_req ]
keyUsage = critical, keyCertSign, cRLSign
basicConstraints = critical, CA:true
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Use OpenSSL’s PKCS #11 engine to create a certificate request that references the on-card key&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;openssl req -new -engine pkcs11 \
    -keyform engine \
    -key &quot;pkcs11:object=RootCA-Key;type=private;pin-value=123456&quot; \
    -config root-ca.conf \
    -sha512 \
    -out rootCA.csr&lt;/code&gt;&lt;/pre&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;3.3.3 Self-Sign the Root CA Certificate&lt;/strong&gt;&lt;/h4&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Because this is a &lt;strong&gt;root&lt;/strong&gt; CA, we are self-signing:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;openssl x509 -req -in rootCA.csr -sha512 \
    -extensions v3_req \
    -signkey &quot;pkcs11:object=RootCA-Key;type=private;pin-value=123456&quot; \
    -days 3650 \
    -out rootCA.crt
&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;-days 3650&lt;/strong&gt;&lt;/code&gt; (10 years) is an example. Adjust it if needed.&lt;/li&gt;
&lt;li&gt;The resulting file &lt;strong&gt;rootCA.crt&lt;/strong&gt; is your self-signed root CA certificate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Store&lt;/strong&gt; &lt;code&gt;rootCA.crt&lt;/code&gt; in a secure offline location (and keep backups!).&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;4. &lt;strong&gt;Creating a Subordinate CA (SubCA)&lt;/strong&gt;&lt;/h2&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Next, we create a subordinate CA signed by the root CA.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot;&gt;4.1 &lt;strong&gt;Generate SubCA Keys and CSR&lt;/strong&gt;&lt;/h3&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;You may generate this subordinate CA key in software or on another smart card, depending on your security policies. Below is a software-based example:&lt;/p&gt;
&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Generate the key pair:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;openssl genrsa -out subCA.key 4096&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;2. Create a configuration file for the SubCA (e.g., &lt;code&gt;sub-ca.conf&lt;/code&gt;):&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[ req ]
default_bits       = 4096
default_keyfile    = subCA.key
distinguished_name = req_distinguished_name
req_extensions     = v3_req
prompt             = no

[ req_distinguished_name ]
C  = US
ST = YourState
L  = YourCity
O  = YourOrganization
OU = Sub CA
CN = vkafed.com Sub CA

[ v3_req ]
keyUsage = critical, keyCertSign, cRLSign
basicConstraints = critical, CA:true, pathlen=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;3. Generate the CSR:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;openssl req -new -sha512 -key subCA.key -config sub-ca.conf -out subCA.csr&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;4.2 &lt;strong&gt;Sign the SubCA CSR Using the Offline Root CA&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;On your offline root CA machine (where &lt;code&gt;rootCA.crt&lt;/code&gt; and root CA smart card are stored), sign the SubCA CSR:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;openssl x509 -req -in subCA.csr \
    -CA rootCA.crt \
    -CAkey &quot;pkcs11:object=RootCA-Key;type=private;pin-value=123456&quot; \
    -CAcreateserial \
    -days 1825 \
    -sha512 \
    -extensions v3_req \
    -extfile sub-ca.conf \
    -out subCA.crt&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;-CAcreateserial&lt;/strong&gt;&lt;/code&gt; will create a file &lt;code&gt;rootCA.srl&lt;/code&gt; that tracks certificate serial numbers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;strong&gt;-days 1825&lt;/strong&gt;&lt;/code&gt; sets the SubCA certificate to be valid for 5 years (example; adjust if needed).&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;5. &lt;strong&gt;Final Security Considerations&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Secure Storage&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Keep the root CA’s smart card physically secured and offline.&lt;/li&gt;
&lt;li&gt;Maintain secure backups (preferably in another physical location).&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Revocation Mechanisms&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Publish a Certificate Revocation List (CRL) or use Online Certificate Status Protocol (OCSP) so end-users can check certificate status.&lt;/li&gt;
&lt;li&gt;Host the CRL or OCSP service in a reliable location.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Certificate Policies&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Draft a Certificate Policy (CP) and a Certification Practice Statement (CPS) if this CA will be used for a production or public trust environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Regular Renewal and Key Rollover&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Plan certificate renewal schedules and ensure that sub CA and end-entity certificates are renewed before they expire.&lt;/li&gt;
&lt;li&gt;Periodically rotate (reissue) keys to reduce long-term exposure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Logging and Monitoring&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Log all CA operations (issuance, revocation, etc.).&lt;/li&gt;
&lt;li&gt;Monitor your environment for unauthorized issuance attempts or suspicious access.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content:encoded><category>PKI &amp; Encryption</category></item><item><title>Running PostgreSQL in Docker on my Mac</title><link>https://vkafed.com/running-postgresql-in-docker-on-my-mac/</link><guid isPermaLink="true">https://vkafed.com/running-postgresql-in-docker-on-my-mac/</guid><description>Run PostgreSQL in Docker on macOS, with container setup notes and the original follow-up collection of PostgreSQL commands and examples.</description><pubDate>Mon, 13 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;It’s extremely convenient to run your local tools, like RDMS, development environments and so on on Docker containers on Mac. To be honest with you, I hate installing a bunch of software on my Mac, and that’s the main reason why do I use containers for my local development.&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Before doing that manual, make sure your Docker is installed on Mac. To do so, you can go to https://www.docker.com/products/docker-desktop and download the latest version of Docker for your Mac.&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;So, how do I can use PostgreSQL on Mac in a Docker container? Let’s create a new Project folder, or you may use your own where docker-compose files.&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;mkdir ~/Projects
cd ~/Projects&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;And creating a docker-compose.yml file with the following code:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;#File: docker-compose.yml 
version: &quot;3&quot;
services:
  db:
    image: &quot;postgres:11&quot;
    container_name: &quot;local_postgres&quot;
    ports:
      - &quot;54320:5432&quot;
    volumes:
      - dbdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      - POSTGRES_PASSWORD=somesecretpassword
volumes:
  dbdata:&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;So, a quick clarification on what we do here. We use postgres:11 image, naming containers as local_postgres, expose port 54320, store data on dbdata volume, use passwordless access to database (as you we do everything locally), and use somesecretpassword as password. Pretty straight forward, ha?&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Ok, let’s build it and run it:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;You shouldn’t see any errors, and let’s see logs with the following command:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;docker logs -f local_postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;And if we can connect to database, like this:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;docker exec -it local_postgres psql -U postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Hit CTRL+D to exit from the prompt.&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Create a database&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;So, to create a database, you can run the following command, where &lt;em&gt;&lt;strong&gt;new_database&lt;/strong&gt;&lt;/em&gt; is database new you want to create.&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;docker exec -it my_postgres psql -U postgres -c &quot;create database new_database&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;You can use a database connection now with the following login details:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;host=&apos;localhost&apos;,
port=54320,
dbname=&apos;hew_database&apos;,
user=&apos;postgres&apos;,
password=&apos;somesecretpassword&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;That’s pretty much it. Easy, right? &lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Please comment below if you have any issues or questions!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;postgresql-notes-2020-04-20&quot;&gt;PostgreSQL Notes&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Originally published April 20, 2020.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;How to drop all tables sharing the same prefix in PostgreSQL?&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;DO
$do$
DECLARE
   _tbl text;
BEGIN
FOR _tbl  IN
    SELECT quote_ident(table_schema) || &apos;.&apos;
        || quote_ident(table_name)
    FROM   information_schema.tables
    WHERE  table_name LIKE &apos;[prefix]&apos; || &apos;%&apos;
    AND    table_schema NOT LIKE &apos;pg\_%&apos;
LOOP
-- RAISE NOTICE &apos;%&apos;,
  EXECUTE &apos;DROP TABLE &apos; || _tbl || &apos; CASCADE&apos;;
END LOOP;
END
$do$;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;&lt;li&gt;Non-Cascade version:&lt;/li&gt;&lt;/ul&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;EXECUTE &apos;DROP TABLE &apos; || _tbl;&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;How to drop all functions in PostgreSQL?&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;DO
$do$
DECLARE
   _sql text;
BEGIN
   SELECT INTO _sql
          string_agg(format(&apos;DROP %s %s;&apos;
                          , CASE WHEN proisagg THEN &apos;AGGREGATE&apos; ELSE &apos;FUNCTION&apos; END
                          , oid::regprocedure)
                   , E&apos;\n&apos;)
   FROM   pg_proc
   WHERE  pronamespace = &apos;public&apos;::regnamespace;

   IF _sql IS NOT NULL THEN
      RAISE NOTICE &apos;%&apos;, _sql;
      -- EXECUTE _sql;
   ELSE 
      RAISE NOTICE &apos;No fuctions found in schema %&apos;, quote_ident(_schema);
   END IF;
END
$do$  LANGUAGE plpgsql;&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded></item><item><title>ElementaryOS: Resolution fix for 2560×1440</title><link>https://vkafed.com/elementaryos-resolution-fix-for-2560x1440/</link><guid isPermaLink="true">https://vkafed.com/elementaryos-resolution-fix-for-2560x1440/</guid><description>An Xorg monitor configuration that fixed 2560 by 1440 display resolution on my ElementaryOS installation.</description><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Edit &lt;strong&gt;/usr/share/X11/xorg.conf.d/10-monitor.conf&lt;/strong&gt; and paste the following:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;Section &quot;Monitor&quot;
  Identifier &quot;Monitor0&quot;
  Section &quot;Monitor&quot;
  Identifier &quot;Monitor0&quot;
  Modeline &quot;2560x1440_60.00&quot;  661.25  2560 2784 3064 3568 1440 1443 1448 1545 -hsync +vsync
EndSection
Section &quot;Screen&quot;
  Identifier &quot;Screen0&quot;
  Device &quot;Virtual1&quot;
  Monitor &quot;Monitor0&quot;
  DefaultDepth 24
  SubSection &quot;Display&quot;
    Depth 24
    Modes &quot;2560x1440_60.00&quot;
  EndSubSection
EndSection&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;And reboot system with &lt;strong&gt;sudo reboot&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;# sudo reboot&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Thanks!&lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title>SendMail function in Golang</title><link>https://vkafed.com/sendmail-in-go/</link><guid isPermaLink="true">https://vkafed.com/sendmail-in-go/</guid><description>A Go helper for sending HTML and plain-text email over SMTP, with a complete function and usage example.</description><pubDate>Mon, 28 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Easy-to-use function to send HTML and plain-text emails in Go&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;func SendMail(addr, from, subject, body string, to []string) error {
	r := strings.NewReplacer(&quot;\r\n&quot;, &quot;&quot;, &quot;\r&quot;, &quot;&quot;, &quot;\n&quot;, &quot;&quot;, &quot;%0a&quot;, &quot;&quot;, &quot;%0d&quot;, &quot;&quot;)
	c, err := smtp.Dial(addr)
	if err != nil {
		return err
	}
	defer c.Close()
	if err = c.Mail(r.Replace(from)); err != nil {
		return err
	}
	for i := range to {
		to[i] = r.Replace(to[i])
		if err = c.Rcpt(to[i]); err != nil {
			return err
		}
	}
	w, err := c.Data()
	if err != nil {
		return err
	}
	msg := &quot;To: &quot; + strings.Join(to, &quot;,&quot;) + &quot;\r\n&quot; +
		&quot;From: &quot; + from + &quot;\r\n&quot; +
		&quot;Subject: &quot; + subject + &quot;\r\n&quot; +
		&quot;Content-Type: text/html; charset=\&quot;UTF-8\&quot;\r\n&quot; +
		&quot;Content-Transfer-Encoding: base64\r\n&quot; +
		&quot;\r\n&quot; + base64.StdEncoding.EncodeToString([]byte(body))
	_, err = w.Write([]byte(msg))
	if err != nil {
		return err
	}
	err = w.Close()
	if err != nil {
		return err
	}
	return c.Quit()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Usage:&lt;/p&gt;
&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;SendMail(&quot;127.0.0.1:25&quot;, (&amp;#x26;amp;mail.Address{&quot;from name&quot;, &quot;from@example.com&quot;}).String(), &quot;Email Subject&quot;, &quot;message body&quot;, []string{(&amp;#x26;amp;mail.Address{&quot;to name&quot;, &quot;to@example.com&quot;}).String()})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>Email Security &amp; Privacy</category></item><item><title>Apache 2.4.6 + mod_wsgi + Python 3.6 + Django 2.2.6 on CentOS 7</title><link>https://vkafed.com/apache-2-4-6-mod_wsgi-python-3-6-django-2-2-6-on-centos-7/</link><guid isPermaLink="true">https://vkafed.com/apache-2-4-6-mod_wsgi-python-3-6-django-2-2-6-on-centos-7/</guid><description>Build mod_wsgi for Python 3.6 and run Django 2.2.6 behind Apache 2.4.6 on CentOS 7, with configuration notes from my setup.</description><pubDate>Mon, 14 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;There are many how-to’s on installing Apache with mod_wsgi, python 3.x and Django, but nothing worked for me, looks like mod_wsgi libraries installed by default with yum use Python 2.x, and I keep getting the following error message:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;[Mon Oct 14 09:42:07.713418 2019] [:error] [pid 18066] [remote 10.30.40.31:0] mod_wsgi (pid=18066): Target WSGI script &apos;/usr/local/val/app/app/wsgi.py&apos; cannot be loaded as Python module.
[Mon Oct 14 09:42:07.713497 2019] [:error] [pid 18066] [remote 10.30.40.31:0] mod_wsgi (pid=18066): Exception occurred processing WSGI script &apos;/usr/local/val/app/wsgi.py&apos;.
[Mon Oct 14 09:42:07.713560 2019] [:error] [pid 18066] [remote 10.30.40.31:0] Traceback (most recent call last):
[Mon Oct 14 09:42:07.713596 2019] [:error] [pid 18066] [remote 10.30.40.31:0]   File &quot;/usr/local/val/app/app/wsgi.py&quot;, line 12, in &amp;#x3C;module&gt;
[Mon Oct 14 09:42:07.713701 2019] [:error] [pid 18066] [remote 10.30.40.31:0]     from django.core.wsgi import get_wsgi_application
[Mon Oct 14 09:42:07.713718 2019] [:error] [pid 18066] [remote 10.30.40.31:0]   File &quot;/usr/local/val/venv/lib/python3.6/site-packages/django/__init__.py&quot;, line 1, in &amp;#x3C;module&gt;
[Mon Oct 14 09:42:07.713789 2019] [:error] [pid 18066] [remote 10.30.40.31:0]     from django.utils.version import get_version
[Mon Oct 14 09:42:07.713804 2019] [:error] [pid 18066] [remote 10.30.40.31:0]   File &quot;/usr/local/val/venv/lib/python3.6/site-packages/django/utils/version.py&quot;, line 71, in &amp;#x3C;module&gt;
[Mon Oct 14 09:42:07.713886 2019] [:error] [pid 18066] [remote 10.30.40.31:0]     @functools.lru_cache()
[Mon Oct 14 09:42:07.713914 2019] [:error] [pid 18066] [remote 10.30.40.31:0] AttributeError: &apos;module&apos; object has no attribute &apos;lru_cache&apos;
&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Installing Apache and devel package&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ yum install httpd httpd-devel wget&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;So, I had to compile &lt;strong&gt;mod_wsgi&lt;/strong&gt; library from sources, which actually helped me to fix the error above with running Django app with wsgi.&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Let’s make sure we have Python 3.6 or 3.7 installed or actually it would work with any Python 3 minor version.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ python3
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;If we have Python 3 installed, we need to make sure we got mod_wsgi removed, which was installed by yum.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ yum remove mod_wsgi&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Downloading, compiling and installing a mod_wsgi package by doing this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ cd /opt
$ wget https://files.pythonhosted.org/packages/25/d8/1df4ba9c051cd88e02971814f0867274a8ac821baf983b6778dacd6e31f7/mod_wsgi-4.6.8.tar.gz
$ tar -zxvf mod_wsgi-4.6.8.tar.gz
$ cd mod_wsgi-4.6.8
$ ./configure --with-python=/usr/bin/python3.6
$ LD_RUN_PATH=/usr/local/lib make
$ sudo make install&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Add a new entry to /etc/ld.so.conf&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;include ld.so.conf.d/*.conf
include /usr/local/lib&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Run:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;ldconfig&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Make sure &lt;strong&gt;mod_wsgi&lt;/strong&gt; linked properly:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;# ldd usr/lib64/httpd/modules/mod_wsgi.so
	linux-vdso.so.1 =&gt;  (0x00007ffd5bdd7000)
	libpython3.6m.so.1.0 =&gt; /lib64/libpython3.6m.so.1.0 (0x00007fe5ab02b000)
	libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007fe5aae0f000)
	libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007fe5aac0b000)
	libutil.so.1 =&gt; /lib64/libutil.so.1 (0x00007fe5aaa08000)
	libm.so.6 =&gt; /lib64/libm.so.6 (0x00007fe5aa706000)
	libc.so.6 =&gt; /lib64/libc.so.6 (0x00007fe5aa338000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe5ab78f000)&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Install Django:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ pip3.6 install --upgrade pip
$ pip3.6 install Django&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Verify Django installed properly:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ django-admin version
2.2.6&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;My httpd configuration file looks like this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;Alias /static /usr/local/val/app/static
&amp;#x3C;Directory /usr/local/val/app/static&gt;
 Require all granted
&amp;#x3C;/Directory&gt;

&amp;#x3C;Directory /usr/local/val/app/app&gt;
   &amp;#x3C;Files wsgi.py&gt;
       Require all granted
   &amp;#x3C;/Files&gt;
&amp;#x3C;/Directory&gt;

WSGIDaemonProcess app python-path=/usr/local/val/app:/usr/local/val/venv/lib/python3.6/site-packages python-home=/usr/local/val/env
WSGIProcessGroup app
WSGIScriptAlias / /usr/local/val/app/app/wsgi.py
WSGIPassAuthorization On&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Where &lt;strong&gt;app &lt;/strong&gt;is the name of my django app, and val is directory where app is located.&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Before that I created virtual environment by running this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ python3 -m venv /usr/local/val/env&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Test if everything works correctly, you may probably also want to add your hosts to &lt;strong&gt;ALLOWED_HOSTS&lt;/strong&gt; in your settings.py file and setup static files by specifying the following paths in your settings.py&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;STATIC_ROOT = &apos;/usr/local/val/app/static/&apos;
STATIC_URL = &apos;/static/&apos;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Let me know if you have any questions&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Thanks!&lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title>Nagios environment variables</title><link>https://vkafed.com/nagios-environment-variables/</link><guid isPermaLink="true">https://vkafed.com/nagios-environment-variables/</guid><description>Pass environment variables to Nagios through systemd using Environment or EnvironmentFile instead of relying on the old sysconfig setup.</description><pubDate>Thu, 05 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;As soon as Nagios is managed by systemd, you have to change the passing environment variables from /etc/sysconfig/nagios to systemd&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Edit the file&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ vi /etc/systemd/system/multi-user.target.wants/nagios.service&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Add &lt;strong&gt;Environment=””&lt;/strong&gt; or &lt;strong&gt;EnvironmentFile=””&lt;/strong&gt; to [&lt;strong&gt;service&lt;/strong&gt;] section&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;[Service]
Type=forking
ExecStartPre=/usr/sbin/nagios -v /etc/nagios/nagios.cfg
ExecStart=/usr/sbin/nagios -d /etc/nagios/nagios.cfg
ExecStop=/usr/bin/kill -s TERM ${MAINPID}
ExecStopPost=/usr/bin/rm -f /var/spool/nagios/cmd/nagios.cmd
ExecReload=/usr/bin/kill -s HUP ${MAINPID}
Environment=&quot;PYTHONHTTPSVERIFY=1&quot;&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Restart systemd and nagios&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ sudo systemctl daemon-reload
$ sudo systemctl restart nagios&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Check the process environment&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;$ cat /proc/30195/environ
LANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binPYTHONHTTPSVERIFY=1
$&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;That will pass all variables into Nagios daemon&lt;/p&gt;
&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;&lt;p&gt;&lt;em&gt;Nagios, the Nagios logo, and Nagios graphics are the servicemarks,  trademarks, or registered trademarks owned by Nagios Enterprises. &lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;/contact/&quot;&gt;Let me know&lt;/a&gt; if you have any issues with monitoring. Will be glad to help 🙂&lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title>Happy Independence Day!</title><link>https://vkafed.com/happy-independence-day/</link><guid isPermaLink="true">https://vkafed.com/happy-independence-day/</guid><description>Wishing everybody a wonderful time on this special day in American history. Happy Fourth of July! God bless America!</description><pubDate>Thu, 04 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;has-medium-font-size wp-block-paragraph&quot;&gt;Wishing everybody a wonderful time on this special day in American history. Happy Fourth of July! &lt;strong&gt;God bless America!&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title>Open-Xchange IMAP: STARTTLS failure</title><link>https://vkafed.com/open-xchange-imap-starttls-failure/</link><guid isPermaLink="true">https://vkafed.com/open-xchange-imap-starttls-failure/</guid><description>Troubleshoot an IMAP STARTTLS failure in Open-Xchange App Suite 7.10.1 by setting explicit SSL protocol and cipher configuration values.</description><pubDate>Thu, 02 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;During some experiments with open-sources code, found an issue with STARTTLS on the latest open-xchange appsuite 7.10.1-Rev9&lt;/p&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Something like this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;com.openexchange.exception.OXException: LGI-0003 Categories=ERROR Message=&apos;Unknown problem: &quot;STARTTLS failure&quot;.&apos; exceptionID=-1484511495-7
	at com.openexchange.exception.OXExceptionFactory.create(OXExceptionFactory.java:175)
	at com.openexchange.exception.OXExceptionFactory.create(OXExceptionFactory.java:165)
	at com.openexchange.exception.OXExceptionFactory.create(OXExceptionFactory.java:138)
	at com.openexchange.authentication.LoginExceptionCodes.create(LoginExceptionCodes.java:267)
	at com.openexchange.authentication.imap.impl.IMAPAuthentication.handleLoginInfo(IMAPAuthentication.java:373)
	at com.openexchange.authentication.service.Authentication.login(Authentication.java:111)
	at com.openexchange.authentication.service.Authentication.login(Authentication.java:98)
	at com.openexchange.login.internal.NormalLoginMethod.doAuthentication(NormalLoginMethod.java:83)
	at com.openexchange.login.internal.LoginPerformer.doLogin(LoginPerformer.java:216)
	at com.openexchange.login.internal.LoginPerformer.doLogin(LoginPerformer.java:157)
	at com.openexchange.login.internal.LoginPerformer.doLogin(LoginPerformer.java:145)
	at com.openexchange.ajax.login.Login$1.doLogin(Login.java:109)
	at com.openexchange.ajax.login.AbstractLoginRequestHandler.loginOperation(AbstractLoginRequestHandler.java:226)
	at com.openexchange.ajax.login.AbstractLoginRequestHandler.loginOperation(AbstractLoginRequestHandler.java:184)
	at com.openexchange.ajax.login.Login.doLogin(Login.java:97)
	at com.openexchange.ajax.login.Login.handleRequest(Login.java:90)
	at com.openexchange.ajax.LoginServlet.doJSONAuth(LoginServlet.java:793)
	at com.openexchange.ajax.LoginServlet.doGet(LoginServlet.java:758)
	at com.openexchange.ajax.LoginServlet.doPost(LoginServlet.java:878)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:706)
	at com.openexchange.ajax.AJAXServlet.doService(AJAXServlet.java:566)
	at com.openexchange.ajax.LoginServlet.service(LoginServlet.java:738)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
	at org.glassfish.grizzly.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:147)
	at com.openexchange.http.grizzly.servletfilter.RequestReportingFilter.doFilter(RequestReportingFilter.java:138)
	at org.glassfish.grizzly.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:137)
	at com.openexchange.http.grizzly.servletfilter.WrappingFilter.doFilter(WrappingFilter.java:222)
	at org.glassfish.grizzly.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:137)
	at com.openexchange.http.grizzly.service.http.OSGiAuthFilter.doFilter(OSGiAuthFilter.java:139)
	at org.glassfish.grizzly.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:137)
	at org.glassfish.grizzly.servlet.FilterChainImpl.invokeFilterChain(FilterChainImpl.java:106)
	at org.glassfish.grizzly.servlet.ServletHandler.doServletService(ServletHandler.java:226)
	at org.glassfish.grizzly.servlet.ServletHandler.service(ServletHandler.java:178)
	at com.openexchange.http.grizzly.service.http.OSGiMainHandler.service(OSGiMainHandler.java:301)
	at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:224)
	at com.openexchange.threadpool.internal.CustomThreadPoolExecutor$MDCProvidingRunnable.run(CustomThreadPoolExecutor.java:2575)
	at com.openexchange.threadpool.internal.CustomThreadPoolExecutor$Worker.runTask(CustomThreadPoolExecutor.java:841)
	at com.openexchange.threadpool.internal.CustomThreadPoolExecutor$Worker.run(CustomThreadPoolExecutor.java:868)
	at java.lang.Thread.run(Thread.java:748)
Caused by: javax.mail.MessagingException: STARTTLS failure
	at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:954)
	at javax.mail.Service.connect(Service.java:369)
	at com.openexchange.authentication.imap.impl.IMAPAuthentication.handleLoginInfo(IMAPAuthentication.java:357)
	... 34 common frames omitted
&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Looks like empty vars for SSL protocol and SSL ciphersuites are not working properly, if specify them everything works just fine.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;generic&quot; data-enlighter-theme=&quot;&quot; data-enlighter-highlight=&quot;&quot; data-enlighter-linenumbers=&quot;&quot; data-enlighter-lineoffset=&quot;&quot; data-enlighter-title=&quot;&quot; data-enlighter-group=&quot;&quot;&gt;# File /opt/open-xchange/etc/imap.properties

# Specifies the SSL protocols that will be enabled for SSL connections. The property value is a whitespace separated list of tokens.
# Default is empty
com.openexchange.imap.ssl.protocols=TLSv1 TLSv1.1 TLSv1.2

# Specifies the SSL cipher suites that will be enabled for SSL connections. The property value is a whitespace separated list of tokens.
#
# Check &quot;http://&amp;#x3C;ox-grizzly-hostname&gt;:&amp;#x3C;ox-grizzly-port&gt;/stats/diagnostic?param=ciphersuites&quot; to check available cipher suites.
#
# Default value is empty (fall-back to current JVM&apos;s default SSL cipher suite)
com.openexchange.imap.ssl.ciphersuites=SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 TLS_DHE_DSS_WITH_AES_256_CBC_SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 TLS_EMPTY_RENEGOTIATION_INFO_SCSV TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA256
&lt;/pre&gt;
&lt;p class=&quot;wp-block-paragraph&quot;&gt;Hope that helps, thanks!&lt;/p&gt;&lt;/div&gt;</content:encoded><category>Email Security &amp; Privacy</category></item><item><title>Paperkey: How to backup your GnuPG keys on paper</title><link>https://vkafed.com/paperkey-how-to-backup-and-restore-your-gnupg-secret-key/</link><guid isPermaLink="true">https://vkafed.com/paperkey-how-to-backup-and-restore-your-gnupg-secret-key/</guid><description>A short field note on exporting GnuPG secret-key material with Paperkey for a printable backup.</description><pubDate>Mon, 13 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To create a backup of your GPG Key, you may use one of the following commands&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;paperkey --secret-key my-secret-key.gpg --output to-be-printed.txt&lt;/pre&gt;
&lt;p&gt;Or using this if you have exported (not armored) GPG Key in file:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;paperkey --secret-key my-secret-key.gpg --output to-be-printed.txt&lt;/pre&gt;
&lt;p&gt;To restore it you will need a paperkey data in file and you public key. The following command will take public key from public-key.gpg file and paperkey data from secret-paperkey.gpg file and will import it to &lt;strong&gt;~/.gnupg.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ paperkey --pubring public-key.gpg --secrets secret-paperkey.gpg | gpg --import&lt;/pre&gt;
&lt;p&gt;If you have armored gpg public key, you will need to dearmor it first by doing this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ gpg --dearmor public-key.gpg&lt;/pre&gt;
&lt;p&gt;To install it on your mac, you may use brew:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ brew install paperkey&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jabberwocky.com/software/paperkey/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Paperkey&lt;/a&gt; by David Shaw&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content:encoded><category>PKI &amp; Encryption</category></item><item><title>Reset your YubiKey to factory defaults using gpg-connect-agent</title><link>https://vkafed.com/reset-your-yubikey-to-factory-defaults-using-gpg-connect-agent/</link><guid isPermaLink="true">https://vkafed.com/reset-your-yubikey-to-factory-defaults-using-gpg-connect-agent/</guid><description>A macOS field note on resetting a YubiKey OpenPGP application to factory defaults with gpg-connect-agent.</description><pubDate>Fri, 06 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’m using MacOS for my work, so here is how to reset your YubiKey using gpg-connect-agent. This is not a mine solution, I found this a while ago on github, can’t remember who’s is author, so I saved to my notes, just wanted to share it with you.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;# Install gnupg if it&apos;s not installed yet
VKAFEDZH-M-2R3C:~ vkafedzh$ brew install gnupg&lt;/pre&gt;
&lt;p&gt;Insert your YubiKey to USB and run the following command:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;gpg-connect-agent &amp;#x3C;&amp;#x3C;EOF
/hex
scd serialno
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 e6 00 00
scd apdu 00 44 00 00
/echo Yubikey has been successfully reset.
/echo The factory default PINs are 123456 (user) and 12345678 (admin).
EOF&lt;/pre&gt;
&lt;p&gt;Here is what I have:&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ vkafedzh$ gpg-connect-agent &amp;#x3C;&amp;#x3C;EOF
&gt; /hex
&gt; scd serialno
&gt; scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
&gt; scd apdu 00 e6 00 00
&gt; scd apdu 00 44 00 00
&gt; /echo Yubikey has been successfully reset.
&gt; /echo The factory default PINs are 123456 (user) and 12345678 (admin).
&gt; EOF
gpg-connect-agent: no running gpg-agent - starting &apos;/usr/local/Cellar/gnupg/2.2.8/bin/gpg-agent&apos;
gpg-connect-agent: waiting for the agent to come up ... (5s)
gpg-connect-agent: connection to agent established
S SERIALNO XXXXXXXXXXXXXX24010201000607XXXXXXX
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 83                                              i.
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 82                                              i.
OK
D[0000]  69 83                                              i.
OK
D[0000]  90 00                                              ..
OK
D[0000]  90 00                                              ..
OK
Yubikey has been successfully reset.
The factory default PINs are 123456 (user) and 12345678 (admin).&lt;/pre&gt;
&lt;p&gt;Thanks!&lt;/p&gt;</content:encoded><category>PKI &amp; Encryption</category></item><item><title>Using YubiKey with GPG</title><link>https://vkafed.com/using-yubikey-with-gpg/</link><guid isPermaLink="true">https://vkafed.com/using-yubikey-with-gpg/</guid><description>My setup notes for using a YubiKey as an OpenPGP smart card to store GPG signing and encryption keys.</description><pubDate>Sun, 28 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Using Yubikey with GPG encryption&lt;/h2&gt;
&lt;p&gt;Let me try to show my experience in using Yubikey as a Smartcard for storing signing and GPG encryption keys. There are a lot of information in the internet about that, but that my first try in configuring yubikey for such purposes.&lt;/p&gt;
&lt;p&gt;Firstly we need to install necessary packages on our mac by doing the following command, I’m using &lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;brew&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ brew install gnupg yubikey-personalization&lt;/pre&gt;
&lt;p&gt;This will allow us to program our Yubikey.&lt;/p&gt;
&lt;p&gt;The next step is we need to create a new keys for further usage.&lt;/p&gt;
&lt;h2&gt;Generate a key&lt;/h2&gt;
&lt;p&gt;Let’s do a temporary directory:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;export GNUPGHOME=$(mktemp -d)&lt;/pre&gt;
&lt;p&gt;And create a GPG configuration:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ cat &amp;#x3C;&amp;#x3C; EOF &gt; $GNUPGHOME/gpg.conf
use-agent
personal-cipher-preferences AES256 AES192 AES CAST5
personal-digest-preferences SHA512 SHA384 SHA256 SHA224
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed
cert-digest-algo SHA512
s2k-digest-algo SHA512
s2k-cipher-algo AES256
charset utf-8
fixed-list-mode
no-comments
no-emit-version
keyid-format 0xlong
list-options show-uid-validity
verify-options show-uid-validity
with-fingerprint
EOF&lt;/pre&gt;
&lt;h2&gt;Generate a master key&lt;/h2&gt;
&lt;p&gt;During creation a new master key, we will need to choose RSA (sign only) key and I would go with 4096 bits. And you’ll be asked to enter a passphrase, try to enter something unique and strong 🙂&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ val$ gpg --full-generate-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
&lt;p&gt;gpg: keybox ‘/var/folders/yy/bp5hkvxs1px1_f1q_10kzgk40000gn/T/tmp.SRHTb4gb/pubring.kbx’ created
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
&amp;#x3C;n&gt;  = key expires in n days
&amp;#x3C;n&gt;w = key expires in n weeks
&amp;#x3C;n&gt;m = key expires in n months
&amp;#x3C;n&gt;y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y&lt;/p&gt;
&lt;p&gt;GnuPG needs to construct a user ID to identify your key.&lt;/p&gt;
&lt;p&gt;Real name: Valerii
Email address: &lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;
Comment:
You selected this USER-ID:
“Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;”&lt;/p&gt;
&lt;p&gt;Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
public and secret key created and signed.&lt;/p&gt;
&lt;p&gt;Note that this key cannot be used for encryption.  You may want to use
the command “--edit-key” to generate a subkey for this purpose.
pub   rsa4096/0xA2B71234247579BE 2018-01-28 [SC]
Key fingerprint = 1A28 A73B A841 4311 FA0A BA28 A4A7 1383 1171 7A99
uid                              Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Export a new key&lt;/h3&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;export KEYID=0xA2B71234247579BE&lt;/pre&gt;
&lt;h2&gt;Create subkeys&lt;/h2&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ val$ gpg --expert --edit-key $KEYID
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
&lt;p&gt;Secret key is available.&lt;/p&gt;
&lt;p&gt;gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
sec  rsa4096/0xA2B71234247579BE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;During a creating a new subkeys enter the passphrase you entered during making a master key. In the following example I selected to generate a key with expiration in 1 year.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;gpg&gt; addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      &amp;#x3C;n&gt;  = key expires in n days
      &amp;#x3C;n&gt;w = key expires in n weeks
      &amp;#x3C;n&gt;m = key expires in n months
      &amp;#x3C;n&gt;y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon Jan 28 14:13:38 2019 EST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
&lt;p&gt;sec  rsa4096/0xA1289348BA3879AE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
ssb  rsa4096/0xA1CDBEFBA21203A4
created: 2018-01-28  expires: 2019-01-28  usage: S
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Next, let’s create n encryption key by selecting RSA (encrypt only) – number 6&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;gpg&gt; addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 6
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      &amp;#x3C;n&gt;  = key expires in n days
      &amp;#x3C;n&gt;w = key expires in n weeks
      &amp;#x3C;n&gt;m = key expires in n months
      &amp;#x3C;n&gt;y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon Jan 28 14:16:29 2019 EST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
&lt;p&gt;sec  rsa4096/0xA1289348BA3879AE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
ssb  rsa4096/0xA1CDBEFBA21203A4
created: 2018-01-28  expires: 2019-01-28  usage: S
ssb  rsa4096/0x181FFBA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: E
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I selected to create 4096 bit RSA encrypt only key which is going to be valid for 365 days only.&lt;/p&gt;
&lt;p&gt;And let’s create an authentification key now.&lt;/p&gt;
&lt;p&gt;read more…&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;gpg&gt; addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 8
&lt;p&gt;Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt&lt;/p&gt;
&lt;p&gt;(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished&lt;/p&gt;
&lt;p&gt;Your selection? S&lt;/p&gt;
&lt;p&gt;Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt&lt;/p&gt;
&lt;p&gt;(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished&lt;/p&gt;
&lt;p&gt;Your selection? E&lt;/p&gt;
&lt;p&gt;Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:&lt;/p&gt;
&lt;p&gt;(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished&lt;/p&gt;
&lt;p&gt;Your selection? A&lt;/p&gt;
&lt;p&gt;Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate&lt;/p&gt;
&lt;p&gt;(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished&lt;/p&gt;
&lt;p&gt;Your selection? Q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
&amp;#x3C;n&gt;  = key expires in n days
&amp;#x3C;n&gt;w = key expires in n weeks
&amp;#x3C;n&gt;m = key expires in n months
&amp;#x3C;n&gt;y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon Jan 28 14:20:11 2019 EST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Don’t forget to save it&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;gpg&gt; save&lt;/pre&gt;
&lt;h3&gt;Export and backup our keys&lt;/h3&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ gpg --armor --export-secret-keys $KEYID &gt; $GNUPGHOME/master.key
$ gpg --armor --export-secret-subkeys $KEYID &gt; $GNUPGHOME/sub.key&lt;/pre&gt;
&lt;p&gt;That will require to enter your passphrase for master key again.&lt;/p&gt;
&lt;p&gt;Configure Yubikey&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ val$ gpg --card-edit
&lt;p&gt;Reader …: Yubico Yubikey 4 OTP U2F CCID
Application ID …: F1760095270102331226071222510019
Version …: 2.1
Manufacturer …: Yubico
Serial number …: 12720751
Name of cardholder: [not set]
Language prefs …: [not set]
Sex …: unspecified
URL of public key : [not set]
Login data …: [not set]
Signature PIN …: not forced
Key attributes …: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key …: [none]
Encryption key…: [none]
Authentication key: [none]
General key info..: [none]&lt;/p&gt;
&lt;p&gt;gpg/card&gt; admin
Admin commands are allowed&lt;/p&gt;
&lt;p&gt;gpg/card&gt; passwd
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit&lt;/p&gt;
&lt;p&gt;Your selection? 3
PIN changed.&lt;/p&gt;
&lt;p&gt;1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit&lt;/p&gt;
&lt;p&gt;Your selection? 1
PIN changed.&lt;/p&gt;
&lt;p&gt;1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit&lt;/p&gt;
&lt;p&gt;Your selection? q&lt;/p&gt;
&lt;p&gt;gpg/card&gt; quit&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Let’s transfer keys from our mac to yubikey&lt;/p&gt;
&lt;h2&gt;Move keys to yubikey&lt;/h2&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ val$ gpg --edit-key $KEYID
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
&lt;p&gt;Secret key is available.&lt;/p&gt;
&lt;p&gt;sec  rsa4096/0xA1289348BA3879AE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
ssb  rsa4096/0xA1CDBEFBA21203A4
created: 2018-01-28  expires: 2019-01-28  usage: S
ssb  rsa4096/0x181FFBA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: E
ssb  rsa4096/0x181FFBA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: A
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;
&lt;p&gt;gpg&gt; key 1&lt;/p&gt;
&lt;p&gt;sec  rsa4096/0xA1289348BA3879AE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
ssb* rsa4096/0xA1CDBEFBA21203A4
created: 2018-01-28  expires: 2019-01-28  usage: S
ssb  rsa4096/0x181FAAA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: E
ssb  rsa4096/0x181FFBA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: A
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;
&lt;p&gt;gpg&gt; keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1&lt;/p&gt;
&lt;p&gt;sec  rsa4096/0xA1289348BA3879AE
created: 2018-01-28  expires: never       usage: SC
trust: ultimate      validity: ultimate
ssb* rsa4096/0xA1CDBEFBA21203A4
created: 2018-01-28  expires: 2019-01-28  usage: S
ssb  rsa4096/0x181FAAA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: E
ssb  rsa4096/0x181FFBA2120AA342
created: 2018-01-28  expires: 2019-01-28  usage: A
[ultimate] (1). Valerii &amp;#x3C;&lt;a href=&quot;mailto:vkafed@gmail.com&quot;&gt;vkafed@gmail.com&lt;/a&gt;&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now for each key do *keytocard* command, before proceeding with a new key, you will need to deselect previous key by entering the same command, eg. key 1 again will deselect the key 1, then entry key 2 to select it.&lt;/p&gt;
&lt;h3&gt;Verify&lt;/h3&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;VKAFEDZH-M-2R3C:~ val$ gpg --list-secret-keys
/var/folders/yy/0gn/T/tmp.Tb4gb/pubring.kbx
-------------------------------------------------------------------------
sec   rsa4096/0xA1289348BA3879AE 2018-01-28 [SC]
      Key fingerprint =1A28 A73B A841 4311 FA0A BA28 A4A7 1383 1171 7A99
uid                   [ultimate] Valerii &amp;#x3C;vkafed@gmail.com&gt;
ssb&gt;  rsa4096/0xA1289348BA3879AE 2018-01-28 [S] [expires: 2019-01-28]
ssb&gt;  rsa4096/0xA1CDBEFBA21203A4 2018-01-28 [E] [expires: 2019-01-28]
ssb&gt;  rsa4096/0x181FFBA2120AA342 2018-01-28 [A] [expires: 2019-01-28]&lt;/pre&gt;
&lt;p&gt;Export public key&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ gpg --armor --export $KEYID &gt; ~/pubkey.txt&lt;/pre&gt;
&lt;p&gt;You may want to upload your public key to public keyserver:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;$ gpg --send-key $KEYID
gpg: sending key0xA2B71234247579BE to hkps://hkps.pool.sks-keyservers.net&lt;/pre&gt;
&lt;p&gt;In next posts I’ll try to use those keys for encryption/decryption and signing.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content:encoded><category>PKI &amp; Encryption</category></item><item><title>Happy Halloween!</title><link>https://vkafed.com/happy-halloween/</link><guid isPermaLink="true">https://vkafed.com/happy-halloween/</guid><description>Wishing Happy Halloween to everyone!</description><pubDate>Tue, 31 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wishing Happy Halloween to everyone!&lt;/p&gt;
&lt;p&gt;Happy Halloween!&lt;/p&gt;</content:encoded></item><item><title>Icinga2: LiveStatus Activation/Installation</title><link>https://vkafed.com/icinga2-livestatus-activationinstallation/</link><guid isPermaLink="true">https://vkafed.com/icinga2-livestatus-activationinstallation/</guid><description>Install and activate the MK Livestatus API for Icinga2, configure its socket, and check that the service is available.</description><pubDate>Mon, 30 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-container&quot;&gt;
&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;Hey all,&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here is a quick note how to install and activate MK Livestatus (Check_MK) API for your Icinga2 installation.&lt;/p&gt;
&lt;p&gt;More info about livestatus on the official website: &lt;a href=&quot;https://mathias-kettner.de/checkmk_livestatus.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mathias-kettner.de/checkmk_livestatus.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, check if it’s already activated:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-theme=&quot;minimal&quot;&gt;# icinga2 feature list
Disabled features: compatlog debuglog gelf graphite influxdb livestatus opentsdb perfdata statusdata syslog
Enabled features: api checker command ido-mysql mainlog notification&lt;/pre&gt;
&lt;p&gt;As we can see &lt;strong&gt;livestatus&lt;/strong&gt; is currently disabled&lt;/p&gt;
&lt;p&gt;Let’s enable it using the following command:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;# icinga2 feature enable livestatus
Enabling feature livestatus. Make sure to restart Icinga 2 for these changes to take effect.
&lt;/pre&gt;
&lt;p&gt;Now we need to add one more LivestatusListener object and fix the existing one to support livestatus on local unix socket and on TCP socket.&lt;/p&gt;
&lt;p&gt;Open &lt;strong&gt;/etc/icinga2/features-enabled/livestatus.conf&lt;/strong&gt; and edit it as following:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;library &quot;livestatus&quot;
&lt;p&gt;object LivestatusListener “livestatus-tcp” {
socket_type = “tcp”
bind_host = “0.0.0.0”
bind_port = “6666”
}&lt;/p&gt;
&lt;p&gt;object LivestatusListener “livestatus-unix” {
socket_type = “unix”
socket_path = “/var/run/icinga2/cmd/livestatus”
}
&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can bind it to some specific IP and/or change port to another one if you need, also make sure that your socket_path is exists&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;null&quot;&gt;# ls -la /var/run/icinga2/cmd/livestatus
srw-rw---- 1 icinga icingacmd 0 Oct 30 10:51 /var/run/icinga2/cmd/livestatus
&lt;/pre&gt;
&lt;p&gt;Let me know if you have any questions&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Icinga2 Director: How to import a server IP from local file</title><link>https://vkafed.com/icinga2-director-how-to-import-a-server-ip-from-local-file/</link><guid isPermaLink="true">https://vkafed.com/icinga2-director-how-to-import-a-server-ip-from-local-file/</guid><description>Import a server IP address from a local file into Icinga2 Director when the monitoring system cannot reach the DNS server.</description><pubDate>Fri, 27 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey all,&lt;/p&gt;
&lt;p&gt;#shortstory&lt;/p&gt;
&lt;p&gt;Today I had a pretty interesting task with Icinga2 and Director. The issue was with accessibility to DNS server which was installed in AWS without any public access, so basically it was used only for internal requests. To make story short, the task was to get IP address from local file, hostname from SQL database and assign it to each other.&lt;/p&gt;
&lt;p&gt;Here is the changes that I made for ‘PropertyModifierGetHostByName.php’ file.&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot; data-enlighter-language=&quot;php&quot; data-enlighter-title=&quot;director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php&quot;&gt;&amp;#x3C;?php
&lt;p&gt;// - /usr/share/icingaweb2/modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php
namespace Icinga\Module\Director\PropertyModifier;&lt;/p&gt;
&lt;p&gt;use Icinga\Exception\InvalidPropertyException;
use Icinga\Module\Director\Hook\PropertyModifierHook;
use Icinga\Module\Director\Web\Form\QuickForm;&lt;/p&gt;
&lt;p&gt;class PropertyModifierGetHostByName extends PropertyModifierHook
{
public static function addSettingsFormFields(QuickForm $form)
{
$form-&gt;addElement(‘select’, ‘on_failure’, array(
‘label’        =&gt; ‘On failure’,
‘description’  =&gt; $form-&gt;translate(‘What should we do if the host (DNS) lookup fails?’),
‘multiOptions’ =&gt; $form-&gt;optionalEnum(array(
‘null’ =&gt; $form-&gt;translate(‘Set no value (null)’),
‘keep’ =&gt; $form-&gt;translate(‘Keep the property (hostname) as is’),
‘fail’ =&gt; $form-&gt;translate(‘Let the whole import run fail’),
)),
‘required’    =&gt; true,
));
}&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;public function getName()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return &apos;Get host by name (DNS lookup)&apos;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;public function transform($value)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    //$host = gethostbyname($value);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    $lines_array = file(&quot;/usr/share/icingaweb2/dns.txt&quot;); //comma-separated txt file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    foreach($lines_array as $line) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        if(strpos($line, $value) !== false) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        list(, $new_str) = explode(&quot;,&quot;, $line);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        $host = trim($new_str); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if (strlen(@inet_pton($host)) !== 4) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        switch ($this-&amp;#x26;gt;getSetting(&apos;on_failure&apos;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            case &apos;null&apos;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                return null;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            case &apos;keep&apos;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                return $value;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            case &apos;fail&apos;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            default:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                throw new InvalidPropertyException(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &apos;Host lookup failed for &quot;%s&quot;&apos;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    $value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return $host;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The file dns.txt contains IP and domain names, which are comma-separated. You may change the location of the file, use many of them, or even use key-value database for such queries, it’s pretty easy.&lt;/p&gt;
&lt;p&gt;So, basically it search for IP address in dns.txt file for provided hostname in Import function. It will return null or fail (based on your settings), if returned IP is not IPv4.&lt;/p&gt;
&lt;p&gt;Extra module will be created and pushed to the github on next Monday.&lt;/p&gt;
&lt;p&gt;Happy monitoring!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content:encoded></item><item><title>Garage Sale – new or like-new books on Sale!</title><link>https://vkafed.com/garage-sale-new-or-like-new-books-on-sale/</link><guid isPermaLink="true">https://vkafed.com/garage-sale-new-or-like-new-books-on-sale/</guid><description>An archived 2017 listing of programming and systems books from my bookshelf, including Python and Ansible titles.</description><pubDate>Tue, 01 Aug 2017 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gfmr-markdown-container&quot;&gt;
&lt;div class=&quot;gfmr-markdown-rendered&quot;&gt;
&lt;h2 id=&quot;title&quot; class=&quot;a-spacing-none&quot;&gt;&lt;span id=&quot;productTitle&quot; class=&quot;a-size-extra-large&quot;&gt;Learning Python, 5th Edition&lt;/span&gt;, &lt;span id=&quot;bookEdition&quot; class=&quot;a-size-large a-color-secondary a-text-normal&quot;&gt;by Mark Lutz&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Get a comprehensive, in-depth introduction to the core Python language with this hands-on book. Based on author Mark Lutz’s popular training course, this updated fifth edition will help you quickly write efficient, high-quality code with Python. It’s an ideal way to begin, whether youâ€™re new to programming or a professional developer versed in other languages.&lt;/p&gt;
&lt;p&gt;Complete with quizzes, exercises, and helpful illustrations, this easy-to-follow, self-paced tutorial gets you started with both Python 2.7 and 3.3 the latest releases in the 3.X and 2.X lines plus all other releases in common use today. Youâ€™ll also learn some advanced language features that recently have become more common in Python code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explore Python’s major built-in object types such as numbers, lists, and dictionaries&lt;/li&gt;
&lt;li&gt;Create and process objects with Python statements, and learn Python’s general syntax model&lt;/li&gt;
&lt;li&gt;Use functions to avoid code redundancy and package code for reuse&lt;/li&gt;
&lt;li&gt;Organize statements, functions, and other tools into larger components with modules&lt;/li&gt;
&lt;li&gt;Dive into classes: Python’s object-oriented programming tool for structuring code&lt;/li&gt;
&lt;li&gt;Write large programs with Pythonâ€™s exception-handling model and development tools&lt;/li&gt;
&lt;li&gt;Learn advanced Python tools, including decorators, descriptors, metaclasses, and Unicode processing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Price: $60&lt;/p&gt;
&lt;p&gt;Amazon:Â &lt;a href=&quot;https://www.amazon.com/Learning-Python-5th-Mark-Lutz/dp/1449355730/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.amazon.com/Learning-Python-5th-Mark-Lutz/dp/1449355730/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Learning Python&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read more under cut…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;/p&gt;
&lt;h2 id=&quot;devops-toolkit&quot; class=&quot;a-size-large a-spacing-none&quot;&gt;&lt;span class=&quot;a-size-large&quot;&gt;The DevOps 2.0 Toolkit: Automating the Continuous Deployment Pipeline with Containerized Microservices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;This book is about different techniques that help us architect software in a better and more efficient way with microservices packed as immutable containers, tested and deployed continuously to servers that are automatically provisioned with configuration management tools. It’s about fast, reliable and continuous deployments with zero-downtime and ability to roll-back. It’s about scaling to any number of servers, design of self-healing systems capable of recuperation from both hardware and software failures and about centralized logging and monitoring of the cluster.In other words, this book envelops the whole microservices development and deployment lifecycle using some of the latest and greatest practices and tools. We’ll use Docker, Kubernetes, Ansible, Ubuntu, Docker Swarm and Docker Compose, Consul, etcd, Registrator, confd, and so on. We’ll go through many practices and even more tools. Finally, while there will be a lot of theory, this is a hands-on book. You won’t be able to complete it by reading it in a metro on a way to work. You’ll have to read this book while in front of the computer and get your hands dirty.&lt;/p&gt;
&lt;p&gt;Price: $35&lt;/p&gt;
&lt;p&gt;Amazon: &lt;a href=&quot;https://www.amazon.com/DevOps-2-0-Toolkit-Containerized-Microservices/dp/152391744X/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.amazon.com/DevOps-2-0-Toolkit-Containerized-Microservices/dp/152391744X/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;go-programming-language&quot; class=&quot;a-spacing-none&quot;&gt;&lt;span class=&quot;a-size-extra-large&quot;&gt;The Go Programming Language (Addison-Wesley Professional Computing Series)&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;The Go Programming Language &lt;/i&gt;&lt;/b&gt;is the authoritative resource for any programmer who wants to learn Go. It shows how to write clear and idiomatic Go to solve real-world problems. The book does not assume prior knowledge of Go nor experience with any specific language, so you’ll find it accessible whether you’re most comfortable with JavaScript, Ruby, Python, Java, or C++.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;The first chapter is a tutorial on the basic concepts of Go, introduced through programs for file I/O and text processing, simple graphics, and web clients and servers.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Early chapters cover the structural elements of Go programs: syntax, control flow, data types, and the organization of a program into packages, files, and functions. The examples illustrate many packages from the standard library and show how to create new ones of your own. Later chapters explain the package mechanism in more detail, and how to build, test, and maintain projects using the go tool.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The chapters on methods and interfaces introduce Goâ€™s unconventional approach to object-oriented programming, in which methods can be declared on any type and interfaces are implicitly satisfied. They explain the key principles of encapsulation, composition, and substitutability using realistic examples.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Two chapters on concurrency present in-depth approaches to this increasingly important topic. The first, which covers the basic mechanisms of goroutines and channels, illustrates the style known as communicating sequential processes for which Go is renowned. The second covers more traditional aspects of concurrency with shared variables. These chapters provide a solid foundation for programmers encountering concurrency for the first time.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The final two chapters explore lower-level features of Go. One covers the art of metaprogramming using reflection. The other shows how to use the unsafe package to step outside the type system for special situations, and how to use the cgo tool to create Go bindings for C libraries.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The book features hundreds of interesting and practical examples of well-written Go code that cover the whole language, its most important packages, and a wide range of applications. Each chapter has exercises to test your understanding and explore extensions and alternatives. Source code is freely available for download from http://gopl.io/ and may be conveniently fetched, built, and installed using the go get command.&lt;/p&gt;
&lt;p&gt;Price: $30&lt;/p&gt;
&lt;p&gt;Amazon: &lt;a href=&quot;https://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;red-hat-certification-guide&quot; class=&quot;a-spacing-none&quot;&gt;&lt;span class=&quot;a-size-extra-large&quot;&gt;RHCSA/RHCE Red Hat Linux Certification Study Guide, Seventh Edition (Exams EX200 &amp;#x26; EX300) (Certification &amp;#x26; Career – OMG) – 7th edition&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;Based on Red Hat Enterprise Linux 7, the new edition of this bestselling study guide covers the updated Red Hat Certified System Administrator (RHCSA) and Red Hat Certified Engineer (RHCE) exams.&lt;/h3&gt;
&lt;p&gt;&lt;i&gt;RHCSA/RHCE Red Hat Linux Certification Study Guide, 7th Edition&lt;/i&gt; is fully revised to cover the recently released Red Hat Enterprise Linux 7 and the corresponding RHCSA and RHCE certification exams. This new edition provides complete coverage of all official exam objectives for the new exams.&lt;/p&gt;
&lt;p&gt;An integrated study system based on proven pedagogy, this revised bestseller features special elements that reinforce and teach practical skills while preparing candidates for the exam. Each chapter includes step-by-step exercises, Exam Watch and On-the-Job sidebars, Two-Minute Drills, end-of-chapter self tests, and hands-on lab questions. Electronic content includes four complete lab-based practice exams to ensure you’re ready to sit for the live exams.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete coverage of all exam objectives and performance-based requirements related to the exams, including difficult lab-based scenarios&lt;/li&gt;
&lt;li&gt;Electronic content includes four complete lab-based practice exams, two for RHCSA and two for RHCE&lt;/li&gt;
&lt;li&gt;A proven study system for RHCSA and RHCE candidates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Price: $40&lt;/p&gt;
&lt;p&gt;Amazon: &lt;a href=&quot;https://www.amazon.com/RHCSA-Linux-Certification-Seventh-Career/dp/0071841962/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.amazon.com/RHCSA-Linux-Certification-Seventh-Career/dp/0071841962/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;ansible-for-devops&quot; class=&quot;a-size-large a-spacing-none&quot;&gt;&lt;span class=&quot;a-size-large&quot;&gt;Ansible for DevOps: Server and configuration management for humans&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Covers Ansible 2.0!&lt;/p&gt;
&lt;p&gt;Ansible is a simple, but powerful, server and configuration management tool (with a few other tricks up its sleeve). This book helps those familiar with the command line and basic shell scripting start using Ansible to provision and manage anywhere from one to thousands of servers.&lt;/p&gt;
&lt;p&gt;The book begins with fundamentals, like installing Ansible, setting up a basic inventory file, and basic concepts, then guides you through Ansible’s many uses, including ad-hoc commands, basic and advanced playbooks, application deployments, multiple-provider server provisioning, and even Docker orchestration! Everything is explained with pertinent real-world examples, often using Vagrant-managed virtual machines.&lt;/p&gt;
&lt;p&gt;Price: $20&lt;/p&gt;
&lt;p&gt;Amazon: https://www.amazon.com/Ansible-DevOps-Server-configuration-management/dp/098639341X/&lt;/p&gt;
&lt;p&gt;Ansible for DevOps&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Quick update</title><link>https://vkafed.com/quick-update/</link><guid isPermaLink="true">https://vkafed.com/quick-update/</guid><description>A July 2016 update on adding SSL to the website and publishing RPM packages in my personal repository.</description><pubDate>Sat, 09 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I didn’t have enough time actually to work on the website, just installed SSL onto &lt;a href=&quot;/&quot;&gt;www.vkafed.com&lt;/a&gt; and start uploading my rpms to yum.www.vkafed.com&lt;/p&gt;
&lt;p&gt;Updates to follow&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;</content:encoded></item><item><title>New blog released (english version)</title><link>https://vkafed.com/new-blog/</link><guid isPermaLink="true">https://vkafed.com/new-blog/</guid><description>The June 2016 introduction to my English-language blog, following my earlier Russian-language website.</description><pubDate>Sun, 26 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome! I just starting a new blog here. I will not update my oldÂ RussianÂ one anymore at &lt;a href=&quot;http://www.valroot.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.valroot.com&lt;/a&gt;, and this will be English one.&lt;/p&gt;</content:encoded></item></channel></rss>