<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alister Baroi</title>
    <description>The latest articles on DEV Community by Alister Baroi (@alisterbaroi).</description>
    <link>https://dev.to/alisterbaroi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3793080%2Faa9f5766-bbc8-4978-b7ae-3a081475d824.jpg</url>
      <title>DEV Community: Alister Baroi</title>
      <link>https://dev.to/alisterbaroi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alisterbaroi"/>
    <language>en</language>
    <item>
      <title>KubeVirt Live Migration Done Right: What it Takes to Run VMs on Kubernetes</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 14 May 2026 20:53:44 +0000</pubDate>
      <link>https://dev.to/tigeraio/kubevirt-live-migration-done-right-what-it-takes-to-run-vms-on-kubernetes-369i</link>
      <guid>https://dev.to/tigeraio/kubevirt-live-migration-done-right-what-it-takes-to-run-vms-on-kubernetes-369i</guid>
      <description>&lt;p&gt;Running VMs in Kubernetes sounds like a crazy workaround for avoiding vendor lock-in, and standardizing legacy applications and newer containerized workloads on one control plane with one set of security policies to govern them all. It is, however, a rapidly growing pattern, and &lt;a href="https://www.tigera.io/learn/guides/kubevirt/kubevirt-live-migration/" rel="noopener noreferrer"&gt;KubeVirt live migration&lt;/a&gt; — moving running VMs between nodes without downtime — is increasingly central to platform engineering use cases that require full VMs, like on-demand CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/learn/guides/kubevirt/" rel="noopener noreferrer"&gt;KubeVirt&lt;/a&gt; is gaining traction as a way to bring VMs into Kubernetes as first-class workloads, managed with the same tools and primitives that platform teams already use for containers. It has, however, introduced some unique challenges.&lt;/p&gt;

&lt;p&gt;Here’s the uncomfortable truth about that migration: compute and storage are the easy parts. Networking is where migrations stall, roadblock multiple, and platform teams start questioning whether KubeVirt was the right call in the first place.&lt;/p&gt;

&lt;p&gt;If your VMs have no fixed IP dependencies, no VLAN memberships, and no upstream firewall rules scoped to specific subnets, you can migrate them into Kubernetes without losing sleep over the networking layer. If you’re running hundreds or thousands of VMs with IP addresses hardcoded into application configs, DNS entries, and firewall ACLs — and you need to move those VMs to Kubernetes without rewriting any of it — then your networking layer is about to become the most important decision in your migration.&lt;/p&gt;

&lt;p&gt;What follows is a technical walk-through of the L2 plumbing that keeps KubeVirt VMs connected when they move between nodes in a production cluster and how it eliminates the need to update your complicated network infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Networking Wasn’t Built for VMs
&lt;/h2&gt;

&lt;p&gt;In a traditional hypervisor environment — vSphere, Hyper-V, Nutanix — VMs sit on VLANs and have fixed IPs. Upstream firewalls, load balancers, and DNS records all reference those IPs. A security team owns the VLAN segmentation while the network team owns the routing. This network infrastructure is the accumulated work of many years and forms a static, and somewhat brittle, system of securing hosts and getting traffic to its destination. The &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/" rel="noopener noreferrer"&gt;Kubernetes networking&lt;/a&gt; model, with its dynamic allocation of IPs that are meaningful only inside a cluster, is at odds with this traditional approach. Therein lies the problem.&lt;/p&gt;

&lt;p&gt;The upstream network has no direct visibility into the pod network. When a VM is migrated from your existing hypervisor into Kubernetes, its original network segment is not preserved. The VM gets a new IP from the pod CIDR, and every firewall rule, DNS entry, and load balancer config that referenced the old IP is now broken. For a handful of VMs, you can reconfigure your firewall rules and routing manually. For hundreds or thousands reconfiguration becomes not only costly in terms of engineering effort but also injects the risk of breaking critical functionality and introducing security blind spots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Networking Modes, Two Different Problems
&lt;/h2&gt;

&lt;p&gt;Before diving into solutions, it helps to understand how KubeVirt presents networking to VMs. There are two modes for the primary pod interface, and they solve different problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Masquerade mode&lt;/strong&gt; decouples the pod IP from the VM IP. KubeVirt assigns a static IP to the VM internally and uses NAT rules to translate between the two. Live migration works out of the box because the pod IP can change without affecting the VM. The trade-off is that you need a service-level abstraction to reach the VM from outside the pod, which makes this mode impractical for production workloads that need stable, directly-addressable IPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bridge mode&lt;/strong&gt; is the production-grade option. The pod IP and the VM IP are identical. The VM is directly reachable on the network. No NAT, no service abstraction. But bridge mode introduces a hard problem: when a VM live-migrates to a new node, KubeVirt creates a new pod on the destination. That new pod gets a fresh IP from the CNI. The VM still thinks it has its original IP. The result is a routing mismatch — the network doesn’t know where to send traffic, and the VM’s connections break.&lt;/p&gt;

&lt;p&gt;KubeVirt only handles memory and disk migration. This does not matter much in masquerade mode since the VM’s IP is decoupled from the pod’s IP via NAT but becomes a critical consideration in bridge mode. So the &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/kubernetes-cni/" rel="noopener noreferrer"&gt;CNI&lt;/a&gt; has to do three things to ensure nothing breaks: preserve the IP across the pod transition, converge routes so the rest of the network knows the VM has moved, and ensure network policy is in place on the destination before the VM goes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Migration in Bridge Mode: What Happens Under the Hood
&lt;/h2&gt;

&lt;p&gt;VMs need to move between nodes for a variety of reasons, for example maintenance, load balancing, or high availability. What actually happens during a live migration in bridge mode and why is making it work right so hard?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpn602akqrbmext24o6av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpn602akqrbmext24o6av.png" alt="The 5-step network handover during live migration in bridge mode" width="800" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The 5-step network handover during live migration in bridge mode&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Challenge
&lt;/h3&gt;

&lt;p&gt;When a migration is triggered using the KubeVirt command line utility, &lt;a href="https://kubevirt.io/user-guide/user_workloads/virtctl_client_tool/" rel="noopener noreferrer"&gt;virtctl&lt;/a&gt;, KubeVirt creates a new pod on a destination node chosen by the Kubernetes scheduler in the usual way based on available resources, affinity rules, shared storage, etc. Next, KubeVirt copies the VM’s memory state using libvirt’s pre-copy and post-copy mechanisms.&lt;/p&gt;

&lt;p&gt;Then things get a bit interesting.&lt;/p&gt;

&lt;p&gt;The source pod continues running during the whole process. From a networking perspective, the same IP now needs to exist in two places temporarily — on the source node (where the VM is still running) and on the destination (where it’s about to go live).&lt;/p&gt;

&lt;p&gt;The CNI has to solve three problems simultaneously: IP persistence across pod lifecycles, route convergence during the handover window, and policy continuity so the VM isn’t exposed during migration.&lt;/p&gt;

&lt;p&gt;Let’s look at how Calico makes this happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  IP Persistence: IPAM That Understands VMs
&lt;/h3&gt;

&lt;p&gt;Traditionally, Calico IPAM allocates IPs to pods. The IPAM handle (the ownership ticket for an IP reservation) is derived from the pod’s identity. This works for containers because pods are ephemeral. But a KubeVirt VM is more like a Kubernetes Deployment: you define a VirtualMachine resource, and KubeVirt creates a randomly-named pod to run it. Every time you restart or migrate the VM, the pod changes, but the VM stays the same with the same identity, memory state and the same IP.&lt;/p&gt;

&lt;p&gt;Since IPAM assigns the IP to the pod, every migration means a new IP, which defeats the purpose of preserving the VM’s IP and breaks any firewall rules, load balancer configurations or DNS records pointed at this IP.&lt;/p&gt;

&lt;p&gt;To fix this, Calico constructs the IPAM handle from the VM’s name instead of the pod’s name ensuring that the reservation persists across pod lifecycles. When a VM migrates and its old pod is destroyed, the IPAM handle survives because it’s tied to the VM identity. When the new pod starts, the IPAM finds the existing handle and reuses the same IP. During migration, the IPAM transiently tracks dual ownership — an active owner on the source node and an alternate owner on the destination — then converges to a single owner once the source pod is cleaned up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Route Convergence: The GARP Handover
&lt;/h3&gt;

&lt;p&gt;IP persistence ensures the VM keeps its address. Route convergence ensures the rest of the network knows where to find it. Here’s the sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Migration initiated.&lt;/strong&gt; The CNI watches for migration events in the Kubernetes API. As soon as one is created, it starts preparing the destination node’s networking — policies, routes, interface configuration — so that everything is in place before the VM actually moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory pre-copy.&lt;/strong&gt; KubeVirt and libvirt handle the iterative memory copy. The VM continues running on the source node. Traffic continues routing to the source at standard priority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VM goes live on destination.&lt;/strong&gt; The VM broadcasts a &lt;a href="https://www.practicalnetworking.net/series/arp/gratuitous-arp/" rel="noopener noreferrer"&gt;Gratuitous ARP (GARP)&lt;/a&gt; packet announcing “I own this IP now, and I’m on this node.” Felix picks up this GARP and immediately advertises a high-priority route for the VM’s IP via the destination node. The networking layer picks this up and immediately starts steering traffic for the VM’s IP toward the new node, overriding the old route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route priority override.&lt;/strong&gt; This is a critical engineering detail. Normal routing uses a standard metric (1024). During migration, the destination node advertises the VM’s route at a higher priority metric (512). Because the source pod still exists briefly in a post-life state, both nodes momentarily have routes for the same IP. The higher-priority route ensures all traffic is forwarded to the destination, even before the source pod is fully cleaned up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup and steady state.&lt;/strong&gt; Once the source pod terminates, the high-priority route is replaced with a standard-priority route. The source node’s route is removed. The network converges to its normal state with the VM on its new node at the same IP.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Policy continuity
&lt;/h3&gt;

&lt;p&gt;The CNI watches for migration events and uses the lead time to pre-program network policies on the destination node while the memory copy is still in progress. By the time the VM cuts over, its security posture is already in place leaving no gap for unsanctioned traffic to slip through.&lt;/p&gt;

&lt;p&gt;This works because &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;Kubernetes network policies&lt;/a&gt; use label selectors, not IP addresses. The policies follow the VM’s identity, its labels, namespace, and network membership, not its physical location. When the VM appears on the destination node with the same labels, the same policies apply automatically. One nuance worth noting: while the policy rules carry over, stateful connection tracking (conntrack) does not currently replicate between nodes. Established connections survive because the routes converge, but the destination node evaluates them as new flows. Full conntrack replication is a planned future enhancement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portability and Standardization for VMs
&lt;/h2&gt;

&lt;p&gt;If you’re familiar with vSphere, you know vMotion, paired with the vSphere distributed switch, managed live migration networking seamlessly. However, this transparency relies on a vertically integrated stack that is not portable to other cloud environments.&lt;/p&gt;

&lt;p&gt;In Kubernetes, the stack is disaggregated. Components like KubeVirt (VM lifecycle), CNI (networking), policy engines (security), and storage operators (disks) each manage their own part. For live migration, the CNI must coordinate with KubeVirt’s migration state machine to manage the VM’s temporary dual-existence across two nodes and converge routing without a centralized controller.&lt;/p&gt;

&lt;p&gt;The Kubernetes approach is fundamentally different. It uses open standards: CRI, CNI, CSI, and NetworkPolicy. KubeVirt extends this; VMs are custom resources, managed by kubectl, and scheduled by the same control plane. This approach demands a CNI that understands the unique lifecycle, identity and networking requirements of a pod running a VM but it also makes VMs portable.&lt;/p&gt;

&lt;p&gt;It also means that now your containers and VMs can be managed and monitored using the same policies and tools and that means not only operational efficiency but better security and more reliable auditing.&lt;/p&gt;

&lt;p&gt;Live migration is one piece of a larger networking story. If your KubeVirt rollout involves bridge mode at scale, multi-cluster topologies, BGP peering, or policy parity across VMs and containers, those decisions compound quickly. We pulled the full picture into &lt;a href="https://www.tigera.io/lp/ebook-the-complete-guide-to-vm-networking-for-kubernetes/" rel="noopener noreferrer"&gt;The Complete Guide to VM Networking for Kubernetes&lt;/a&gt;, a practitioner’s reference covering the architectural choices, networking modes, and operational patterns that determine whether a migration ships or stalls.&lt;/p&gt;

&lt;p&gt;Get &lt;a href="https://www.tigera.io/lp/ebook-the-complete-guide-to-vm-networking-for-kubernetes/" rel="noopener noreferrer"&gt;The Complete Guide to VM Networking for Kubernetes&lt;/a&gt; →&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/kubevirt-live-migration-done-right-what-it-takes-to-run-vms-on-kubernetes/" rel="noopener noreferrer"&gt;KubeVirt Live Migration Done Right: What it Takes to Run VMs on Kubernetes&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>vmmigration</category>
    </item>
    <item>
      <title>The AI Agent Accountability Crisis: Why Governance Isn’t Keeping Up With Deployment</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 14 May 2026 18:08:21 +0000</pubDate>
      <link>https://dev.to/tigeraio/the-ai-agent-accountability-crisis-why-governance-isnt-keeping-up-with-deployment-5cl0</link>
      <guid>https://dev.to/tigeraio/the-ai-agent-accountability-crisis-why-governance-isnt-keeping-up-with-deployment-5cl0</guid>
      <description>&lt;p&gt;Every enterprise is building AI agents. Marketing has one summarizing campaign performance. Engineering has one triaging incidents. Customer support has one resolving tickets. Finance has one processing invoices. Each was built by a different team, using a different framework, with different assumptions about security.&lt;/p&gt;

&lt;p&gt;Now those agents are talking to each other &lt;a href="https://www.tigera.io/blog/how-ai-agents-communicate-understanding-the-a2a-protocol-for-kubernetes/" rel="noopener noreferrer"&gt;through agent-to-agent (A2A) communication&lt;/a&gt;. The incident-triage agent calls the customer-support agent to check affected accounts. The invoice agent calls an external payment API. The marketing agent queries a data warehouse with customer records.&lt;/p&gt;

&lt;p&gt;When something goes wrong (and at this scale of deployment, it will), can you answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who authorized the action?&lt;/li&gt;
&lt;li&gt;What policy permitted it?&lt;/li&gt;
&lt;li&gt;What was the full chain of events?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can’t, you have an accountability gap.&lt;/p&gt;

&lt;p&gt;This is part one of a five-part series on AI agent accountability for engineering and security leaders. We’ll work through the gap between agent deployment and governance, the diagnostic framework that exposes it, why your existing tools won’t close it, and the principles you’ll need to evaluate any solution that claims it can.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AI agent accountability?
&lt;/h2&gt;

&lt;p&gt;AI agent accountability is the ability to trace, prove, and audit every action an AI agent takes. This includes which policy permitted the agent, which identity initiated it, and what the downstream effects were. It’s the layer above agent communication (MCP, A2A) and agent infrastructure (Kubernetes, GPUs, model serving) that answers the question: &lt;strong&gt;&lt;em&gt;who’s responsible when the agent acts?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff56qeqh952pqywk8hden.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff56qeqh952pqywk8hden.png" width="800" height="398"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
A landmark &lt;a href="https://fortune.com/2026/03/26/ai-agents-accountability-accenture-wharton-report/" rel="noopener noreferrer"&gt;2026 report from Accenture and the Wharton School of Business&lt;/a&gt; put the gap bluntly: “ &lt;strong&gt;Intelligence may be scalable, but accountability is not.&lt;/strong&gt; ” As enterprises race to deploy agents across every function, the governance architecture has not kept pace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents are scaling faster than governance
&lt;/h2&gt;

&lt;p&gt;The scale of the problem is not theoretical anymore. Major analyst firms have quantified it:&lt;/p&gt;

&lt;p&gt;| Source | Finding |&lt;br&gt;
| McKinsey, 2026 | 80% of organizations have encountered risky behavior from AI agents, actions that were unintended, unauthorized, or outside acceptable guardrails. |&lt;br&gt;
| McKinsey, 2026 | Only one-third (~33%) of organizations report governance maturity. |&lt;br&gt;
| Gartner, 2025 | Over 40% of agentic AI projects will be canceled by the end of 2027 due to escalating costs, unclear value, or inadequate risk controls. |&lt;br&gt;
| ISACA, 2025 | 66% of industry leaders believe formal agent accountability frameworks will become mandatory within the next two years. |&lt;br&gt;
| Dataiku, 2026 | 87% of CIOs report AI agents are already embedded in their enterprises, yet 75% lack real-time visibility into agent operations in production. |&lt;/p&gt;

&lt;p&gt;These are not edge cases. This is the mainstream enterprise experience with agentic AI in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shadow agents: the new AI agent security gap
&lt;/h2&gt;

&lt;p&gt;A decade ago, enterprises faced “ &lt;strong&gt;Shadow IT&lt;/strong&gt; “. Employees adopting cloud services without IT approval, creating ungoverned sprawl that took years to bring under control. The same pattern is repeating with AI agents, but faster and with higher stakes.&lt;/p&gt;

&lt;p&gt;Low-code platforms have made it easy for almost anyone to create an AI agent. Building agents are now table stakes. Scaling them with governance is the real differentiator.&lt;/p&gt;

&lt;p&gt;Unlike cloud services, agents don’t just store data. They act. They make decisions, call APIs or MCP servers, access databases, and communicate with other agents. An ungoverned cloud service might leak data. &lt;strong&gt;But an ungoverned agent will leak data, take actions on that data, and propagate those actions across other agents in a chain that nobody can trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When an AI agent operates without clear ownership or accountability, productivity gains become systemic &lt;a href="https://www.tigera.io/learn/guides/ai-agent-security/" rel="noopener noreferrer"&gt;AI agent security&lt;/a&gt; risk. When something goes wrong, there is no clear owner to take responsibility, remediate, or even understand the full blast radius.&lt;/p&gt;

&lt;h2&gt;
  
  
  The regulatory deadlines
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://thefuturesociety.org/how-ai-agents-are-governed-under-the-eu-ai-act/" rel="noopener noreferrer"&gt;EU AI Act&lt;/a&gt;‘s main body takes effect in August 2026. For enterprises deploying agentic AI, three articles are particularly relevant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Article 12&lt;/strong&gt; requires high-risk AI systems to log their actions to ensure accountability and traceability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article 13&lt;/strong&gt; requires clear and comprehensible information about how AI systems function and make decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article 14&lt;/strong&gt; requires that high-risk systems are subject to effective human oversight, which is especially important for agentic AI, given the challenges of supervising autonomous agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The European Commission may also assess degree of autonomy as a relevant factor when determining whether a system poses unacceptable risks. The more independent your agents are, the higher the regulatory bar.&lt;/p&gt;

&lt;p&gt;The US is not far behind. The &lt;a href="https://leg.colorado.gov/bills/sb24-205" rel="noopener noreferrer"&gt;Colorado AI Act (SB 24-205)&lt;/a&gt;, delayed to &lt;a href="https://www.clarkhill.com/news-events/news/colorados-ai-law-delayed-until-june-2026-what-the-latest-setback-means-for-businesses/" rel="noopener noreferrer"&gt;June 30, 2026&lt;/a&gt;, requires deployers of high-risk AI systems to implement risk management programs, complete impact assessments, disclose to consumers when AI makes consequential decisions, and report algorithmic discrimination to the state attorney general. It applies to any company doing business in Colorado.&lt;br&gt;&lt;br&gt;
And Colorado is not an unique outlier, it’s just the leading edge. &lt;a href="https://iapp.org/resources/article/us-state-ai-governance-legislation-tracker" rel="noopener noreferrer"&gt;California, New York, Utah, and Texas&lt;/a&gt; have also already enacted AI governance laws. At the federal level, &lt;a href="https://www.americanactionforum.org/list-of-proposed-ai-bills-table/" rel="noopener noreferrer"&gt;80+ AI governance bills&lt;/a&gt; are under consideration in the current Congress. The &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt; is already the de facto US enterprise standard, even where it isn’t legally required.&lt;/p&gt;

&lt;p&gt;Compliance deadlines on both sides of the Atlantic are weeks away, not months or years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core tension, and why it’s solvable
&lt;/h2&gt;

&lt;p&gt;Enterprises want agent autonomy. That’s the entire point: agents acting independently to drive efficiency and scale. But they also need accountability; knowing what happened, why it was permitted, and who is responsible.&lt;/p&gt;

&lt;p&gt;These seem to conflict. More autonomy means less control. More control means less autonomy.&lt;/p&gt;

&lt;p&gt;But this is a false dichotomy. As &lt;a href="https://www.paloaltonetworks.com/cyberpedia/what-is-agentic-ai-governance" rel="noopener noreferrer"&gt;Palo Alto Networks&lt;/a&gt; puts it: _ &lt;strong&gt;autonomy changes how systems operate, it doesn’t change who’s responsible&lt;/strong&gt; _.&lt;/p&gt;

&lt;p&gt;The same tension existed in microservices a decade ago. Teams wanted independent deployments (autonomy) with reliable service communication (control). The answer wasn’t to choose one over the other. It was to build a governance layer: service meshes, mTLS, observability; that delivered both.&lt;/p&gt;

&lt;p&gt;AI agents need the same evolution. The question isn’t whether to give agents autonomy or accountability. It’s whether you have the governance infrastructure to deliver both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is the difference between AI agent accountability and AI agent security?&lt;/strong&gt; Security is about preventing unauthorized actions (blocking the bad). Accountability is about proving why authorized actions were permitted (auditing the good). You need both. A locked door (security) without a sign-in sheet (accountability) leaves your compliance team with nothing to show an auditor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why is AI agent accountability a 2026 priority?&lt;/strong&gt;  Three forces are converging this year: rapid agent deployment (87% of CIOs report agents already in production), maturing regulatory regimes (EU AI Act in August, Colorado AI Act in June), and the first wave of public agent-related incidents driving boardroom attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the EU/US AI Acts apply to my AI agents?&lt;/strong&gt;  If your agent is classified as a high-risk AI system under the Acts, then yes; and Articles 12 (logging), 13 (transparency), and 14 (human oversight), from the EU AI Act, all apply directly. Degree of autonomy is one of the factors regulators consider when assessing risk classification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are network policies and RBAC enough for AI agent governance?&lt;/strong&gt;  No. &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;Network policies&lt;/a&gt; operate at the wrong abstraction level (pod-to-pod, not agent-to-agent) and produce no audit trail. RBAC requires explicit enumeration that breaks down past about 100 agents, and can’t express attribute-based policies. We’ll cover this in detail in a later post of the series.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;80% of organizations have already encountered risky AI agent behavior, but only one-third have governance maturity to match.&lt;/li&gt;
&lt;li&gt;The EU AI Act and Colorado AI Act both take effect in 2026, so accountability requirements are no longer just optional, they are mandatory.&lt;/li&gt;
&lt;li&gt;AI agent accountability is the missing layer above agent communication (MCP, A2A) and agent infrastructure (Kubernetes).&lt;/li&gt;
&lt;li&gt;Autonomy and accountability are not in conflict, but you need a governance layer to deliver both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get the strategic guide for accountable AI agents&lt;/p&gt;

&lt;p&gt;We wrote our guide, &lt;em&gt;Accountable AI Agents: A Strategic Guide for AI &amp;amp; Security Leaders Governing Autonomous AI at Scale&lt;/em&gt;, to help engineering and security leaders close this gap. No code, no product demos, no fluff. Just the framework your leadership team needs to govern AI agents before the next incident (or the next regulation) forces your hand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://info.tigera.io/rs/805-GFH-732/images/Whitepaper_Accountability_for_AI_Agents.pdf" rel="noopener noreferrer"&gt;Get the strategic guide for accountable AI agents&lt;/a&gt; →&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-crisis-why-governance-isnt-keeping-up-with-deployment/" rel="noopener noreferrer"&gt;The AI Agent Accountability Crisis: Why Governance Isn’t Keeping Up With Deployment&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>featuredblog</category>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>What’s New in Calico v3.32</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 13 May 2026 22:23:05 +0000</pubDate>
      <link>https://dev.to/tigeraio/whats-new-in-calico-v332-3n6o</link>
      <guid>https://dev.to/tigeraio/whats-new-in-calico-v332-3n6o</guid>
      <description>&lt;p&gt;We’re excited to announce the release of Calico Open Source v3.32! &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0aoxrsdsuj2942fdc40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0aoxrsdsuj2942fdc40.png" alt="🎉" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This release corresponds with Kubernetes v1.36 (Codename Haru) and it goes beyond just sharing a cat as the mascot of the release, it actually extends capabilities and features of Kubernetes to keep you up to date with the latest innovations of the cloud.&lt;/p&gt;

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

&lt;p&gt;This release brings some of the most significant architectural changes in Calico, from live-migrating KubeVirt VMs to eBPF based Maglev load balancer.&lt;br&gt;&lt;br&gt;
Here’s a quick look at everything that’s new:&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08ewajgsxcq652w4iq8l.png" alt="🚨" width="72" height="72"&gt; Breaking Changes &amp;amp; Deprecations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ClusterNetworkPolicy (Alpha2) replaces Admin and Baseline Admin Network Policies:&lt;/strong&gt; &lt;code&gt;AdminNetworkPolicy&lt;/code&gt; and &lt;code&gt;BaselineAdminNetworkPolicy&lt;/code&gt; have been &lt;strong&gt;removed&lt;/strong&gt;. You must migrate to &lt;code&gt;ClusterNetworkPolicy&lt;/code&gt; before upgrading to v3.32, as Calico will no longer enforce the old resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;calico-apiserver&lt;/code&gt; Deprecated:&lt;/strong&gt; The aggregated API server is deprecated and will be removed in a future release. It is being replaced by &lt;strong&gt;Native v3 CRDs&lt;/strong&gt;. &lt;em&gt;(Requires MutatingAdmissionPolicy feature gate, Kubernetes 1.30+).&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dp36elgeuxvuiact13r.png" alt="🚀" width="72" height="72"&gt; Key Feature Updates
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. KubeVirt VM Live Migration Support
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Allows live-migrating KubeVirt VMs between nodes without dropping TCP connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Achieves IP persistence by binding the IP to the VM name rather than the ephemeral pod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation:&lt;/strong&gt; Set &lt;code&gt;kubeVirtVMAddressPersistence: Enabled&lt;/code&gt; in the &lt;code&gt;IPAMConfiguration&lt;/code&gt; resource.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Sidecarless mTLS (Istio Ambient Mode)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; High-performance, sidecarless mTLS using Istio ambient mode and Ztunnel. Removes the need to restart workloads or manage third-party components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation:&lt;/strong&gt; Create a brand new Tigera-operator resource and set its kind to Istio then the Tigera Operator will automatically pick it up and automate the Istio integration! .&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Maglev Consistent-Hash Load Balancing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; Minimizes flow remapping during backend changes, ensuring long-lived connections survive backend churn and allowing you to bypass external load balancers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt; Must use the Calico eBPF data plane in Direct Server Return (DSR) mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation:&lt;/strong&gt; Add the annotation &lt;code&gt;lb.projectcalico.org/external-traffic-strategy: "maglev"&lt;/code&gt; to your Service.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Whisker Policy Filtering &lt;em&gt;(Tech Preview)&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; The Whisker web console flow-log stream now allows advanced UI filtering by Policy, Namespace/Pod, Verdict (allow/deny), Reporter, and Pending/Staged actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Kubernetes ClusterNetworkPolicy (Alpha2)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08ewajgsxcq652w4iq8l.png" alt="🚨" width="72" height="72"&gt;Breaking change &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08ewajgsxcq652w4iq8l.png" alt="🚨" width="72" height="72"&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AdminNetworkPolicy and BaselineAdminNetworkPolicy resources were removed in v3.32 and must be replaced with ClusterNetworkPolicy before upgrading, Calico v3.32 and newer will not enforce them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Kubernetes NetworkPolicy resource has long been limited by its namespace scoped perspective. This often created challenges for practitioners attempting to secure clusters forcing them to a flat design that required individual policies for every namespace and a heavy lift for the security team to govern every aspect of the environment’s security. Calico users, however, have avoided these pitfalls through the use of Global NetworkPolicy, policy tiers and ordering. These features enable a “shift-left” approach for Calico users, allowing application teams to manage their own security while administrators and security teams maintain the cluster’s overarching security posture by adjusting policy evaluation precedence.&lt;/p&gt;

&lt;p&gt;So we are glad to announce that the upstream Kubernetes SIG-Network introduces a new security model called ClusterNetworkPolicy. This is how cluster admins enforce cluster-scoped Accept, Deny, and Pass rules that namespace owners cannot override, filling the gap that namespace-scoped NetworkPolicy has never been able to address.&lt;/p&gt;

&lt;p&gt;Two tiers are auto-created at startup:&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;ClusterNetworkPolicy Tier&lt;/strong&gt; | &lt;strong&gt;Calico Tier&lt;/strong&gt; | &lt;strong&gt;Order&lt;/strong&gt; | &lt;strong&gt;Purpose&lt;/strong&gt; |&lt;br&gt;
| Admin | kube-admin | 1,000 | Hard guardrails set by the security/platform team |&lt;br&gt;
| Baseline | kube-baseline | 10,000,000 | Safety net defaults below namespace NetworkPolicy |&lt;/p&gt;

&lt;p&gt;Policies use an action field, Allow, Deny, or Pass, and a priority field (lower wins within the tier):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;policy.networking.k8s.io/v1alpha2&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterNetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin-isolate-prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Admin&lt;/span&gt;
  &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;
  &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;namespaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
  &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deny&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;namespaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Native v3 CRDs (Tech Preview)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftco2892mv8tzss0j95hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftco2892mv8tzss0j95hn.png" alt="⚠" width="72" height="72"&gt;&lt;/a&gt; &lt;strong&gt;Deprecation notice&lt;/strong&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftco2892mv8tzss0j95hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftco2892mv8tzss0j95hn.png" alt="⚠" width="72" height="72"&gt;&lt;/a&gt;The aggregated API server (calico-apiserver) is deprecated in 3.32 and will be removed in a future release. &lt;strong&gt;Since this feature is currently in tech preview, migrating is optional.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the longest-standing sources of installation friction in Calico has been the aggregated API server (calico-apiserver), a pod deployment that proxied requests to Calico’s v3 resources and generated its own OpenAPI schema independent of Kubernetes. This created ordering dependencies at install time, validation failures without an error if users used older APIs and also caused GitOps tools to fail schema validation after Kubernetes upgrades, and complicated the overall install experience. In Calico 3.32, we’re changing this permanently. Native projectcalico.org/v3 CRDs register Calico’s v3 resources directly as standard Kubernetes CRDs, the same mechanism as any other custom resource.&lt;/p&gt;

&lt;p&gt;What changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5bgncwl6uzvaze8ysjr.png" alt="🚫" width="72" height="72"&gt; No calico-apiserver host-network pod&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m28f8nilvowmbafix4b.png" alt="⚡" width="72" height="72"&gt; No ordering race between CRDs and the API server at startup&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctjcqwvdvg2jrobnoq13.png" alt="🖥" width="72" height="72"&gt; kubectl get globalnetworkpolicies works natively, no calicoctl required&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dwxu3ucolcmolsqelqb.png" alt="✅" width="72" height="72"&gt; OpenAPI schema generated by Kubernetes, so ArgoCD and Flux validate correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Beta or GA releases of &lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/" rel="noopener noreferrer"&gt;MutatingAdmissionPolicy feature gate&lt;/a&gt; must be enabled in your cluster (Kubernetes 1.32+, not enabled by default in all distributions).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To help you prepare for upcoming Calico changes, we have provided a &lt;a href="https://docs.tigera.io/calico/latest/operations/crd-migration?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;step-by-step migration guide&lt;/a&gt; you can use now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/operations/native-v3-crds?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;Enable native v3 CRDs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  KubeVirt Virtual Machine (VM) Live Migration
&lt;/h2&gt;

&lt;p&gt;Kubernetes flexibility and ephemeral IP allocation is its strength but when it comes to VMs hosted on Kubernetes it becomes a pain point. Most VMs are transferred from a legacy network and applications that are running on it require static IP or a certain MAC address which is not something Kubernetes offers. Calico v3.32 release brings first-class support for live-migrating KubeVirt VMs between nodes in a cluster, without even dropping a single TCP connection. This means that you can move a VM from any node into any other nodes within a cluster without impacting the network operations.&lt;/p&gt;

&lt;p&gt;VM-based IP persistence is controlled by a single field in the IPAM configuration resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;projectcalico.org/v3&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IPAMConfiguration&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kubeVirtVMAddressPersistence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When enabled, Calico ties the IP handle to the VM name (k8s-pod-network.vmi..) rather than the visual representation of the VM as a pod. The same IP is reallocated to the destination pod during migration, and persists across reboots and pod evictions too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/networking/kubevirt/kubevirt-networking?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;KubeVirt networking&lt;/a&gt; | &lt;a href="https://docs.tigera.io/calico/latest/networking/kubevirt/live-migration-bgp?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;BGP routing for KubeVirt live migration&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  mTLS encryption without compromise – Istio Ambient Mode (Tech Preview)
&lt;/h2&gt;

&lt;p&gt;Calico sidecarless mTLS is based on Istio ambient mode and Ztunnel which establishes a secure high performance link between your pods without a need for any sidecars. This is a significant performance boost over the previous Calico integration with Istio given that it eliminates the need to restart your workloads to join the mesh and the resource overhead that used to stack up as your workloads used to grow. On top of that for the new mTLS features you don’t need to install or manage any third-party components, since Tigera operator takes care of all the necessary parts of this integration and provides a smooth transition from an unencrypted environment to a high performance secure mesh.&lt;/p&gt;

&lt;p&gt;To enable ambient mode with Calico create the following Tigera Operator resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;operator.tigera.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Istio&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Calico publishes its own customized Istio, and Ztunnel images, with Calico-specific patches and CVE-fix dependency bumps applied. These images were previously available only in Calico Enterprise and are now part of Open Source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/operations/istio/about-istio-ambient?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;Istio Ambient Mode&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Maglev Consistent-Hash Load Balancing
&lt;/h2&gt;

&lt;p&gt;Calico v3.32 provides support for Maglev consistent-hash load balancing for external traffic to a Service. This means if enabled, Calico nodes act as stable Equal-Cost Multi-Path (ECMP) nexthops for advertised service IPs, serving as a distributed load balancer. When a Calico node is churned or loses connectivity, service connections will stay healthy. It also means if a backend is added or removed, Maglev remaps only a small fraction of flows, so that more long-lived connections survive churn.&lt;/p&gt;

&lt;p&gt;Now you might be wondering why you need such a feature? Using Maglev allows you to ditch your external legacy load balancers and move everything within your cluster.&lt;/p&gt;

&lt;p&gt;Opt in per-Service with a single annotation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-service&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;lb.projectcalico.org/external-traffic-strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maglev"&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LoadBalancer&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calico Maglev also provides monitoring capabilities and builds on top of the prometheus integrations and you can monitor Maglev connection counts via the new Prometheus metric:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;felix_bpf_conntrack_maglev_entries_total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Calico eBPF data plane in direct server return (DSR) mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/networking/configuring/add-maglev-load-balancing?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;Add Maglev load balancing to a service&lt;/a&gt;&lt;br&gt;&lt;br&gt;
 &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/operations/monitor/monitor-component-metrics?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;Learn how to enable Calico Prometheus integrations&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Whisker Policy Filtering (Tech Preview)
&lt;/h2&gt;

&lt;p&gt;The Whisker web console gains expanded filtering on the live flow-log stream in Calico 3.32.&lt;/p&gt;

&lt;p&gt;This video depicts how you can now filter by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdht6gu9a9lhi9eeh1ia2.png" alt="🔍" width="72" height="72"&gt; Policy, show only flows that hit a specific policy&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpc3lwr2dgyj25mysreu.png" alt="📁" width="72" height="72"&gt; Namespace / Pod, narrow to a specific workload&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dwxu3ucolcmolsqelqb.png" alt="✅" width="72" height="72"&gt; Verdict, filter to allowed or denied flows only&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvb45azgwbxqle55xzdia.png" alt="👁" width="72" height="72"&gt; Reporter, filter by source or destination reporter&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52h6v88ws6ehdyuuyqmz.png" alt="🕐" width="72" height="72"&gt; Pending/Staged actions, see what staged policies would do before enforcing them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This builds on the flow-logs API (Goldmane) and Whisker components shipped in earlier 3.x releases.&lt;/p&gt;

&lt;p&gt;New to Calico Whisker? Watch this CalicoCon session to learn more about Calico observability features:&lt;/p&gt;

&lt;p&gt;Like to build your own integration with Calico Goldmane?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic7hk10k9dk8fpvzxh5k.png" alt="📖" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://docs.tigera.io/calico/latest/observability/view-flow-logs?utm_source=blog&amp;amp;utm_medium=whats_new&amp;amp;utm_id=advocacy" rel="noopener noreferrer"&gt;View flow logs in the Calico Whisker web console&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As always a full list of all the changes can be found in the &lt;a href="https://docs.tigera.io/calico/latest/release-notes/" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/whats-new-in-calico-v3-32/" rel="noopener noreferrer"&gt;What’s New in Calico v3.32&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>companyblog</category>
      <category>technicalblog</category>
      <category>opensource</category>
      <category>release</category>
    </item>
    <item>
      <title>Calculating The Kubernetes Integration Tax: What Your DIY Networking Stack Actually Costs</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 05 May 2026 20:07:46 +0000</pubDate>
      <link>https://dev.to/tigeraio/calculating-the-kubernetes-integration-tax-what-your-diy-networking-stack-actually-costs-2p1l</link>
      <guid>https://dev.to/tigeraio/calculating-the-kubernetes-integration-tax-what-your-diy-networking-stack-actually-costs-2p1l</guid>
      <description>&lt;p&gt;It was 11:47pm on a Thursday night, and a senior platform engineer at a large North American bank was rolling back a ‘simple’ configuration change. The change itself was small, a routine update approved through the usual review process, but when it was applied, pods began cycling and connections started dropping. For the next three seconds, mobile banking sessions already mid-transaction dropped. Customer support lit up. The incident review the next morning spent most of its time arguing about how the change had been approved. Almost no one asked the harder question: why a configuration change in one place broke something seemingly unrelated.&lt;/p&gt;

&lt;p&gt;That question rarely gets a clean answer. What looks like a single layer is usually one knot in a stack of five to seven products including a CNI, &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;network policy&lt;/a&gt;, service mesh, observability, threat detection and compliance tooling that come from different vendors and were never designed to operate as one system. Each one works. The gaps between them are where the risk, and the cost, lives.&lt;/p&gt;

&lt;p&gt;This is just one example of the Kubernetes integration tax.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Kubernetes Integration Tax?
&lt;/h2&gt;

&lt;p&gt;The Kubernetes integration tax is the cumulative cost in engineer time, security exposure, compliance overhead, and redundant licensing, of running a multi-vendor &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/" rel="noopener noreferrer"&gt;Kubernetes networking&lt;/a&gt; stack that was never designed to operate as one system. It’s a tax in the most literal sense: a recurring charge most enterprises pay every year without ever budgeting for it. It doesn’t appear on a single invoice. There’s no row in your procurement system, no line on your cloud bill, no entry in your SOC 2 evidence package that says “integration tax.” Instead, it accumulates quietly across budgets that report to different leaders, making it nearly impossible to see in any one quarterly review.&lt;/p&gt;

&lt;p&gt;What makes the integration tax different from ordinary tooling cost is that it scales with the gaps between products, not the products themselves. The more vendors in your stack, the more surface area between them — and the surface area is where the cost lives. Every new tool you add doesn’t just add a license; it adds a new set of integrations, a new compatibility matrix, a new dashboard for on-call to learn, and a new policy model someone has to reconcile against the four already in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Integration Tax Hides
&lt;/h2&gt;

&lt;p&gt;The Kubernetes integration tax lurks between the rows of a typical budget spreadsheet; it may not be immediately obvious, but once you see it, the accumulating costs become hard to ignore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Glue Work
&lt;/h3&gt;

&lt;p&gt;An organization running five networking tools will typically have two to three engineers dedicated to keeping the integrations intact. Custom webhooks, YAML adapters between tools whose CRDs nearly overlap, Terraform modules that paper over inconsistent authentication models and dashboards that pull from four sources is the work that never appears on a roadmap. Think about how many hours your platform engineers spend on this work and multiply by their fully loaded hourly rate to see how much these disjointed toolsets are costing your organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extended Mean Time to Repair (MTTR)
&lt;/h3&gt;

&lt;p&gt;When L3 policy lives in one product, L7 policy lives in another, flow logs live in a third, and the service mesh enforces its own identity layer, the question “why did this request fail?” becomes a research project. &lt;a href="https://www.ibm.com/reports/data-breach" rel="noopener noreferrer"&gt;The industry average Mean Time to Identify (MTTI) for container-related incidents is 194 days, with another 64 days to contain&lt;/a&gt;. Like glue work, outages cost your organization in expensive engineering hours. They can also mean lost revenue if your applications provide services to paying customers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Licensing Overlap
&lt;/h3&gt;

&lt;p&gt;A platform team carrying a CNI enterprise license, a &lt;a href="https://www.tigera.io/learn/guides/service-mesh/" rel="noopener noreferrer"&gt;service mesh&lt;/a&gt;, a network observability product, a threat detection product, and a policy management tool will routinely find that two or three of them have overlapping capabilities. Multiply the cost of each redundant license by the number of clusters you run and the overlap can add up to as much $50K to $75K per year for a typical organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onboarding Drag
&lt;/h3&gt;

&lt;p&gt;A new platform engineer at an organization running a five-tool stack is typically six to nine months from being able to handle on-call rotations independently and resolve complex incidents. They might have to learn four dashboards, three query languages, two policy models, and the undocumented wiring between them. While they ramp up, the on-call load stays on the senior engineers who would otherwise be designing the platform’s next year of work. The cost of the engineering team goes up but capacity stays the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrade Cost
&lt;/h3&gt;

&lt;p&gt;Each tool has its own release cadence, its own CVE posture, and its own compatibility matrix with the Kubernetes version underneath. In a five-tool stack, the compatibility math is combinatorial: every upgrade in one product has to be validated against the other four before it ships. There is rarely a clean moment when all five are simultaneously stable, supported, and upgradeable. Factor in the re-integration work needed when compatibility inevitably breaks and the costs can grow exponentially.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Math Looks Like
&lt;/h2&gt;

&lt;p&gt;Take a concrete enterprise profile: 150 clusters, 5,250 nodes, 25 platform engineers at a $220K loaded cost, five networking products totaling roughly $400K a year in license. Run the integration tax numbers against it and the picture becomes clear.&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Component&lt;/strong&gt; | &lt;strong&gt;Annual cost&lt;/strong&gt; |&lt;br&gt;
| Engineer time on tooling such as glue work, MTTR, onboarding and upgrades (25% × 40% of team) | $550,000 |&lt;br&gt;
| Security risk exposure from gaps between tools | $640,000 |&lt;br&gt;
| Compliance evidence collection overhead | $72,000 |&lt;br&gt;
| Licensing overlap | $50,000+ |&lt;br&gt;
| &lt;strong&gt;Total Kubernetes integration tax&lt;/strong&gt; | &lt;strong&gt;~$1.3M/year&lt;/strong&gt; |&lt;/p&gt;

&lt;p&gt;The largest line on the table isn’t licensing, it’s engineering. At $550K, platform-engineer time on tooling already exceeds the entire $400K license bill across all five products. Going fully open source and zeroing out that $400K wouldn’t close the gap. $150K of integration overhead would still be on the books, generated by the same five products with the same surface area between them. Add the $640K of security risk that lives in those gaps and you’re carrying nearly $1.2M of cost that licensing has nothing to do with.&lt;/p&gt;

&lt;p&gt;The integration tax doesn’t shrink when you stop paying vendors. It shrinks when the surface area between products does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Did We Get Here?
&lt;/h2&gt;

&lt;p&gt;No platform team sets out to run seven different networking products. They start with a &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/kubernetes-cni/" rel="noopener noreferrer"&gt;CNI&lt;/a&gt;, because every cluster needs one, and something to log errors. Then they realize they need to ship those error logs to some common storage location so a dashboard can easily access them. They add collectors for metrics. They add tracing tools. The security team starts talking about mTLS so now a service mesh needs to be bolted on. And, by the way, a WAF is a requirement as well according to the compliance auditor.&lt;/p&gt;

&lt;p&gt;Every procurement decision makes sense in isolation but the result is not a cohesive and harmonious tooling stack. It’s a sedimentary layer of one-at-a-time decisions, each one rational, and none of them integrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Calculate Your Kubernetes Networking Cost
&lt;/h2&gt;

&lt;p&gt;If your team hasn’t calculated the Kubernetes integration tax for its own stack asking these three questions is a good first step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many engineer-hours per week does your platform team spend on work that only exists because of gaps between networking tools? Multiply by loaded cost to get the glue-work line.&lt;/li&gt;
&lt;li&gt;How long does an average network-related incident take to diagnose, and how many products does an on-call engineer typically touch during that investigation? That’s the MTTR line.&lt;/li&gt;
&lt;li&gt;How many months does it take for a new platform engineer to be comfortable alone on call, and how much of that ramp is tool-specific rather than Kubernetes-specific? That’s the onboarding line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an enterprise managing five separate networking products, the annual cost typically ranges from $800,000 to $1.5 million.&lt;/p&gt;

&lt;p&gt;While the exact figure may vary, it highlights a critical reality: the Kubernetes integration tax is a substantial, tangible expense for your organization, and it needs to be quantified. It has been on every platform team’s books for years; the first time it gets a number is the first time it can be planned against.&lt;/p&gt;

&lt;p&gt;Interested in calculating the Kubernetes integration tax for your own environment? &lt;a href="http://tigera.io/contact/" rel="noopener noreferrer"&gt;Contact us&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/calculating-the-kubernetes-integration-tax-what-your-diy-networking-stack-actually-costs/" rel="noopener noreferrer"&gt;Calculating The Kubernetes Integration Tax: What Your DIY Networking Stack Actually Costs&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>unifiedplatform</category>
    </item>
    <item>
      <title>VM Migration to Kubernetes: What Breaks and How to Prevent It</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 29 Apr 2026 14:20:49 +0000</pubDate>
      <link>https://dev.to/tigeraio/vm-migration-to-kubernetes-what-breaks-and-how-to-prevent-it-2k4e</link>
      <guid>https://dev.to/tigeraio/vm-migration-to-kubernetes-what-breaks-and-how-to-prevent-it-2k4e</guid>
      <description>&lt;p&gt;Here is what nobody putting together the business case for a VM migration to Kubernetes will tell you upfront: the compute is the easy part.&lt;/p&gt;

&lt;p&gt;Moving workloads off vSphere and onto Kubernetes is conceptually straightforward. The tooling has matured. The architecture is proven. Compute moves, storage remaps, and the platform team has a plan.&lt;/p&gt;

&lt;p&gt;The network is where projects quietly stall.&lt;/p&gt;

&lt;p&gt;Not because the technology does not work. Because nobody scoped the network properly before the project started. A platform migration turned into a multi-team coordination exercise. The firewall team needed a change window. The security team needed to review a network placement that changed when it should not have needed to. The application team discovered hardcoded IPs that nobody documented.&lt;/p&gt;

&lt;p&gt;Six months later, half the VMs are still on vSphere and the project is technically “in progress.”&lt;/p&gt;

&lt;p&gt;This is not a skills gap. It happens at the most mature organisations with capable teams. It is a scoping problem, and it has a specific cause: the gap between how VM networking works and how Kubernetes networking works is wider than it looks on a migration plan.&lt;/p&gt;

&lt;p&gt;This post is for the people who approve these projects. Here is what actually breaks, and what to decide before it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VM Migrations to Kubernetes Stall on the Network
&lt;/h2&gt;

&lt;p&gt;In a traditional hypervisor environment, a VM’s IP address is its identity. Not just technically, as a routing destination, but operationally. It is registered in DNS. Referenced in firewall rules. Watched by monitoring agents. Connected to by peer applications. In regulated environments, it may be in compliance documentation.&lt;/p&gt;

&lt;p&gt;Kubernetes was built on different assumptions. Workloads are ephemeral. Addresses come from a range managed by the cluster and mean nothing outside it. Identity is based on labels, not addresses.&lt;/p&gt;

&lt;p&gt;When a VM moves into Kubernetes using the default networking model, it gets a new IP. That new IP ripples through everything that referenced the old one. Firewall rules, DNS, security reviews, monitoring, peer applications. None of it is technically hard. The problem is that the platform team owns none of those systems and controls none of those timelines. A migration scoped for one team becomes a coordination exercise across four of them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is the networking tax: the hidden cost of a networking model that does not account for what your VMs are already attached to. Your platform team pays it. Your project timeline absorbs it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is not an edge case. According to &lt;a href="https://portworx.com/resources/voice-of-kubernetes-expert-report/" rel="noopener noreferrer"&gt;Portworx’s 2024 Voice of Kubernetes Experts report&lt;/a&gt;, 58% of organisations plan to migrate some of their VMs to Kubernetes using technologies like &lt;a href="https://kubevirt.io/" rel="noopener noreferrer"&gt;KubeVirt&lt;/a&gt;. Of those organisations, 65% plan to do so within the next two years.&lt;/p&gt;

&lt;p&gt;The migrations are already happening. The scoping decisions are being made now.&lt;/p&gt;

&lt;p&gt;Picture a single VM that has been running for several years. Its IP address is in two firewall rules, a monitoring dashboard, a load balancer backend, and a compliance document that was last audited in 2021. The application team has it hardcoded in a config file nobody has opened in three years. That VM is not unusual. It is representative. Now multiply it by two hundred.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways VM Migration to Kubernetes Breaks in Practice
&lt;/h2&gt;

&lt;p&gt;Two failure modes appear repeatedly in VM-to-Kubernetes migrations. Neither is a surprise once you know to look for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The security bottleneck
&lt;/h3&gt;

&lt;p&gt;VLANs in enterprise environments are not just a routing tool. They are a compliance construct. Organisations have spent years segmenting networks to meet PCI-DSS, SOC 2, or internal security policies. Those segments are owned and documented by the security team. Changes to them require sign-off.&lt;/p&gt;

&lt;p&gt;When a VM’s network placement changes during migration, even if the VM itself is unchanged, the security team has a legitimate reason to review it. That review takes as long as it takes. The platform team cannot accelerate it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform fragmentation
&lt;/h3&gt;

&lt;p&gt;The compound result of scope expansion and security bottlenecks is partial migration. The VMs with few dependencies move. The ones with static IPs embedded in firewall rules, or in security-reviewed VLAN segments, stay on vSphere.&lt;/p&gt;

&lt;p&gt;The organisation ends up running two platforms in parallel with no agreed path to consolidation. The cost reduction and operational simplification that justified the migration are deferred. The project is technically not cancelled, just permanently not finished.&lt;/p&gt;

&lt;p&gt;For many organisations, this is not a planning exercise. Active licence renegotiations and uncertainty about long-term hypervisor roadmaps have moved these conversations from the backlog to the boardroom. The migrations are happening now, and the scoping decisions made in the next quarter will shape whether they succeed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The One Question Every VM Migration to Kubernetes Needs Answered
&lt;/h2&gt;

&lt;p&gt;Before any VM migration project is scoped or budgeted, one question is worth an explicit answer: &lt;strong&gt;Is this migration also a modernisation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If yes, the network redesign is expected work. The additional team coordination is part of the scope. Budget and timeline accordingly, and plan for the security and network teams to be involved from the start.&lt;/p&gt;

&lt;p&gt;If no, the networking model chosen for the migration determines whether lift-and-shift is actually achievable or just aspirational.&lt;/p&gt;

&lt;p&gt;This sounds like a technology question. It is not. It is a project scoping question that happens to have a technology answer.&lt;/p&gt;

&lt;p&gt;The default Kubernetes networking model was designed for cloud-native workloads. Containers with ephemeral addresses and no upstream dependencies. It was not designed for VMs that have ten years of firewall rules, DNS entries, and compliance documentation attached to a fixed IP address.&lt;/p&gt;

&lt;p&gt;Using a model designed for the former to move the latter is where projects run into trouble. &lt;em&gt;You are not choosing a networking model for your Kubernetes cluster. You are choosing whether your migration is also a modernisation, and whether your budget accounts for that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In some organisations, the decision about which networking model to use for VM migration does not belong to the platform team at all. Where VLANs are compliance constructs rather than just routing tools, it is the security team that owns the answer. That is not unusual. It is a reason to get them into the scoping conversation before the architecture is chosen, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Networking Models, Two Different Projects
&lt;/h2&gt;

&lt;p&gt;There are two networking models for running VMs in Kubernetes, and the right one depends on what the migration is actually for.&lt;/p&gt;

&lt;h3&gt;
  
  
  The modernisation model
&lt;/h3&gt;

&lt;p&gt;In a Layer 3 (L3) model, the VM gets a new IP address from the cluster’s address range. Traffic is routed between the cluster and the rest of the network. Once the VM is on the cluster network, it operates the same way containers do. Kubernetes-native tooling applies without modification. The long-term operational model is clean.&lt;/p&gt;

&lt;p&gt;The trade-off is explicit: everything that referenced the old address needs to be updated. Firewall, DNS, monitoring, peer applications. This is the work. It is expected and budgeted when modernisation is the goal, and for organisations running a small number of VMs, or VMs with few upstream dependencies, it is often the right choice. The issue is not L3 routing. It is using L3 routing on a VM estate that was never scoped for modernisation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lift-and-shift model
&lt;/h3&gt;

&lt;p&gt;In a Layer 2 (L2) model, the existing network segment is extended directly into the Kubernetes cluster. Using KubeVirt to run the VM as a native Kubernetes workload alongside containers, &lt;a href="https://www.tigera.io/blog/kubevirt-networking-how-to-preserve-vm-ip-addresses-during-migration/" rel="noopener noreferrer"&gt;the VM keeps its original IP address&lt;/a&gt;. The VLAN it lived in is preserved inside the cluster. From the upstream network’s perspective, the workload did not move. The firewall rule still applies. DNS still resolves. The security team does not need to be pulled into a review they did not schedule for.&lt;/p&gt;

&lt;p&gt;Calico L2 Bridge Networks provide this capability. The upstream network continues to see the same workload it always did. No change requests. No reconfiguration. No other teams in the room.&lt;/p&gt;

&lt;p&gt;The practical consequence: the platform team owns the migration end to end. No firewall change requests sitting in a queue. No security review on a workload that did not change. No application team dependency. The project delivers on its original scope and its original timeline. That is what lift-and-shift is supposed to mean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can migrate a VM from VMware to Kubernetes and it keeps its original IP, stays on its original VLAN. Nothing needs to change. And now it can be protected by Calico network policy and observed through Calico flow logs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For teams migrating VMs with years of accumulated network dependencies, that continuity is the difference between a migration that completes and one that gets cancelled.&lt;/p&gt;

&lt;p&gt;For a technical breakdown of the L2 Bridge mode, see our blog post, &lt;a href="https://www.tigera.io/blog/lift-and-shift-vms-to-kubernetes-with-calico-l2-bridge-networks/" rel="noopener noreferrer"&gt;Lift-and-Shift VMs to Kubernetes with Calico L2 Bridge Networks&lt;/a&gt;, which walks through how the network continuity actually works and includes a recorded webinar.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Your VM Estate Gains After Migrating to Kubernetes
&lt;/h2&gt;

&lt;p&gt;Choosing the L2 model for migration does not mean your VM estate stays in legacy mode permanently. The migration is the beginning. Day 2 networking is what comes next.&lt;/p&gt;

&lt;p&gt;Once the VM is running in Kubernetes, the platform team gains operational capabilities that were not available on the old hypervisor. Traffic visibility, including east-west flows between the migrated VM and other workloads, is available without additional tooling. Security policy can be applied directly to the VM interface using the same constructs the team uses for containers, replacing legacy firewall rules incrementally on whatever timeline the security team sets. This is what Security in Depth looks like in practice. Layered controls applied workload by workload, not a single perimeter replaced in one event.&lt;/p&gt;

&lt;p&gt;The VM can also be moved between cluster nodes without network reconfiguration. Same IP, same VLAN, no change to the upstream network. KubeVirt live migration between nodes, without a separate network coordination step.&lt;/p&gt;

&lt;p&gt;This is what a policy-first migration enables: the networking and security layer is unified before the workloads move, so day 2 does not require a second migration to get there. Migration and modernisation stay on separate timelines, with separate budgets, managed by separate teams. Neither blocks the other.&lt;/p&gt;

&lt;p&gt;A VM that migrated to Kubernetes last quarter can have a new security policy applied today, written by the same security team using the same review process they already have. The migration did not force their hand on timing or tooling. The security team gains a policy model that is version-controlled and auditable. The platform team gains a migration that delivered on its original timeline. Those two outcomes are not in conflict.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Questions to Ask Before Approving a VM Migration to Kubernetes
&lt;/h2&gt;

&lt;p&gt;Four questions are worth an explicit answer before any VM migration project is approved:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is this migration also a modernisation? If yes, budget for multi-team coordination. If no, confirm the networking model supports genuine lift-and-shift.&lt;/li&gt;
&lt;li&gt;Which VMs have static IPs embedded in firewall rules or compliance documentation? These are the workloads most likely to stall. Identify them before work begins, not during it.&lt;/li&gt;
&lt;li&gt;Who owns the VLAN segments the migrated VMs currently live in? If it is the security team, they belong in the scoping conversation, not the execution phase.&lt;/li&gt;
&lt;li&gt;What is the plan for workloads that cannot be modernised? If there is no answer, plan for two platforms running in parallel indefinitely.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before the project kicks off, run a blast radius analysis on a single VM. Pick one. Map every service connecting to its IP, every firewall rule referencing it, every DNS entry, and who owns each one. That single exercise will tell you more about your true migration scope than any architecture diagram. If the answer fills a spreadsheet, your migration is not a weekend project. If the answer is three lines, start there.&lt;/p&gt;

&lt;p&gt;These are not technical questions. They are scope questions. The answers determine whether the migration delivers on its business case or quietly becomes a programme nobody approved.&lt;/p&gt;

&lt;p&gt;Interested in learning more about VM Migrations? &lt;a href="https://www.tigera.io/contact/" rel="noopener noreferrer"&gt;Talk to an expert about how you can migrate your VM estate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/vm-migration-to-kubernetes-what-breaks-and-how-to-prevent-it/" rel="noopener noreferrer"&gt;VM Migration to Kubernetes: What Breaks and How to Prevent It&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>vmmigration</category>
      <category>products</category>
    </item>
    <item>
      <title>Anthropic Mythos Broke Firefox: 271 zero-day vulnerabilities</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 23 Apr 2026 23:12:05 +0000</pubDate>
      <link>https://dev.to/alisterbaroi/anthropic-mythos-broke-firefox-271-zero-day-vulnerabilities-3p0</link>
      <guid>https://dev.to/alisterbaroi/anthropic-mythos-broke-firefox-271-zero-day-vulnerabilities-3p0</guid>
      <description>&lt;p&gt;&lt;strong&gt;271 zero-day vulnerabilities. One AI model. One Firefox release.&lt;/strong&gt; And that's just one of four stories worth your attention this fortnight.&lt;/p&gt;

&lt;p&gt;If you run engineering, security, or AI at your company, this article will give you a clear message: AI is no longer something your team &lt;em&gt;uses&lt;/em&gt;. It's something your team (and your attackers) &lt;em&gt;deploys&lt;/em&gt;. Here are the four moves that matter, and the numbers behind each.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Mythos found 271 zero-day vulnerabilities in Firefox 150
&lt;/h2&gt;

&lt;p&gt;On April 22, Mozilla shipped &lt;a href="https://www.firefox.com/en-US/firefox/150.0/releasenotes/" rel="noopener noreferrer"&gt;Firefox 150&lt;/a&gt; with patches for &lt;strong&gt;271 security vulnerabilities&lt;/strong&gt;, all identified by Anthropic's unreleased Mythos model during what Mozilla calls &lt;em&gt;its initial evaluation&lt;/em&gt;. For context: across all of 2025, Mozilla patched roughly &lt;strong&gt;73 high-severity Firefox bugs&lt;/strong&gt;. Mythos delivered almost &lt;strong&gt;4× that count&lt;/strong&gt; in one evaluation window.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mythos&lt;/strong&gt; is distributed under Anthropic's restricted &lt;a href="https://www.anthropic.com/glasswing" rel="noopener noreferrer"&gt;Project Glasswing&lt;/a&gt; programme: not a public model, and not available via API.&lt;/li&gt;
&lt;li&gt;Firefox 150's security advisory lists &lt;strong&gt;41&lt;/strong&gt; &lt;a href="https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures" rel="noopener noreferrer"&gt;CVE&lt;/a&gt;s; three of those CVEs are memory-safety roll-ups that bundle many of the 271 individual defects.&lt;/li&gt;
&lt;li&gt;The most serious finds were &lt;strong&gt;use-after-free bugs in the DOM and WebRTC&lt;/strong&gt;, the same bug class that has driven browser exploitation for two decades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mozilla's caveat&lt;/strong&gt; (worth quoting verbatim): Mythos did not find any category of bug that an elite human researcher could not have found. The gain is &lt;strong&gt;scale and speed&lt;/strong&gt;, not new capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A gap between machine-discoverable and human-discoverable bugs favors the attacker, who can concentrate many months of costly human effort to find a single bug. Closing this gap erodes the attacker's long-term advantage by making all discoveries cheap."&lt;/em&gt; — &lt;a href="https://www.mozilla.org/" rel="noopener noreferrer"&gt;Mozilla&lt;/a&gt;, on the shift in attacker/defender economics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If Anthropic can hand Mozilla 271 real bugs in a single evaluation, assume your own vendors (and your adversaries) are running similar passes on your stack. The question to ask this quarter is no longer &lt;em&gt;"do we use AI in our security review?"&lt;/em&gt; — it is &lt;em&gt;"which of our vendors do, and what does our threat model look like if attackers scale this before we do?"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Anthropic launched Claude Design
&lt;/h2&gt;

&lt;p&gt;On April 17, Anthropic released &lt;a href="https://www.anthropic.com/news/claude-design-anthropic-labs" rel="noopener noreferrer"&gt;Claude Design&lt;/a&gt;, a new Anthropic Labs product built on &lt;a href="https://www.anthropic.com/news/claude-opus-4-7" rel="noopener noreferrer"&gt;Claude Opus 4.7&lt;/a&gt;. It turns Claude into a design tool that produces real deliverables: prototypes, slide decks, one-pagers, marketing collateral.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads your &lt;strong&gt;codebase and existing design files&lt;/strong&gt; to apply brand rules automatically.&lt;/li&gt;
&lt;li&gt;Accepts &lt;strong&gt;5+ input formats:&lt;/strong&gt; text prompts, images, DOCX, PPTX, XLSX.&lt;/li&gt;
&lt;li&gt;Exports to &lt;strong&gt;Canva&lt;/strong&gt;, &lt;strong&gt;PDF&lt;/strong&gt;, &lt;strong&gt;PPTX&lt;/strong&gt;, &lt;strong&gt;HTML&lt;/strong&gt;, or a shareable internal URL.&lt;/li&gt;
&lt;li&gt;Hands off to &lt;strong&gt;Claude Code&lt;/strong&gt; when a prototype needs real implementation.&lt;/li&gt;
&lt;li&gt;Available in research preview across &lt;strong&gt;4 subscription tiers&lt;/strong&gt;: Pro, Max, Team, Enterprise.&lt;/li&gt;
&lt;li&gt;Datadog's quantified claim: prototyping that took &lt;strong&gt;one week of back-and-forth&lt;/strong&gt; now happens in &lt;strong&gt;one conversation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is Anthropic stepping out of "model behind an API" and into "end-user product", competing directly with &lt;strong&gt;Figma&lt;/strong&gt;, &lt;strong&gt;Canva&lt;/strong&gt;, and the slide-building half of &lt;strong&gt;Microsoft 365&lt;/strong&gt;. If your product organisation still treats model vendors as neutral infrastructure, that assumption has a shorter shelf life than your next budget cycle. The vendor now competes with some of your tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Google open-sourced DESIGN.md
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://labs.google/" rel="noopener noreferrer"&gt;Google Labs&lt;/a&gt; released a draft open-source specification called &lt;a href="https://blog.google/innovation-and-ai/models-and-research/google-labs/stitch-design-md/" rel="noopener noreferrer"&gt;DESIGN.md&lt;/a&gt;, a format that describes design systems in a way AI agents can read, reason about, and validate against. It shipped alongside &lt;a href="https://stitch.withgoogle.com/" rel="noopener noreferrer"&gt;Stitch&lt;/a&gt; (Google's AI UI tool), but the format itself is &lt;strong&gt;platform-agnostic&lt;/strong&gt; and hosted on &lt;a href="https://github.com/google-labs-code/design.md" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encodes design intent so AI agents stop guessing, &lt;em&gt;"agents can know exactly what a color is for"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Includes built-in &lt;a href="https://www.w3.org/TR/WCAG21/" rel="noopener noreferrer"&gt;WCAG&lt;/a&gt; &lt;strong&gt;accessibility validation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Portable across any tool or platform, not locked to Stitch.&lt;/li&gt;
&lt;li&gt;Released as a draft spec, open to contribution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch the &lt;strong&gt;format&lt;/strong&gt;, not the tool. Markdown files that AI agents read for persistent context — &lt;em&gt;CLAUDE.md, AGENTS.md, README.md&lt;/em&gt;, and now &lt;em&gt;DESIGN.md&lt;/em&gt; — are becoming the lingua franca of AI-native workflows. The standard here is being set in public, right now. Whichever spec wins become the default your engineering teams (and their AI copilots) work against for the next decade. API.md, SECURITY.md, and ONBOARDING.md are the obvious next chapters. If you have a design system or a platform team, this is a draft you want an opinion on.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. OpenAI is quietly building "Hermes" — always-on agents inside ChatGPT
&lt;/h2&gt;

&lt;p&gt;Leaked internal screenshots, surfaced by &lt;a href="https://www.testingcatalog.com/openai-develops-platform-for-always-on-agents-on-chatgpt/" rel="noopener noreferrer"&gt;TestingCatalog&lt;/a&gt; between &lt;strong&gt;April 6–21&lt;/strong&gt;, show OpenAI actively developing a platform codenamed &lt;strong&gt;Hermes&lt;/strong&gt;. It adds persistent, &lt;strong&gt;24/7&lt;/strong&gt; agents to ChatGPT — agents that run even when you are not at the keyboard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom workflows&lt;/strong&gt; and skill assembly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task scheduling&lt;/strong&gt; and event-triggered actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External messaging connectors:&lt;/strong&gt; agents can reach users outside ChatGPT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role-based templates:&lt;/strong&gt; leaked screenshots show CTO and CPO archetypes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent orchestration&lt;/strong&gt;, integrated with OpenAI's existing Workflows builder.&lt;/li&gt;
&lt;li&gt;Status: internal beta. No release date confirmed. &lt;strong&gt;Unofficial:&lt;/strong&gt; treat as leak, not announcement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Signal for engineering leaders:&lt;/strong&gt; If Hermes ships in the form shown, ChatGPT stops being a chat interface and becomes a &lt;strong&gt;runtime for autonomous systems&lt;/strong&gt;, a direct competitor to &lt;strong&gt;Salesforce Agentforce&lt;/strong&gt;, &lt;strong&gt;Microsoft Copilot Studio&lt;/strong&gt;, and every agent startup built &lt;em&gt;on top of&lt;/em&gt; the OpenAI API. Those startups are then competing with their own platform provider, using agent patterns their provider can see in aggregate across hundreds of millions of users. If your 2026 roadmap includes an AI agent strategy built on vendor APIs, this is the risk line item you want in your Q3 review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Thread
&lt;/h2&gt;

&lt;p&gt;Four announcements, two weeks, one pattern. AI this fortnight was not about bigger models or cleaner benchmarks. It was about AI &lt;strong&gt;doing the work&lt;/strong&gt; — finding real zero-days in shipped software, producing design artifacts that replace a week of iteration, standardizing how agents read intent, and (in OpenAI's case) running as always-on infrastructure your teams have not yet budgeted for.&lt;/p&gt;

&lt;p&gt;The message for leaders is simple: &lt;em&gt;the operational reality of AI is moving faster than most roadmaps were written to handle&lt;/em&gt;. &lt;/p&gt;

</description>
      <category>anthropic</category>
      <category>hermes</category>
      <category>mozilla</category>
      <category>firefox</category>
    </item>
    <item>
      <title>KubeVirt Networking: How to Preserve VM IP Addresses During Migration</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 21 Apr 2026 20:55:58 +0000</pubDate>
      <link>https://dev.to/tigeraio/kubevirt-networking-how-to-preserve-vm-ip-addresses-during-migration-1fe9</link>
      <guid>https://dev.to/tigeraio/kubevirt-networking-how-to-preserve-vm-ip-addresses-during-migration-1fe9</guid>
      <description>&lt;p&gt;Organisations are re-evaluating their VM infrastructure. The economics have shifted, the tooling has matured, and the case for running two separate platforms, one for containers, one for VMs, is getting harder to justify. Platform teams that spent years managing hypervisor infrastructure are being asked to consolidate, and most are landing on the same answer: Kubernetes.&lt;/p&gt;

&lt;p&gt;KubeVirt makes running VMs on Kubernetes possible. But &lt;a href="https://www.tigera.io/blog/deep-dive/the-power-of-kubevirt-and-calico/" rel="noopener noreferrer"&gt;KubeVirt networking&lt;/a&gt; – what happens to a VM’s IP address, VLAN, and security posture when it lands in a cluster – is where most migration plans hit a wall. The reasons go beyond cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most enterprises already run Kubernetes.&lt;/strong&gt; Containers are already there. Adding VMs to the same platform consolidates tooling, lifecycle management, networking models, and security policy into a single operational model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two platforms means double the overhead.&lt;/strong&gt; Separate infrastructure means separate upgrade cycles, separate monitoring, separate network configuration, and separate on-call runbooks. Platform consolidation has direct operational value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes is mature enough.&lt;/strong&gt; KubeVirt has reached the point where it’s a viable production choice for enterprise VM workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The decision to migrate is being made. The question is &lt;strong&gt;how to do it without causing chaos.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing KubeVirt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kubevirt.io/" rel="noopener noreferrer"&gt;KubeVirt&lt;/a&gt; extends the Kubernetes API with new custom resource types: &lt;code&gt;VirtualMachine&lt;/code&gt; and &lt;code&gt;VirtualMachineInstance&lt;/code&gt;. These make VMs first-class Kubernetes objects — scheduled, managed, and observable through the same tools and APIs as containers.&lt;/p&gt;

&lt;p&gt;A VM running in KubeVirt runs inside a &lt;code&gt;virt-launcher pod&lt;/code&gt;. Kubernetes schedules that pod to a node with available resources, the same way it schedules any other workload. The VM gets CPU and memory from the node. It doesn’t know it moved.&lt;/p&gt;

&lt;p&gt;That’s the point: from the VM’s perspective, KubeVirt is invisible. The operating system keeps running. The application keeps running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrh4hrko84vggixyj8dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrh4hrko84vggixyj8dz.png" width="676" height="254"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;KubeVirt virt-launcher pods in Kubernetes&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The network is a different story
&lt;/h2&gt;

&lt;p&gt;When you migrate a VM, three things have to follow: compute, storage, and network. Compute and storage are properties of the VM itself — self-contained. KubeVirt handles them by giving the VM a new host and a new storage backend. The VM doesn’t notice.&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;Dependency&lt;/strong&gt; | &lt;strong&gt;What KubeVirt Does&lt;/strong&gt; | &lt;strong&gt;Status&lt;/strong&gt; |&lt;br&gt;
| &lt;strong&gt;Compute ** | VM runs in a virt-launcher pod. Kubernetes schedules it. | Solved |&lt;br&gt;
| *&lt;em&gt;Storage *&lt;/em&gt; | Disk images mapped to Persistent Volumes via migration tools. | Solved |&lt;br&gt;
| **Network&lt;/strong&gt; | VM gets a new IP from the Kubernetes pod CIDR. | Note Solved |&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dependencies of VM migrations&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The network is different. The network isn’t a property of the VM. &lt;strong&gt;It’s a property of the VM’s relationship to everything else in the infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A VM’s compute dependency is between the VM and its host. A VM’s storage dependency is between the VM and a storage backend. But a VM’s network dependency is between the VM and every other system that knows how to reach it.&lt;/p&gt;

&lt;p&gt;That distinction is why networking is where VM migrations stall. This isn’t theoretical. KubeVirt’s own issue tracker documents the problem directly: a user &lt;a href="https://github.com/kubevirt/kubevirt/issues/14320" rel="noopener noreferrer"&gt;reported their VM’s IP changing after live migration&lt;/a&gt;, and a project maintainer confirmed: “Sticky IPs is not implemented.” The network identity doesn’t follow the VM by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdy44194kw5fkekzay7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdy44194kw5fkekzay7s.png" width="800" height="584"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Lift-and-Shift VMs to Kubernetes with Calico L2 Bridge Networks&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why default KubeVirt networking breaks VM migrations
&lt;/h2&gt;

&lt;p&gt;When a VM lands in Kubernetes using default pod networking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It receives a &lt;strong&gt;new IP address&lt;/strong&gt; from the cluster’s pod CIDR. A range that exists only inside the cluster&lt;/li&gt;
&lt;li&gt;The original &lt;strong&gt;VLAN doesn’t exist&lt;/strong&gt; inside the cluster. Kubernetes has no native VLAN concept in default networking&lt;/li&gt;
&lt;li&gt;Pod IPs are &lt;strong&gt;only meaningful inside the cluster&lt;/strong&gt;. The upstream network has no direct visibility into them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the perspective of every system that previously knew the VM by its address, the VM has disappeared. Something with an unfamiliar IP has appeared inside a cluster that the upstream infrastructure can’t see into.&lt;/p&gt;

&lt;p&gt;A VM’s IP address accumulates dependencies over time. By the time you’re migrating it, that IP is embedded in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firewall rules — &lt;/strong&gt; security teams wrote rules allowing or denying traffic to that specific address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS records — &lt;/strong&gt; the hostname resolves to that IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DHCP configuration — &lt;/strong&gt; the IP is reserved for that VM’s MAC address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring and alerting —&lt;/strong&gt;  observability tools are configured to watch that address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load balancer backends — &lt;/strong&gt; upstream load balancers route traffic to that IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application configuration files — &lt;/strong&gt; other services have that IP hardcoded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance and audit documentation —&lt;/strong&gt;  security posture records reference that IP in that VLAN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VLANs add another dimension. In enterprise environments, VLANs aren’t just a way to segment traffic, they’re security boundaries, designed and owned by the security team. Firewall rules are built around VLAN membership. Compliance frameworks reference VLAN placement. When the VM moves to Kubernetes with default networking, that VLAN disappears. The security boundary is gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of this travels with the VM automatically&lt;/strong&gt;. And every broken dependency requires a different team to fix it.&lt;/p&gt;

&lt;p&gt;You can see this directly. Running &lt;code&gt;kubectl exec&lt;/code&gt; into the virt-launcher pod of a migrated VM shows the interfaces KubeVirt creates with default pod networking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;2: eth0@if9: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450
&lt;span class="go"&gt;inet 10.60.141.196/32 scope global eth0
&lt;/span&gt;&lt;span class="gp"&gt;3: k6t-eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450
&lt;span class="go"&gt;inet 10.0.2.1/24 scope global k6t-eth0
&lt;/span&gt;&lt;span class="gp"&gt;4: tap0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450 master k6t-eth0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;eth0 is a Calico-assigned pod CIDR address — meaningful only inside the cluster. k6t-eth0 is KubeVirt’s internal masquerade bridge. tap0 connects to the VM’s virtual NIC. The VM’s original IP is gone. The upstream network sees 10.60.141.196, not the address any firewall rule, DNS record, or application config was written for.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A lift-and-shift becomes a multi-team project
&lt;/h2&gt;

&lt;p&gt;Here’s what was planned: the platform team moves the VM. One team. The migration is invisible to the rest of the business.&lt;/p&gt;

&lt;p&gt;Here’s what actually happens with default pod networking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The IP changes&lt;/strong&gt;. The &lt;strong&gt;network team&lt;/strong&gt; needs to rewrite firewall rules and update DNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The VLAN disappears&lt;/strong&gt;. The &lt;strong&gt;security team&lt;/strong&gt; needs to review the new network placement and approve it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application config breaks&lt;/strong&gt;. The &lt;strong&gt;application team&lt;/strong&gt; needs to update config files and hardcoded references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these requires sign-offs, tickets, and coordination&lt;/p&gt;

&lt;p&gt;A migration budgeted as a lift-and-shift gets delivered as a network redesign. &lt;strong&gt;Per VM&lt;/strong&gt;. At scale, the coordination cost makes migration impractical.&lt;/p&gt;

&lt;p&gt;This is where VM migration to Kubernetes stalls, not because the technology doesn’t work, but because the organisational cost exceeds what anyone planned or funded for.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to preserve VM IP addresses and VLANs in Kubernetes
&lt;/h2&gt;

&lt;p&gt;Think about what the problem really is. The VM had a home on the network. A specific IP, a specific VLAN, a specific place in the security model. When it moved to Kubernetes, that home disappeared. Default pod networking gave it a new address in a new network that nothing outside the cluster knows about.&lt;/p&gt;

&lt;p&gt;Calico L2 Bridge Networks solve this by doing the opposite. Calico L2 Bridge Networks extend a VM’s original Layer 2 network segment – including its IP address, VLAN, and MAC address – directly into a Kubernetes cluster via a node-level bridge, so the VM’s network identity survives the migration unchanged. Instead of putting the VM on Kubernetes’s network, it brings the VM’s original network into Kubernetes. The physical VLAN the VM lived on gets extended directly into the cluster via a bridge on the node. The VM connects to that bridge through a secondary interface, and the &lt;a href="http://tigera.io/blog/lift-and-shift-vms-to-kubernetes-with-calico-l2-bridge-networks/" rel="noopener noreferrer"&gt;VM preserves its original IP address&lt;/a&gt;, the same VLAN, and the same MAC address it had before the migration.&lt;/p&gt;

&lt;p&gt;Nothing on the outside knows anything has changed. The firewall still talks to the same IP. DNS still resolves to the right place. The monitoring dashboard still shows the right host. The application that had the IP hardcoded still connects. The security team’s VLAN boundary still exists — it just now exists inside Kubernetes too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpagqr6cfw811q39ztv4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpagqr6cfw811q39ztv4g.png" width="800" height="574"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;L2 Bridge Mode with Calico by Tigera&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can see the difference at the interface level. With Calico L2 Bridge, that same &lt;code&gt;virt-launcher&lt;/code&gt; pod now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;2: eth0@if9: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450
&lt;span class="go"&gt;   inet 10.60.141.196/32 scope global eth0
&lt;/span&gt;&lt;span class="gp"&gt;3: k6t-eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450
&lt;span class="go"&gt;   inet 10.0.2.1/24 scope global k6t-eth0
&lt;/span&gt;&lt;span class="gp"&gt;4: tap0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1450 master k6t-eth0
&lt;span class="gp"&gt;5: net1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1500
&lt;span class="go"&gt;   link/ether 52:54:00:3a:7f:21 brd ff:ff:ff:ff:ff:ff
   inet 10.10.5.42/24 brd 10.10.5.255 scope global net1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;net1&lt;/code&gt; is the secondary interface connected to the L2 bridge that Calico manages on the node. That’s the VM’s original IP&lt;code&gt;10.10.5.42&lt;/code&gt;, on its original subnet, with its original MAC address. The pod-side interfaces are still there, KubeVirt still needs them, but the VM’s actual network identity is preserved on &lt;code&gt;net1&lt;/code&gt;. That’s the interface the rest of your infrastructure talks to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a secondary interface and not the primary?
&lt;/h2&gt;

&lt;p&gt;KubeVirt manages the VM’s primary network interface through the &lt;code&gt;virt-launcher&lt;/code&gt; pod. That primary interface has two modes: &lt;strong&gt;masquerade&lt;/strong&gt; and &lt;strong&gt;bridge&lt;/strong&gt;. &lt;strong&gt;Masquerade&lt;/strong&gt; NATs all VM traffic through the pod’s IP. The VM is hidden behind the pod address. &lt;strong&gt;Bridge&lt;/strong&gt; mode connects the VM to the pod network bridge. Closer, but still the pod network, not your VLAN.&lt;/p&gt;

&lt;p&gt;Neither mode has a way to extend an external VLAN directly to the VM. They’re designed for pod networking, not for preserving legacy network identity.&lt;/p&gt;

&lt;p&gt;The secondary interface is what makes this work. Calico attaches an additional interface to the VM and that interface connects to the bridge Calico created on the node, which connects to the trunk carrying your VLAN from the physical switch. The VM’s traffic on that interface goes directly to the right network segment without any translation or tunnelling.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Calico sets it up
&lt;/h2&gt;

&lt;p&gt;The setup is declarative. You define what you want, Calico handles the plumbing.&lt;/p&gt;

&lt;p&gt;You create a &lt;code&gt;network&lt;/code&gt; resource in Kubernetes that tells Calico which VLAN to bridge and how to map it. Calico reads that and creates the bridge on the node automatically, attaches the trunk interface, and starts tracking the VM’s IP. A &lt;code&gt;NetworkAttachmentDefinition&lt;/code&gt; tells KubeVirt to attach the secondary interface at boot. The &lt;code&gt;VirtualMachine&lt;/code&gt; spec references the secondary network, and when the VM starts, &lt;code&gt;net1&lt;/code&gt; appears with the right IP.&lt;/p&gt;

&lt;p&gt;Migration tools like Forklift (for OpenShift Virtualisation) handle the mapping of existing VM interfaces to the cluster definitions and register the VM’s IP with Calico before migration. From that point, Calico owns the IP, tracking it, keeping routing state correct, and following the VM if it moves between nodes.&lt;/p&gt;

&lt;p&gt;Multiple VLANs can run through the same trunk-backed bridge. You don’t need separate infrastructure per VLAN, the same bridge handles them all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you gain after the migration
&lt;/h2&gt;

&lt;p&gt;Getting the VM into Kubernetes without breaking anything is the primary goal. But once it’s there, a few things become available that weren’t possible in the hypervisor environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network visibility
&lt;/h3&gt;

&lt;p&gt;In a traditional hypervisor setup, getting visibility into what a VM is actually doing on the network usually means deploying a separate agent, a network tap, or a dedicated monitoring tool per host. That visibility comes with the unified platform that Calico provides. Calico gives you traffic flow data, communication patterns, and network behaviour for VM interfaces without anything extra to install or manage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security policy you can actually version control
&lt;/h3&gt;

&lt;p&gt;The firewall rules that protected this VM before migration were probably sitting in a security team’s ticketing system, applied manually to a physical or virtual firewall. They worked, but they weren’t portable, they weren’t reviewable in a pull request, and they weren’t easy to audit.&lt;/p&gt;

&lt;p&gt;With Calico, you can express the same security posture as &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;Kubernetes-native network policy&lt;/a&gt;. Labels, selectors, declarative YAML. You don’t have to do this immediately as part of the migration. The VLAN boundary still exists, the existing firewall rules still apply. But when the security team is ready to modernise the policy model, the tooling is already there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Live migration that doesn’t touch the network
&lt;/h3&gt;

&lt;p&gt;Once a VM is running in Kubernetes, it can move between nodes for patching, rebalancing, hardware failures, and the network configuration moves with it. Calico tracks the IP and updates routing state automatically. From the outside, nothing changes. The VM is just on a different node now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making VM migration to Kubernetes practical
&lt;/h2&gt;

&lt;p&gt;Migration projects fail when the platform team scopes a job as “move the VM” and it turns into “rebuild the network.” That scope creep isn’t a technical failure, it’s what happens when you use a networking model designed for stateless containers to move workloads that were designed around stable, long-lived network identities.&lt;/p&gt;

&lt;p&gt;Calico L2 Bridge Networks solve the right problem: keep the network identity intact during the move, let the migration stay within the platform team’s remit, and leave modernisation for when it’s actually planned and funded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move now. Modernise later. On your own timeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watch our walkthrough to learn more: &lt;a href="http://youtube.com/watch?v=gxpm47mGKPc" rel="noopener noreferrer"&gt;Calico L2 Bridge Networking for Virtual Machines&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/kubevirt-networking-how-to-preserve-vm-ip-addresses-during-migration/" rel="noopener noreferrer"&gt;KubeVirt Networking: How to Preserve VM IP Addresses During Migration&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>vmmigration</category>
      <category>howto</category>
    </item>
    <item>
      <title>Your AI Agents Are Autonomous. But Are They Accountable?</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Fri, 17 Apr 2026 10:39:24 +0000</pubDate>
      <link>https://dev.to/tigeraio/your-ai-agents-are-autonomous-but-are-they-accountable-4pja</link>
      <guid>https://dev.to/tigeraio/your-ai-agents-are-autonomous-but-are-they-accountable-4pja</guid>
      <description>&lt;p&gt;&lt;em&gt;Why accountability, not capability, is the real bottleneck for enterprise agentic AI, and what security leaders need to do about it before regulators force the issue.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every enterprise is building AI agents. Marketing has one summarizing campaign performance. Engineering has one triaging incidents. Customer support has one resolving tickets. Finance has one processing invoices. And increasingly, those agents are talking to each other: calling tools, accessing databases, delegating tasks across complex multi-hop chains.&lt;/p&gt;

&lt;p&gt;But here’s the question nobody wants to hear at 3 a.m. when something goes wrong: &lt;em&gt;who authorized that action, what policy permitted it, and what’s the full chain of events?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For most enterprises, the honest answer is: nobody knows. That’s not a governance problem — it’s an &lt;a href="https://www.tigera.io/blog/beyond-the-prompt-ai-agent-design-patterns-and-the-new-governance-gap/" rel="noopener noreferrer"&gt;AI agent accountability&lt;/a&gt; crisis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents Are Scaling Faster Than Governance
&lt;/h2&gt;

&lt;p&gt;The data paints a stark picture. McKinsey research found that &lt;a href="https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/tech-forward/state-of-ai-trust-in-2026-shifting-to-the-agentic-era" rel="noopener noreferrer"&gt;80% of organizations have already encountered risky behavior from AI agents&lt;/a&gt;. These actions were unintended, unauthorized, or outside acceptable guardrails. Yet only about one-third of organizations report meaningful governance maturity. Gartner predicts that over &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;40% of agentic AI projects will be canceled by the end of 2027&lt;/a&gt; due to escalating costs, unclear business value, or inadequate risk controls.&lt;/p&gt;

&lt;p&gt;This isn’t a future problem. This is the mainstream enterprise experience with agentic AI right now. And the pattern should feel familiar. A decade ago, enterprises faced “shadow IT,” where employees adopting cloud services without IT approval created ungoverned sprawl that took years to bring under control. Today, agentic architectures risk creating a new back door for “shadow AI,” and the stakes are higher. Unlike cloud services, agents don’t just store data; they make decisions, call APIs, access databases, and propagate those actions across other agents in a chain that nobody can trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Regulatory Clock
&lt;/h2&gt;

&lt;p&gt;Compliance deadlines on both sides of the Atlantic are months away. The EU AI Act’s main provisions take effect in August 2026, requiring action logging, transparency, and human oversight for high-risk AI systems. In the US, the Colorado AI Act (being the leading regulation) takes effect in June 2026, mandating risk management programs and impact assessments for high-risk AI. And Colorado isn’t the only state: California, New York, Utah, and Texas have already enacted AI governance laws, and there are 80+ AI governance bills under consideration in the current US Federal Congress.&lt;/p&gt;

&lt;p&gt;Two-thirds of industry leaders believe &lt;a href="https://www.isaca.org/resources/news-and-trends/industry-news/2025/the-looming-authorization-crisis-why-traditional-iam-fails-agentic-ai" rel="noopener noreferrer"&gt;formal agent accountability frameworks will become mandatory within the next two years&lt;/a&gt;. The question isn’t whether these requirements are coming. It’s whether your organization will be ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Pillars for Agent Accountability
&lt;/h2&gt;

&lt;p&gt;Not all “governance” is created equal. Many enterprises believe they have agent governance because they have network policies or an API gateway. But governance without accountability is security theater; it might prevent some bad outcomes, but it can’t prove why good outcomes were permitted, trace what happened when something goes wrong, or satisfy an auditor asking for evidence.&lt;/p&gt;

&lt;p&gt;True agent accountability requires five distinct capabilities working together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Traceability —&lt;/strong&gt; Can you trace what happened, end to end? When Agent A calls Agent B, which calls Tool C, which accesses Database D, can you reconstruct the entire chain with timestamps and outcomes at every hop? Without traceability, incident response is guesswork.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization provenance —&lt;/strong&gt; Can you prove why it was permitted? Not just “Agent A was allowed to call Agent B,” but “Agent A was allowed to call Agent B because Policy X grants agents with capability Y access to agents with risk-level Z.” This is the difference between a lock on the door and a sign-in sheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity and ownership —&lt;/strong&gt; Who owns this agent, and who is responsible when it acts? Every agent needs a verified identity and a clear human owner. Without it, accountability diffuses across components, and diffused accountability is no accountability at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy-based governance at scale —&lt;/strong&gt; Does your security model survive agent #101? With 10 agents, you can manage permissions by hand. With 100, you can’t. Scalable governance requires declarative, attribute-based policies that grow with the network, not against it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human oversight and intervention —&lt;/strong&gt; Can a human review, approve, or override? Effective oversight means visibility into what agents are doing, the ability to review interactions after the fact, and the power to modify policies or revoke access in real time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’re missing any one of these pillars, you have a gap that will surface during your next incident, audit, or regulatory review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Existing Approaches Can’t Deliver AI Agent Accountability
&lt;/h2&gt;

&lt;p&gt;Enterprises aren’t starting from zero; most have invested in network policies, API gateways, RBAC, and protocols like MCP and A2A. The problem isn’t a lack of tools. It’s that these tools were designed for model outputs (a world where services are deterministic, communication patterns are predictable, and humans make all the decisions), not autonomous actions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;Network policies&lt;/a&gt; operate at the wrong abstraction level for agent accountability. They can say “pods in namespace A can reach pods in namespace B,” but they can’t say “Agent A with risk-level=low can only call agents with risk-level=low.” They have no concept of agent identity, capabilities, or policy attributes, and they produce no audit trail.&lt;/p&gt;

&lt;p&gt;API gateways handle north-south traffic but don’t understand the east-west, multi-hop nature of agent-to-agent communication. MCP and A2A solve the &lt;em&gt;how&lt;/em&gt; of agent communication, but explicitly assume someone else handles the &lt;em&gt;who&lt;/em&gt; and the &lt;em&gt;why&lt;/em&gt;. RBAC works at small scale but can’t express the nuanced, attribute-based policies that agent governance requires.&lt;/p&gt;

&lt;p&gt;The industry has solved agent communication and agent infrastructure. What’s missing is the accountability layer — the control plane that answers three questions for every agent interaction: Who authorized this? What policy permitted it? What’s the full record?&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Governance Gap Is Growing
&lt;/h2&gt;

&lt;p&gt;The enterprises that thrive in the agentic era won’t be the ones that deploy the most agents. They’ll be the ones that can prove their agents are operating within policy, trace every interaction end to end, and answer the question: &lt;em&gt;who’s accountable when the agent acts?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We wrote a strategic guide to help you get there.&lt;/strong&gt; Our whitepaper, &lt;em&gt;Accountable AI Agents: A Strategic Guide for AI &amp;amp; Security Leaders Governing Autonomous AI at Scale&lt;/em&gt;, breaks down the full framework — the five pillars of agent accountability, why existing approaches leave gaps, and the architectural principles your governance platform needs to deliver. It also provides the solution, the accountability maturity model, which guides how to fix these security and accountability gaps. No product demos, no fluff. Just the blueprint your leadership team needs before the next incident or regulation forces your hand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://info.tigera.io/rs/805-GFH-732/images/Whitepaper_Accountability_for_AI_Agents.pdf?version=0" rel="noopener noreferrer"&gt;Get the strategic guide for accountable AI agents →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/your-ai-agents-are-autonomous-but-are-they-accountable/" rel="noopener noreferrer"&gt;Your AI Agents Are Autonomous. But Are They Accountable?&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>featuredblog</category>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Deployed Is Not the Same as Ready: How Mature Is Your Kubernetes Environment?</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 16 Apr 2026 22:00:25 +0000</pubDate>
      <link>https://dev.to/tigeraio/deployed-is-not-the-same-as-ready-how-mature-is-your-kubernetes-environment-317h</link>
      <guid>https://dev.to/tigeraio/deployed-is-not-the-same-as-ready-how-mature-is-your-kubernetes-environment-317h</guid>
      <description>&lt;p&gt;Kubernetes adoption is no longer the challenge it once was. More than 82% of enterprises run containers in production, most of them on multiple Kubernetes clusters. Adoption, however, does not mean operational maturity. These are two very different things. It is one thing to deploy workloads to a cluster or two and quite another to do it securely, efficiently and at scale.&lt;/p&gt;

&lt;p&gt;This distinction matters because the gap between adoption and &lt;a href="https://www.tigera.io/lp/ebook-building-resilient-multi-cluster-kubernetes/" rel="noopener noreferrer"&gt;Kubernetes operational maturity&lt;/a&gt; is where risk accumulates. Operationally mature organizations ship faster, recover from incidents in minutes instead of hours and consistently pass compliance audits. They spend less time dealing with outages and more time delivering new services to their customers.&lt;/p&gt;

&lt;p&gt;So what separates maturity from adoption? It comes down to a handful of foundational capabilities that, when done well, result in measurable business impact. Operational maturity — the ability to run Kubernetes workloads securely, efficiently, and at scale, with consistent policy enforcement, cross-cluster observability, and automated incident recovery — is not a destination; it is a continuous process of strengthening the architectural pillars that keep your Kubernetes environment production-ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does operational maturity look like?
&lt;/h2&gt;

&lt;p&gt;Operational maturity spans several interconnected areas from &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security-best-practices/" rel="noopener noreferrer"&gt;Kubernetes security best practices&lt;/a&gt; to observability and multi-cluster connectivity that, taken together, determine how resilient, secure, and observable your Kubernetes environment truly is. One practical way to measure this is to walk through the capabilities your environment either has or does not have yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhk9f58pofqvo44c5txa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhk9f58pofqvo44c5txa.png" width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A running vs an operationally mature Kubernetes environment&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Can you effectively isolate workloads from each other?
&lt;/h3&gt;

&lt;p&gt;The flat network default which allows pods to be created, destroyed and moved on the fly (a core Kubernetes capability) also creates a wide-open door for lateral movement if a workload is compromised.&lt;/p&gt;

&lt;p&gt;A tiered policy model addresses this by organizing &lt;a href="http://tigera.io/learn/guides/kubernetes-security/kubernetes-network-policy/" rel="noopener noreferrer"&gt;network policies&lt;/a&gt; into layers of precedence, each owned by a different team. Security teams define high-priority guardrails—for example, blocking traffic to malicious destinations, enforcing tenant isolation—while platform teams secure infrastructure components and developers write fine-grained rules for their own applications. This separation of duties eliminates policy sprawl and ensures that a developer-created rule can never accidentally override a critical security baseline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do you have a zero-trust security policy with pod to pod encryption and workload identity?
&lt;/h3&gt;

&lt;p&gt;In addition to isolation, security means a &lt;a href="https://www.tigera.io/learn/guides/zero-trust/" rel="noopener noreferrer"&gt;zero trust&lt;/a&gt; posture, and that in turn means mTLS for internal cluster traffic. mTLS has become a hard requirement, both for regulators and for security teams that have learned the hard way what unencrypted east-west traffic costs when something goes wrong.&lt;/p&gt;

&lt;p&gt;For organizations that have given up on service mesh, Istio ambient mode is worth a look. It delivers automatic mTLS and SPIFFE-based workload identity across all traffic without the resource cost of sidecars. L7 capabilities such as traffic shaping and advanced observability can be layered in selectively only for the services that need them.&lt;/p&gt;

&lt;p&gt;Security is the foundation and non-negotiable starting point on the journey towards a mature Kubernetes posture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does your ingress solution have all the capabilities you need without relying on vendor-specific annotations?
&lt;/h3&gt;

&lt;p&gt;The retirement of Ingress NGINX Controller was a wake up call for many organizations making them realize that ‘good enough’ is, in fact, not good enough. Migrating to a robust and future proof implementation of &lt;a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-gateway-api/" rel="noopener noreferrer"&gt;Gateway API&lt;/a&gt; is one more step along the road to operational maturity.&lt;/p&gt;

&lt;p&gt;Ingress and traffic management are evolving rapidly. The Kubernetes Ingress API served its purpose for years, but reliance on annotations, limited protocol support, and a single-controller model have become constraints at scale. The Gateway API replaces it with a role-oriented model. This is more than a technical upgrade. It is a shift not only towards more granular and comprehensive traffic control but towards decentralized management where cluster administrators control the infrastructure and development teams define their application-specific routing rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is egress getting the attention it needs?
&lt;/h3&gt;

&lt;p&gt;Egress traffic management is the often overlooked sibling of ingress control. Without dedicated egress controls, outbound traffic from your cluster uses the node’s IP address, which means different tenants and workloads become indistinguishable to the outside world. This makes audit trails unreliable, complicates compliance, and creates real security exposure.&lt;/p&gt;

&lt;p&gt;An &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/egress-gateway/" rel="noopener noreferrer"&gt;egress gateway architecture&lt;/a&gt; assigns each tenant or namespace a dedicated, static IP address for outbound traffic. External services can then allowlist those specific addresses, firewall rules become deterministic, and your security team can trace any outbound connection back to the workload that initiated it.&lt;/p&gt;

&lt;p&gt;If your pods need to access external endpoints egress control deserves a place on your maturity roadmap, not on the back burner.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you connect your clusters?
&lt;/h3&gt;

&lt;p&gt;It is rare to find organizations with just one Kubernetes cluster in production. Spectro Cloud reported that l&lt;a href="https://www.spectrocloud.com/state-of-kubernetes-2025#overview-report" rel="noopener noreferrer"&gt;arge enterprises operate more than 20 clusters across five or more cloud environments&lt;/a&gt;. If you are running AI workloads that are more than a simple API for the company chatbot, deploying a multi-cluster architecture that isolates GPU heavy training jobs from inference endpoints is a baseline expectation.&lt;/p&gt;

&lt;p&gt;Unfortunately, the traditional &lt;a href="https://www.tigera.io/learn/guides/kubernetes-networking/kubernetes-multi-cluster/" rel="noopener noreferrer"&gt;multi-cluster architecture&lt;/a&gt;, which relies on external DNS and load balancers, exposes your internal services and presents a real risk. Beyond the security exposure, it introduces operational drag that compounds with every cluster you add. We are talking about frustrating DNS propagation delays, security policies that have to be manually synchronized across environments and, of course, the inevitable configuration drift.&lt;/p&gt;

&lt;p&gt;Cluster mesh architecture, with its unified observability, Kubernetes-native service discovery that does not rely on external DNS and consistent inter-cluster security policies, is what can keep a complex multi-cluster environment from becoming a liability. Multi-cluster done well is a reliable measure of operational maturity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are you relying solely on hardware load balancers
&lt;/h3&gt;

&lt;p&gt;Hardware load balancers were built for a pre-Kubernetes world. They have no native concept of pods, services, or namespaces, and every configuration change typically requires a ticket, a separate team, and a procurement cycle. As Kubernetes becomes the default platform for production workloads, that operational friction compounds. The more clusters you run and the more latency-sensitive your workloads become, the more the limitations of hardware-centric load balancing show up in your incident logs and your budget.&lt;/p&gt;

&lt;p&gt;A Kubernetes-native load balancer replaces the appliance with software that runs inside the cluster and understands its abstractions. Capacity scales horizontally by adding nodes, not by upgrading hardware. Configuration uses standard Kubernetes resources, which means no separate management console and no version drift between your cluster and your load balancer. For teams managing payment processing, trading systems, or real-time data pipelines, the combination of eBPF-based forwarding, consistent hashing, and graceful node draining delivers the reliability of enterprise appliances without the operational overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is your team still stitching together clues from kubectl and scattered logs, or do you have a single, unified view across your entire environment?
&lt;/h3&gt;

&lt;p&gt;Kubernetes environments can fail quietly. Services degrade, traffic patterns shift, and workloads compete for resources in ways that are invisible without the right instrumentation in place. In a single cluster, experienced engineers can often piece together what is happening from logs and metrics. Across multiple clusters, namespaces, and workload types that approach becomes highly inefficient and costly. Managing cost and efficiently tracking down problems is even harder, and more imperative, now that AI workloads, with their training jobs, inference endpoints and non-deterministic agents, often share infrastructure and resources with business-critical services.&lt;/p&gt;

&lt;p&gt;Unified observability is essential to keeping all the moving parts manageable. Without Kubernetes-aware telemetry that is enriched with metadata about namespaces, services, and workload identity teams are operating blind. Mature observability means you can detect anomalous traffic patterns in real time, trace requests across cluster boundaries, and generate the audit evidence that compliance frameworks demand. It turns reactive firefighting into proactive operations. Organizations that strive for operational maturity cannot do without it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F683zan9brf76kap19tlu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F683zan9brf76kap19tlu.png" width="800" height="474"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Where are you on the journey to operational maturity?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where do you stand?
&lt;/h2&gt;

&lt;p&gt;No organization achieves Kubernetes operational maturity overnight, and not everything needs to be optimized immediately. What matters is knowing where you stand today so you can prioritize items that will have the greatest impact on your security posture, operational efficiency, and ability to support your current and future workloads. Whether you are still relying on default-allow networking, beginning to explore egress controls, or already running a multi-cluster mesh, there is always a next step on the maturity curve.&lt;/p&gt;

&lt;p&gt;Read our ebook, &lt;a href="https://www.tigera.io/lp/ebook-building-resilient-multi-cluster-kubernetes/" rel="noopener noreferrer"&gt;Building Resilient Multi-Cluster Kubernetes&lt;/a&gt; to get a practical framework for closing the gap between Kubernetes adoption and operational readiness.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/deployed-is-not-the-same-as-ready-how-mature-is-your-kubernetes-environment/" rel="noopener noreferrer"&gt;Deployed Is Not the Same as Ready: How Mature Is Your Kubernetes Environment?&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>featuredblog</category>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>products</category>
    </item>
    <item>
      <title>Beyond the Prompt: AI Agent Design Patterns and the New Governance Gap</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 15 Apr 2026 19:25:41 +0000</pubDate>
      <link>https://dev.to/tigeraio/beyond-the-prompt-ai-agent-design-patterns-and-the-new-governance-gap-4eki</link>
      <guid>https://dev.to/tigeraio/beyond-the-prompt-ai-agent-design-patterns-and-the-new-governance-gap-4eki</guid>
      <description>&lt;p&gt;If you are treating Large Language Models (LLMs) like simple question-and-answer machines, you are leaving their most transformative potential on the table. The industry has officially shifted from zero-shot prompting to structured &lt;a href="https://youtu.be/GDm_uH6VxPY?si=xsD64NCIrkhEU71d" rel="noopener noreferrer"&gt;AI agent design patterns&lt;/a&gt; and agentic workflows where AI iteratively reasons, uses external tools, and collaborates to solve complex engineering problems. These design patterns are the architectural blueprints that determine how autonomous Agentic AI systems work and interact with your infrastructure.&lt;/p&gt;

&lt;p&gt;But as these systems proliferate faster than organizations can govern them, they introduce a critical &lt;a href="https://www.tigera.io/blog/securing-ai-workloads-in-kubernetes-why-traditional-network-security-isnt-enough/" rel="noopener noreferrer"&gt;AI agent security&lt;/a&gt; risk: By the end of 2026, &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-08-26-gartner-predicts-40-percent-of-enterprise-apps-will-feature-task-specific-ai-agents-by-2026-up-from-less-than-5-percent-in-2025" rel="noopener noreferrer"&gt;40% of enterprise applications will feature embedded AI agents&lt;/a&gt;, and those teams will urgently need purpose-built strategies to govern this new autonomous workforce before it becomes the next major shadow IT crisis.&lt;/p&gt;

&lt;p&gt;Before you can secure these autonomous systems, you have to understand how they are built. Here is a technical breakdown of the current AI Agent design patterns you need to know, and the specific security blind spots each design pattern creates.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Foundational Execution Patterns
&lt;/h2&gt;

&lt;p&gt;Building reliable AI systems comes down to how you route the cognitive load. Here are the three baseline structural patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. The Single Agent (Tool Use)
&lt;/h3&gt;

&lt;p&gt;In this pattern, a single LLM is equipped with access to external, deterministic tools (APIs, databases, bash environments, or the Model Context Protocol).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; The agent receives a prompt, realizes it lacks the necessary context, calls a tool, ingests the output, and formulates a final response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Governance Challenge:&lt;/strong&gt; When an agent is granted API keys to query your cluster, it operates with implicit trust to access that data. If compromised via prompt injection, that single agent becomes an unmonitored vector for data exfiltration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. The Sequential Agent (The Assembly Line)
&lt;/h3&gt;

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

&lt;p&gt;When a single agent fails at a complex task, we break the task down into a pipeline. Sequential agents operate in a linear hand-off, where the output of &lt;em&gt;Agent A&lt;/em&gt; becomes the input of &lt;em&gt;Agent B&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; You deploy specialized micro-agents. Agent 1 extracts data, Agent 2 analyzes it, and Agent 3 formats the final report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Governance Challenge:&lt;/strong&gt; As data flows between agents, maintaining an audit lineage becomes incredibly complex. You cannot easily trace which tools Agent 2 called based on Agent 1’s corrupted input.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C. The Parallel Agent (Concurrency &amp;amp; Voting)
&lt;/h3&gt;

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

&lt;p&gt;To combat the latency of sequential pipelines, the Parallel pattern fans out tasks to multiple specialized agents simultaneously.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; A router agent delegates sub-tasks to multiple worker agents concurrently. Once they finish, a “Judge” or “Synthesizer” agent aggregates the parallel outputs into a cohesive result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Governance Challenge:&lt;/strong&gt; You now have multiple autonomous agents acting concurrently. Traditional security tools built for deterministic services cannot provide the visibility or control required for these non-deterministic autonomous actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The Advanced Cognitive Patterns That Complicate AI Agent Security
&lt;/h2&gt;

&lt;p&gt;To make agents truly autonomous, developers are giving them the ability to “think” about their own work. These cognitive patterns drastically improve output quality, but introduce severe behavioral unpredictability.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. The Reflection Pattern (Critic &amp;amp; Refiner)
&lt;/h3&gt;

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

&lt;p&gt;The Reflection pattern pairs a Generator agent with a Critic agent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; The Generator outputs a first draft. The Critic evaluates it against guardrails, and the Generator iteratively refines the output until it passes the Critic’s checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; Wrapping an older model (like GPT-3.5) in a Reflection loop often produces higher-quality, more reliable code than a zero-shot prompt to a cutting-edge model (like GPT-5.4 Pro).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. The Planning Pattern
&lt;/h3&gt;

&lt;p&gt;For highly ambiguous goals, agents need the autonomy to devise their own roadmaps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Given a high-level goal, the Planning agent decomposes it into a Directed Acyclic Graph (DAG) of sub-tasks. It executes the plan step-by-step, adapting dynamically if a step fails (e.g., “Dependency missing, re-routing to fetch from alternate repo”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Governance Challenge:&lt;/strong&gt; AI agents don’t follow scripts. They autonomously choose which tools to call, which data to access, and which agents to collaborate with, making static security models completely obsolete.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. The Cold Start Problem: Why AI Agent Governance Can’t Wait
&lt;/h2&gt;

&lt;p&gt;The ultimate evolution of these patterns is &lt;strong&gt;Multi-Agent Collaboration&lt;/strong&gt; , a “society of minds” system where diverse agents with distinct personas (The Architect, The Security Engineer, The QA Tester) debate, share data, and execute code collaboratively across boundaries. &lt;strong&gt;AI agent security&lt;/strong&gt; — &lt;em&gt;the discipline of discovering, controlling, and auditing what autonomous agents can access and do&lt;/em&gt; — requires a fundamentally different approach than traditional application security. Each pattern described above introduces distinct risks, and in combination, they create attack surfaces that traditional security models were never designed to handle.&lt;/p&gt;

&lt;p&gt;But as AI/ML engineering teams race to deploy and scale these &lt;a href="https://www.tigera.io/blog/how-ai-agents-communicate-understanding-the-a2a-protocol-for-kubernetes/" rel="noopener noreferrer"&gt;Agent-to-Agent (A2A) architectures&lt;/a&gt;, most enterprises realize they don’t have any inventory of the AI agents running in their environment, including shadow agents deployed by teams outside official channels. A massive infrastructure challenge arises: &lt;strong&gt;How do these agents communicate securely?&lt;/strong&gt; You cannot govern what you cannot see.&lt;/p&gt;

&lt;p&gt;Whether your AI agents run in Kubernetes, cloud environments, on-premises, at the edge, or on developer laptops, governance that only covers one environment is governance with holes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Tigera Agent Governance (TAG)
&lt;/h3&gt;

&lt;p&gt;We are moving past the era of human-in-the-loop chat interfaces into human-on-the-loop autonomous systems. To bridge this gap, Tigera is introducing &lt;a href="https://www.tigera.io/tigera-products/tigera-agent-governance/" rel="noopener noreferrer"&gt;TAG&lt;/a&gt;: the platform with the discipline to discover, authenticate, authorize, enforce, and audit every agent action, wherever agents run.&lt;/p&gt;

&lt;p&gt;TAG is the first platform to own the full five-pillar framework required for modern AI workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery:&lt;/strong&gt; Central registry and auto-discovery of shadow agents across your infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Cryptographic trust giving every agent a verified identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization:&lt;/strong&gt; Default-deny, fine-grained access control with tool-level binding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcement:&lt;/strong&gt; Real-time enforcement that enables development velocity without bureaucratic blockers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance:&lt;/strong&gt; Full audit lineage, service graph visualization, and board-ready compliance reporting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your AI agents are making decisions. Do you know what they’re authorized to do?&lt;/strong&gt; Do not wait for an autonomous agent to go rogue. Secure your next-generation architecture with universal governance built for the Agentic AI era.&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://www.tigera.io/contact-tigera-agent-governance/" rel="noopener noreferrer"&gt;Request Early Access to TAG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/beyond-the-prompt-ai-agent-design-patterns-and-the-new-governance-gap/" rel="noopener noreferrer"&gt;Beyond the Prompt: AI Agent Design Patterns and the New Governance Gap&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>products</category>
    </item>
    <item>
      <title>How to Stub LLMs for AI Agent Security Testing and Governance</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 02 Apr 2026 14:15:28 +0000</pubDate>
      <link>https://dev.to/tigeraio/how-to-stub-llms-for-ai-agent-security-testing-and-governance-34n2</link>
      <guid>https://dev.to/tigeraio/how-to-stub-llms-for-ai-agent-security-testing-and-governance-34n2</guid>
      <description>&lt;p&gt;_ &lt;strong&gt;Note:&lt;/strong&gt; The core architecture for this pattern was introduced by &lt;a href="https://www.linkedin.com/in/isaac-hawley-9481743/" rel="noopener noreferrer"&gt;Isaac Hawley&lt;/a&gt; from Tigera._&lt;/p&gt;

&lt;p&gt;If you are building an AI agent that relies on tool calling, complex routing, or the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt;, you’re not just building a chatbot anymore. You are building an autonomous system with access to your internal APIs.&lt;/p&gt;

&lt;p&gt;With that power comes a massive security and governance headache, and AI agent security testing is where most teams hit a wall. &lt;strong&gt;How do you definitively prove that your agent’s identity and access management (IAM) actually works?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The scale of the problem is hard to overstate. Microsoft’s telemetry shows that &lt;a href="https://www.microsoft.com/en-us/security/blog/2026/02/10/80-of-fortune-500-use-active-ai-agents-observability-governance-and-security-shape-the-new-frontier/" rel="noopener noreferrer"&gt;80% of Fortune 500 companies now run active AI agents&lt;/a&gt;, yet only 47% have implemented specific AI security controls. Most teams are deploying agents faster than they can test them.&lt;/p&gt;

&lt;p&gt;If an agent is hijacked via prompt injection, or simply hallucinates a destructive action, does your governance layer stop it? Testing this usually forces engineers into a frustrating trade-off:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use the real API (Gemini, OpenAI):&lt;/strong&gt; Real models are heavily RLHF’d to be safe and polite. It is incredibly difficult (and non-deterministic) to intentionally force a real model to “go rogue” and consistently output malicious tool calls so you can test your security boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock the internal tools only:&lt;/strong&gt; You test your Python or Go functions in isolation, but you never actually test the “Agent Loop”—meaning you aren’t testing if the harness correctly applies the user’s OAuth tokens or &lt;a href="https://docs.tigera.io/calico/latest/network-policy/get-started/kubernetes-policy/kubernetes-network-policy" rel="noopener noreferrer"&gt;Role-Based Access Control (RBAC)&lt;/a&gt; to the LLM’s requested tool call.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Recently, Isaac Hawley introduced a much better pattern: &lt;strong&gt;The Stub Model&lt;/strong&gt; —a way to stub your LLM for testing that makes your security assertions completely deterministic.&lt;/p&gt;

&lt;p&gt;A Stub Model (or mock LLM) is a deterministic, non-AI replacement for a real language model that you inject into your agent harness during testing. It returns hardcoded tool-call requests — including deliberately malicious ones — so you can prove that your security layer correctly intercepts and blocks unauthorized actions without relying on a live model API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Concept: A “Malicious” Router for AI Agent Security Testing
&lt;/h2&gt;

&lt;p&gt;Instead of hitting a real model API during tests, we inject a &lt;code&gt;StubLLM that&lt;/code&gt; implements our system’s core LLM interface.&lt;/p&gt;

&lt;p&gt;The stub doesn’t use any AI. Instead, it parses incoming prompts for specific testing triggers and returns hardcoded, completely predictable tool calls. Crucially, this forces your agent harness to &lt;strong&gt;actually execute the real underlying tool pipeline&lt;/strong&gt;. You aren’t just faking a final text response; you are making the LLM trigger your application’s real execution loop.&lt;/p&gt;

&lt;p&gt;From a governance perspective, this is a superpower. You can program the stub to request highly privileged actions (like &lt;code&gt;drop_database&lt;/code&gt; or&lt;code&gt;read_all_users&lt;/code&gt;), and then write strict, lightning-fast assertions to prove that your Agent Harness intercepts the call, checks the executing user’s identity, and blocks the action.&lt;/p&gt;

&lt;p&gt;Here is how you can implement and test this security pattern in both Python and Go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python: Proving RBAC &amp;amp; Tool Governance
&lt;/h3&gt;

&lt;p&gt;In Python, we use a &lt;code&gt;Protocol&lt;/code&gt; to define our LLM dependency, and then build a Stub that intentionally requests unauthorized actions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="c1"&gt;# Define standard tool call response formats
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
   &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
   &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
   &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="c1"&gt;# Define the LLM Interface
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LLMClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;# Implement the Stub Model for Security Testing
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StubLLM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="c1"&gt;# 1. Standard authorized action
&lt;/span&gt;       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MOCK_WEATHER_TOOL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;call_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;London&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})]&lt;/span&gt;
           &lt;span class="p"&gt;)&lt;/span&gt;

       &lt;span class="c1"&gt;# 2. Malicious / Unauthorized action for Governance testing
&lt;/span&gt;       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MOCK_UNAUTHORIZED_DELETE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
                   &lt;span class="nc"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                       &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;call_malicious_999&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delete_user_account&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# The LLM is trying something dangerous!
&lt;/span&gt;                   &lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;]&lt;/span&gt;
           &lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a stubbed standard response.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Security Unit Test (&lt;code&gt;pytest&lt;/code&gt;):&lt;/strong&gt; With the stub in place, we can test that our Agent correctly parses the dangerous tool call, evaluates the user’s identity, and &lt;strong&gt;blocks&lt;/strong&gt; the execution of the real local Python function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_agent_rbac_blocks_unauthorized_tool_execution&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="c1"&gt;# Arrange: Inject our deterministic stub into the Agent
&lt;/span&gt;&lt;span class="n"&gt;stubbed_llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StubLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Initialize our agent harness with a heavily restricted "guest" identity
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;stubbed_llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;guest_user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Act: Send the trigger that forces our stub to attempt a destructive tool call
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Please MOCK_UNAUTHORIZED_DELETE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Assert: Verify the Agent's governance harness intercepted the call,
# checked the "guest_user" identity, and blocked the REAL local tool.
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocked_by_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_executed&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Insufficient permissions to execute delete_user_account&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error_message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Go: Validating OAuth &amp;amp; Identity Boundaries
&lt;/h3&gt;

&lt;p&gt;In Go, this pattern shines for validating complex OAuth scopes or identity propagation in multi-agent networks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;
   &lt;span class="s"&gt;"strings"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ToolCall&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
   &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
   &lt;span class="n"&gt;Arguments&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="s"&gt;`json:"arguments"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"content,omitempty"`&lt;/span&gt;
   &lt;span class="n"&gt;ToolCalls&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ToolCall&lt;/span&gt; &lt;span class="s"&gt;`json:"tool_calls,omitempty"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;StubLLM&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewStubLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;StubLLM&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;StubLLM&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;StubLLM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c"&gt;// Simulate an Agent trying to access a secure internal system via MCP&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MOCK_ACCESS_SECURE_VAULT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"secret_id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"prod_db_password"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="n"&gt;ToolCalls&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="p"&gt;{&lt;/span&gt;
                   &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"call_vault_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"read_secure_vault"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;Arguments&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="p"&gt;},&lt;/span&gt;
           &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Standard response"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Security Unit Test (&lt;code&gt;testing&lt;/code&gt;):&lt;/strong&gt; We write a test to guarantee that if the LLM decides to hit the vault, the Agent harness forces the underlying tool to respect the provided OAuth context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;agent_test&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s"&gt;"testing"&lt;/span&gt;
&lt;span class="s"&gt;"errors"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestAgentEnforcesOAuthScopes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c"&gt;// Arrange: Initialize the agent with the Stub model&lt;/span&gt;
&lt;span class="n"&gt;stub&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewStubLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;// Create an agent context with a standard user OAuth token (No Vault Access)&lt;/span&gt;
&lt;span class="n"&gt;mockOAuthContext&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"read:public"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;myAgent&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mockOAuthContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// Act: Trigger the LLM to request a highly privileged tool call&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;myAgent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I need you to MOCK_ACCESS_SECURE_VAULT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// Assert: Verify the harness evaluated the tool against the OAuth scope and blocked it&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CRITICAL SECURITY FAILURE: Agent executed secure vault tool without proper OAuth scope"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ErrUnauthorizedToolExecution&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Expected authorization error, got: %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExecutedTool&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"read_secure_vault"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The real tool was executed despite lack of permissions!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Security &amp;amp; Governance Teams Love This Architecture
&lt;/h2&gt;

&lt;p&gt;By treating the LLM like any other untrusted external dependency, we achieve total control over our agent’s testing environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auditable Proof of Governance:&lt;/strong&gt; You now have concrete CI/CD tests proving that your agent respects OAuth scopes, RBAC, and identity guardrails. You aren’t just hoping the model behaves; you are proving the harness defends against it when it doesn’t.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests the Real Agent Harness:&lt;/strong&gt; Because the LLM returns a perfectly formatted tool call request, your application code actually executes its real security middleware. You validate the entire execution loop, not just a mocked final answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightning Fast &amp;amp; Free:&lt;/strong&gt; You can run thousands of these security edge-case tests in milliseconds without spending a dime on API tokens or exposing secrets in your CI pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Force Prompt Injection Scenarios:&lt;/strong&gt; You can easily stub the LLM to return tool arguments containing SQL injection or XSS payloads to ensure your local tools sanitize inputs provided by the AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Trade-Offs: What the Stub Model DOESN’T Test
&lt;/h2&gt;

&lt;p&gt;As powerful as this architecture is for testing your infrastructure, it’s important to acknowledge that it is not a silver bullet. There are two major things the Stub Model cannot test:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It tests the pipes, not the brain:&lt;/strong&gt; The stub proves your system can correctly block a malicious tool call, but it does &lt;em&gt;not&lt;/em&gt; test whether your system prompt is resilient to &lt;a href="https://www.tigera.io/learn/guides/llm-security/prompt-injection/" rel="noopener noreferrer"&gt;prompt injection&lt;/a&gt; in the first place. You still need LLM-as-a-judge pipelines and continuous evaluation frameworks to test your model’s actual reasoning capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor Schema Drift:&lt;/strong&gt; If OpenAI, Anthropic, or Google update the shape of their underlying JSON tool-call schema, your hardcoded stub tests will still pass with flying colors while your production environment crashes. You still need a handful of real, end-to-end (E2E) smoke tests running against the live API on a nightly basis to catch vendor drift.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Beyond the Chatbot: Engineering for Agency
&lt;/h2&gt;

&lt;p&gt;If you are building complex systems, delegating between autonomous agents, or integrating internal APIs via MCP, you cannot afford to have untested authorization loops.&lt;/p&gt;

&lt;p&gt;By treating the LLM like any other untrusted external dependency, we achieve total control over our agent’s testing environment. We gain &lt;strong&gt;auditable proof of governance&lt;/strong&gt; , ensuring we can run thousands of CI/CD tests in milliseconds without exposing secrets or spending a dime on API tokens.&lt;/p&gt;

&lt;p&gt;If you are building complex systems, delegating between autonomous agents, or integrating internal APIs via MCP, you cannot afford to have untested authorization loops.&lt;/p&gt;

&lt;p&gt;Do yourself a favor: &lt;strong&gt;Stub your LLMs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Stubbing your LLM proves the guardrails work in test. &lt;strong&gt;TAG&lt;/strong&gt; enforces them in production, giving you continuous visibility into every agent action, authorization decision, and policy enforcement event across your entire organization. &lt;a href="https://www.tigera.io/contact-tigera-agent-governance/" rel="noopener noreferrer"&gt;Talk to us about TAG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/how-to-stub-llms-for-ai-agent-security-testing-and-governance/" rel="noopener noreferrer"&gt;How to Stub LLMs for AI Agent Security Testing and Governance&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera - Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecuritygover</category>
      <category>bestpractices</category>
      <category>howto</category>
    </item>
    <item>
      <title>Introducing Calico Load Balancer and Seamless VM-to-Kubernetes Migration</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 23 Mar 2026 07:01:36 +0000</pubDate>
      <link>https://dev.to/tigeraio/introducing-calico-load-balancer-and-seamless-vm-to-kubernetes-migration-474c</link>
      <guid>https://dev.to/tigeraio/introducing-calico-load-balancer-and-seamless-vm-to-kubernetes-migration-474c</guid>
      <description>&lt;p&gt;&lt;strong&gt;SAN JOSE, Calif., March 23, 2026&lt;/strong&gt; — &lt;a href="https://www.tigera.io/?utm_source=syndicate&amp;amp;utm_medium=press_release&amp;amp;utm_campaign=KubeCon2026" rel="noopener noreferrer"&gt;Tigera&lt;/a&gt;, the creator and maintainer of Project Calico, today announced a major expansion of its Unified Network Security Platform for Kubernetes, aimed at helping enterprises consolidate infrastructure and accelerate the migration of legacy workloads to cloud-native platforms.&lt;/p&gt;

&lt;p&gt;The new capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calico Load Balancer:&lt;/strong&gt; A high-performance, eBPF-based, software-defined load balancer that replaces expensive, rigid hardware appliances with a Kubernetes-native solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless VM-to-Kubernetes Migration:&lt;/strong&gt; Advanced Layer 2 (L2) networking support eliminates migration friction by allowing virtual machines to move into Kubernetes clusters without changing their original IP addresses or existing VLAN dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These innovations help organizations tackle the rising “complexity tax” in managing high-scale Kubernetes clusters and provide a high-velocity path to consolidate virtual machines and containers into a single, standardized platform.&lt;/p&gt;

&lt;p&gt;“The industry is at a breaking point where the operational overhead of managing legacy hardware and fragmented VM silos is no longer sustainable. By building a distributed load balancer into the fabric of Calico, and introducing live migration support to move VMs to Kubernetes, we are giving platform teams the power to innovate rather than spend hours managing and troubleshooting.”&lt;/p&gt;

&lt;p&gt;— Ratan Tipirneni, president and CEO, Tigera&lt;/p&gt;

&lt;h2&gt;
  
  
  Eliminating Hardware Bottlenecks: The Calico Load Balancer
&lt;/h2&gt;

&lt;p&gt;On-premises Kubernetes teams have traditionally relied on legacy hardware appliances to expose services, creating significant operational overhead and rigid dependencies between networking and platform teams. These external solutions often lack visibility into Kubernetes service context, do not scale horizontally, and require manual coordination for even basic software upgrades.&lt;/p&gt;

&lt;p&gt;Tigera is disrupting this model with the Calico Load Balancer, a modern, software-defined solution built natively into the Calico platform. By transforming existing cluster nodes into a distributed, session-stable load-balancing tier, platform teams gain full control over service advertisement and configuration using the same Kubernetes workflows they already use.&lt;/p&gt;

&lt;p&gt;This Kubernetes-native innovation delivers several critical advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session Persistence for Stateful Apps:&lt;/strong&gt; A high-performance, eBPF-based data plane ensures that latency-sensitive, stateful applications like Kafka or RabbitMQ maintain active connections even during node failures or changes in network paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Node Restarts:&lt;/strong&gt; Platform teams can mark nodes for maintenance and take them offline without impacting user sessions, preventing lost transactions for critical business services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Latency:&lt;/strong&gt; By enabling return traffic to take a shorter path back to the client, the solution reduces latency compared to traditional appliances where traffic must pass through the same central hardware twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Scaling:&lt;/strong&gt; The load balancer scales horizontally with the cluster; adding more nodes automatically adds more load-balancing capacity without vertical scaling limits or vendor upgrade cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Service and Declarative Control:&lt;/strong&gt; Configuration is handled through standard Kubernetes resources and GitOps workflows, removing cross-team bottlenecks and eliminating the need for tickets or separate management consoles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Technical Deep Dive: &lt;a href="https://www.tigera.io/blog/calico-load-balancer-simplifying-network-traffic-management-with-ebpf/" rel="noopener noreferrer"&gt;Simplifying network traffic management with eBPF and the Calico Load Balancer.&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Great Migration: Seamlessly Moving VMs to Kubernetes
&lt;/h2&gt;

&lt;p&gt;Historically, migrating virtual machines to Kubernetes meant a forced network redesign because VMs rely on static IP addresses and legacy Layer 2 VLAN configurations. Tigera’s new L2 networking support removes this friction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Change Migration:&lt;/strong&gt; VMs can be migrated from VMware to Kubernetes (KubeVirt) while keeping their original IP addresses, ensuring business continuity for applications with hardcoded dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Security Upgrade:&lt;/strong&gt; Once migrated, VMs are automatically protected by Calico’s microsegmentation, allowing organizations to retire costly third-party security tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once migrated, the VMs in Kubernetes benefit from Calico’s advanced network security and observability capabilities. For users familiar with technologies like VMware NSX, Calico provides NSX-like functionality, including software-defined networking, microsegmentation, a workload-based firewall, and egress gateways for VMs running in Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Step-by-Step Guide: &lt;a href="https://www.tigera.io/blog/lift-and-shift-vms-to-kubernetes-with-calico-l2-bridge-networks/" rel="noopener noreferrer"&gt;Lift and shift VMs to Kubernetes with Calico L2 bridge networks.&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One Platform for Networking, Security, and Observability
&lt;/h2&gt;

&lt;p&gt;The new Calico Unified Network Security Platform provides platform teams with a single, operator-managed solution. This allows teams to gain consistent network policy enforcement across L3-L7 layers with unified visibility, eliminating the overhead of managing multiple tools. Calico works consistently across any Kubernetes distribution, virtual machines, and bare-metal servers, ensuring enterprises can avoid vendor lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About Tigera&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/?utm_source=syndicate&amp;amp;utm_medium=press_release&amp;amp;utm_campaign=KubeCon2026" rel="noopener noreferrer"&gt;Tigera&lt;/a&gt; provides Calico, a unified network security and observability platform to prevent, detect, and mitigate security breaches in Kubernetes clusters. Tigera’s open-source offering, &lt;a href="https://www.tigera.io/tigera-products/calico?utm_source=syndicate&amp;amp;utm_medium=press_release&amp;amp;utm_campaign=KubeCon2026" rel="noopener noreferrer"&gt;Calico Open Source&lt;/a&gt;, is the most widely adopted container networking and security solution. Powering more than 100M containers across 8M+ nodes, Calico is supported across all major cloud providers and Kubernetes distributions.&lt;/p&gt;

&lt;p&gt;Media Contact&lt;br&gt;&lt;br&gt;
Media relations, Tigera&lt;br&gt;&lt;br&gt;
&lt;a href="mailto:contact@tigera.io"&gt;contact@tigera.io&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Next Steps: Get Hands-on with These Innovations
&lt;/h3&gt;

&lt;p&gt;Learn more about Calico Load Balancer and L2 networking support within the Calico ecosystem. Whether you are looking to optimize troubleshooting, reduce hardware dependency, or accelerate your VM migration, we provide the tools to get started today.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dp36elgeuxvuiact13r.png" alt="🚀" width="72" height="72"&gt; &lt;strong&gt;Experience the Platform:&lt;/strong&gt; &lt;a href="https://www.calicocloud.io/" rel="noopener noreferrer"&gt;Start a free trial of Calico Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m902pgqgnzrjghahs3o.png" alt="📅" width="72" height="72"&gt; &lt;strong&gt;Personalized Deep Dive:&lt;/strong&gt; &lt;a href="https://www.tigera.io/demo/" rel="noopener noreferrer"&gt;Request a technical demo with our engineering team&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Attending KubeCon Amsterdam Mar 23-26, 2026? Stop by the Tigera booth #400 to learn more about these features.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/tigera-news-kubecon-amsterdam-2026/" rel="noopener noreferrer"&gt;Introducing Calico Load Balancer and Seamless VM-to-Kubernetes Migration&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>companyblog</category>
      <category>featuredblog</category>
      <category>vmmigration</category>
      <category>announcements</category>
    </item>
  </channel>
</rss>
