<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Control Plane Engineering]]></title><description><![CDATA[Control Plane Engineering]]></description><link>https://controlplane-eng.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 10 Nov 2026 10:48:13 GMT</lastBuildDate><atom:link href="https://controlplane-eng.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Add a Second Cloud Provider for Failover Without Doubling Your Ops Work]]></title><description><![CDATA[Add a second cloud for failover without doubling ops: what to standardize, the ops-load table, failover triggers, and a step-by-step rollout plan.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-add-a-second-cloud-provider-for-failover-without-doubling-your-ops-work</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-add-a-second-cloud-provider-for-failover-without-doubling-your-ops-work</guid><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[AWS]]></category><category><![CDATA[SRE]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 06:50:32 GMT</pubDate><content:encoded><![CDATA[<p>You avoid doubling ops work by keeping one deployment workflow, one identity and secrets model, one observability stack, and one on-call process for both providers, and by changing only the provider-specific layer underneath. The second provider should be a target your existing pipeline deploys to, not a second stack your team runs. On Control Plane, adding a second cloud means adding a location to a Global Virtual Cloud (GVC), Control Plane’s set of locations where a workload runs, and the same workload definition runs active-active on both providers.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>What doubles and what does not.</strong> Infrastructure definitions gain a second provider module. Deployments, identity, observability, on-call, and compliance processes stay single if you standardize the operational layer. Kubernetes upgrades and networking double unless a platform takes them over.</li>
<li><strong>Warm standby vs. active-active.</strong> Warm standby is cheaper at rest but slower to recover, and a rarely used standby can fail when you need it. Active-active keeps serving capacity on both providers, with autoscaling holding it close to real traffic, and makes failover a routing change for stateless tiers with no cold start.</li>
<li><strong>The data layer.</strong> Async replication of a single primary is simplest. Distributed SQL databases such as CockroachDB or YugabyteDB can span providers when self-hosted, and need replicas in at least three failure domains to survive losing one provider. Object storage needs a sync tool, and backups restored on the other provider recover the slowest.</li>
<li><strong>Traffic routing.</strong> A global routing layer outside either provider, or health-checked DNS with low TTLs and client retries, steers traffic to healthy locations without manual intervention.</li>
<li><strong>The phased plan.</strong> Pick one critical service, containerize it, unify your pipeline and identity, replicate data, deploy to the second provider, send it traffic, drill failover and failback, and expand service by service.</li>
<li><strong>How Control Plane fits.</strong> Control Plane’s GVC lets you add a location on another provider and run the same workload definition active-active in every location from one deployment, with multi-location database templates for the data tier.</li>
</ul>
<h2>How do I add a second cloud provider for failover without doubling my ops work?</h2>
<p>Standardize the operational layer and isolate provider differences in a thin substrate. Your deployment pipeline, identity model, secrets management, observability stack, alerting rules, compliance evidence process, and on-call rotation should all be provider-agnostic. The parts that change when you add a second provider are the infrastructure modules that provision resources there and the networking that connects them.</p>
<p>When teams skip this step, they end up running two parallel stacks with two sets of dashboards, two alerting configurations, two identity systems, and two on-call rotations. That is what doubles ops work, and it is avoidable.</p>
<p>This ops work ledger compares each operational task across three approaches: two fully native stacks, shared tooling (Terraform or OpenTofu plus Kubernetes plus GitOps), and a platform that abstracts providers, described here as Control Plane implements it.</p>
<table>
<thead>
<tr>
<th>Operational task</th>
<th>Two native stacks</th>
<th>Shared tooling (IaC + Kubernetes + GitOps)</th>
<th>Platform that abstracts providers (Control Plane)</th>
</tr>
</thead>
<tbody><tr>
<td>Infrastructure definitions</td>
<td>Doubles: separate IaC per provider</td>
<td>Partially doubles: shared modules, provider-specific resources</td>
<td>Single workload definition; provider details handled by the platform</td>
</tr>
<tr>
<td>Deployments and CI/CD</td>
<td>Doubles: separate pipelines per provider</td>
<td>Stays single: one pipeline targets both clusters</td>
<td>Stays single: one deploy to multiple locations</td>
</tr>
<tr>
<td>Kubernetes clusters or runtimes to upgrade</td>
<td>Doubles: two clusters, two node pool lifecycles</td>
<td>Doubles: two clusters, two sets of node pools and upgrades</td>
<td>Removed on Control Plane-managed locations, where there is no cluster to operate; still yours only on clusters you choose to bring</td>
</tr>
<tr>
<td>Identity and secrets</td>
<td>Doubles: separate IAM policies and secret stores</td>
<td>Stays single if federated, but roles must be mapped across providers</td>
<td>Stays single: one workload identity gets short-lived credentials for each cloud, with no long-lived keys in code</td>
</tr>
<tr>
<td>Networking and private connectivity</td>
<td>Doubles: separate VPCs, peering, firewalls</td>
<td>Doubles: two networking setups, connected by VPN or mesh</td>
<td>Shrinks: public routing and service-to-service traffic across locations are handled, and private networks connect through a tunnel agent in each network instead of per-provider VPNs and peering</td>
</tr>
<tr>
<td>Observability and alerting</td>
<td>Doubles: separate dashboards and alert rules</td>
<td>Stays single if centralized in one backend</td>
<td>Stays single: logs and metrics from every location land in one built-in backend, and so do traces once tracing is enabled</td>
</tr>
<tr>
<td>Security reviews and compliance evidence</td>
<td>Doubles: separate audit trails and controls</td>
<td>Partially doubles: shared policies, provider-specific evidence</td>
<td>Fewer surfaces to review, though each provider remains in scope</td>
</tr>
<tr>
<td>On-call and incident response</td>
<td>Doubles: separate runbooks per provider</td>
<td>Stays single if runbooks are provider-agnostic</td>
<td>Stays single: one operational surface</td>
</tr>
<tr>
<td>Cost tracking</td>
<td>Doubles: separate billing consoles and commitment models</td>
<td>Partially doubles: unified dashboards, separate billing APIs</td>
<td>Shrinks: one bill for compute on platform-managed locations, across every provider</td>
</tr>
<tr>
<td>Failover testing</td>
<td>New task: cross-provider drills</td>
<td>New task: cross-provider drills</td>
<td>New task, but an active-active path carries traffic every day</td>
</tr>
</tbody></table>
<p>Even with Terraform and a GitOps controller such as Argo CD or Flux deploying to both providers, you still manage version upgrades for two Kubernetes control planes, two sets of node pools with their own upgrade cadences, and two networking setups that need separate configuration and troubleshooting. Shared tooling removes much of the duplication and leaves the infrastructure lifecycle work in place. Run the GitOps controller per cluster, or outside both providers, so deployments still work when one provider is down.</p>
<h2>How to fail over an application across cloud providers automatically</h2>
<p>Automatic cross-provider failover needs four components working together.</p>
<p><strong>Health checks that test real user journeys.</strong> Run synthetic checks from several vantage points outside both providers against the same endpoints your users hit, and fail over only when most of them agree for a sustained window. A checker inside the failing provider can go down with the workload, and a check that touches a shared database can fail both providers at once.</p>
<p><strong>A global routing layer independent of either provider.</strong> This can be a global load balancer, a DNS service with health-checked records and low TTLs, or both. The routing layer cannot live only inside the provider you are failing away from, and it is a single point of failure in its own right, so run authoritative DNS on two providers or use a routing service with its own multi-provider footprint.</p>
<p><strong>Stateless services deployed to both providers from one pipeline.</strong> When a service carries no local state, failover is a traffic routing decision. Containerized workloads with externalized configuration are the natural building block.</p>
<p><strong>A data strategy aligned to your RPO.</strong> Each approach has a different recovery point.</p>
<table>
<thead>
<tr>
<th>Approach</th>
<th>How it works</th>
<th>RPO</th>
<th>Trade-off</th>
</tr>
</thead>
<tbody><tr>
<td>Async replication of a single primary</td>
<td>The primary database on one provider streams changes to a replica on the other, which is promoted at failover</td>
<td>Sub-second to minutes of possible data loss, depending on replication lag</td>
<td>Simplest to operate; writes go to one provider; promotion must fence the old primary so it cannot keep accepting writes</td>
</tr>
<tr>
<td>Distributed SQL spanning providers</td>
<td>Self-hosted deployments of databases such as <a href="https://www.cockroachlabs.com/">CockroachDB</a> or <a href="https://docs.yugabyte.com/stable/develop/multi-cloud/multicloud-setup/">YugabyteDB</a> spread replicas across providers, and each write commits only when a majority of replicas (a Raft quorum) acknowledges it</td>
<td>Zero for the loss of one provider, provided no single provider holds a majority of replicas, which takes at least three failure domains; with two providers, losing the one that holds the majority stops writes</td>
<td>Higher write latency from cross-provider round trips; cross-cloud private networking; you operate a distributed database</td>
</tr>
<tr>
<td>Object storage replication with a sync tool</td>
<td>A tool copies objects between buckets on each provider, on events or on a schedule</td>
<td>Seconds to hours, depending on whether sync is event-driven or scheduled</td>
<td>Fits static assets and backups; not suitable for transactional data</td>
</tr>
<tr>
<td>Backups restored on the other provider</td>
<td>Periodic backups stored on the second provider are restored to a new database at failover</td>
<td>Up to the backup interval; restore time adds to RTO, often hours for large databases</td>
<td>Lowest ongoing cost; slowest recovery; suits non-critical workloads</td>
</tr>
</tbody></table>
<p>Automated promotion needs a tiebreaker outside both providers, such as a witness or consensus store in a third location, so a partition between providers does not produce two primaries. The source provider bills cross-provider replication as egress, at lower per-GB rates over a dedicated or cross-cloud interconnect, so price your write and change volume before choosing a design. Replication also copies corruption and accidental deletes to the other provider, so keep point-in-time backups alongside any replication method.</p>
<p>Many teams combine approaches: a replicated primary or distributed SQL for transactional data, and object sync for media and assets. For routing and database patterns in more depth, see <a href="https://controlplane.com/blog/post/run-app-across-multiple-regions-routing-databases-failover?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">running an app across multiple regions with routing, databases, and failover</a>.</p>
<h2>Warm standby or active-active across providers?</h2>
<p>The choice depends on your RTO and RPO targets, budget, team size, and data model.</p>
<p><strong>Warm standby</strong> keeps a scaled-down copy of the application on the second provider. At failover you scale up compute, promote database replicas, and switch traffic. It costs less in normal operation, but recovery takes minutes to tens of minutes, and the scale-up can fail if the second provider lacks capacity or the environment has drifted from production.</p>
<p><strong>Active-active across providers</strong> serves real traffic from both providers continuously. Every deployment exercises both environments, failover for stateless services is a routing change, and the second provider is never cold. It needs continuous serving capacity, headroom and raised quotas on each provider to absorb the other’s full load, and a data strategy that supports reads or writes in more than one location.</p>
<p>The underrated risk of warm standby is that a rarely used environment fails when you need it. Configuration drifts, capacity reservations lapse, and certificates renew on the primary but not on the standby. Teams that choose warm standby have to drill often to keep it viable. For a cost comparison, see <a href="https://controlplane.com/blog/post/active-active-vs-active-passive-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">active-active vs. active-passive cost</a>.</p>
<p>A middle path is to run staging, batch jobs, or internal tools on the second provider, so it carries real load without serving production users and stays tested at limited cost.</p>
<h2>How do I reduce the blast radius of a cloud provider outage?</h2>
<p>Failover is only as strong as its weakest shared dependency.</p>
<ul>
<li><strong>Map every dependency.</strong> Include DNS, the CDN and WAF, your identity provider, CI/CD, the secrets manager, the container registry, the observability backend, the status page, and third-party APIs such as payments, email, and authentication. Any of them living only on the failing provider stalls failover.</li>
<li><strong>Keep single-provider global control planes out of the failover path.</strong> A deployment tool, secrets vault, or service mesh control plane that runs on one provider becomes a bottleneck during that provider’s outage.</li>
<li><strong>Push container images to registries on both providers</strong> as part of CI, so you can deploy and scale on the second provider while the first is down.</li>
<li><strong>Replicate secrets and certificates to both providers, and rotate them in both.</strong> A rotation that reaches only one side breaks the other at failover, and if you publish CAA records, they must list every CA that issues your certificates.</li>
<li><strong>Isolate by cell or tenant.</strong> Partitioning the application keeps a failure in one cell from reaching every user.</li>
<li><strong>Use feature flags to degrade non-critical features</strong> when a dependency is unavailable, so core functions keep working.</li>
<li><strong>Monitor from outside the affected provider,</strong> so alerting still works when that provider is down.</li>
<li><strong>Keep DNS TTLs short and pair them with client retries.</strong> Failover still takes detection time plus TTL, some resolvers and runtimes cache past the TTL, and keep-alive, gRPC, and WebSocket connections stay on the old endpoint until they fail. Anycast global load balancing moves traffic faster than DNS changes.</li>
<li><strong>Run game days that simulate provider-level failures,</strong> then fix what breaks. See <a href="https://controlplane.com/blog/post/test-failover-without-taking-production-down?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">how to test failover without taking production down</a> and, for AWS-specific steps, <a href="https://controlplane.com/blog/post/keep-app-online-aws-region-outage?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">keeping your app online when an AWS region goes down</a>.</li>
</ul>
<h2>Is multi-cloud a real solution to vendor lock-in?</h2>
<p>Multi-cloud for failover reduces your dependence on one provider’s availability. Whether it reduces lock-in depends on how you build.</p>
<p>Workloads in containers that use open-source databases and standard protocols such as HTTP, gRPC, and SQL are portable. Moving their compute between providers is mostly configuration, while moving their data still takes migration time and egress cost. Workloads built deeply on provider-managed services, such as proprietary serverless functions, managed queues, or specialized AI APIs, stay locked in on each provider, and running on two providers can mean two sets of lock-in to maintain.</p>
<p>The practical approach is to use provider-specific services where they deliver clear value, isolate them behind application interfaces, and build the failover path on the portable layer. For a deeper analysis, see <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">managed services vs. portability and cloud lock-in</a>.</p>
<h2>A phased plan for adding a second cloud provider</h2>
<ol>
<li><strong>Pick one critical service and set RTO and RPO.</strong> Choose a service that matters enough to justify the work and is simple enough to succeed with first.</li>
<li><strong>Containerize it and make it stateless.</strong> Externalize session state, configuration, and secrets.</li>
<li><strong>Unify the pipeline, identity, secrets, and observability.</strong> One CI/CD pipeline deploys to both providers, one identity model governs access, one replicated secrets store provides credentials, and one backend, hosted outside either provider or on both, collects logs, metrics, and traces.</li>
<li><strong>Replicate data.</strong> Pick an approach from the data table, set up the replica on the second provider, and confirm replication lag meets your RPO.</li>
<li><strong>Deploy to the second provider and send it traffic.</strong> Real traffic is better than an idle standby because it validates the environment continuously.</li>
<li><strong>Drill failover and failback.</strong> Simulate a provider outage, measure the RTO and RPO you actually achieve, and fix every gap. Make failback a planned manual step: rebuild the old primary as a replica of the promoted one, let it catch up, then move traffic back in a scheduled window.</li>
<li><strong>Expand service by service,</strong> in order of business criticality. Each iteration is faster because the shared operational layer is in place.</li>
</ol>
<h3>How do I know ops work did not double?</h3>
<p>Track these before and after adding the second provider:</p>
<ul>
<li><strong>Engineer hours per release.</strong> A big jump means the pipeline is not unified.</li>
<li><strong>Number of pipelines.</strong> One per service, regardless of provider count.</li>
<li><strong>Alert volume per provider.</strong> It should follow traffic. A spike from the second provider signals drift.</li>
<li><strong>On-call pages per provider.</strong> A new class of incidents from the second provider means the environments are diverging.</li>
<li><strong>Drill RTO and RPO achieved.</strong> Stable or improving numbers show the failover design is maturing.</li>
<li><strong>Configuration drift.</strong> Growing differences between the two environments predict future ops burden.</li>
</ul>
<h2>How Control Plane fits</h2>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes (MK8s), which runs Kubernetes nodes in your own cloud account or on your own servers, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds.</p>
<p>For example, a GVC can hold a GCP region next to an AWS region. A workload deployed to a GVC runs active-active in every location of that GVC from one definition, and a global endpoint routes clients to the nearest healthy location, so failover is a routing change with no standby to start. For a walkthrough, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">how to run the same app on AWS, GCP, and Azure</a>.</p>
<p>On Control Plane-managed locations in AWS, GCP, Azure, and Oracle Cloud regions, there is no Kubernetes cluster to operate, which removes the cluster-upgrade row of the ledger for those locations.</p>
<p>Control Plane handles Day 2 operations for you, including autoscaling, built-in observability, and security. The CLI, console, Terraform and Pulumi providers, and the Control Plane MCP server all work through the same Control Plane API and cover every location. Control Plane ships its own Terraform and Pulumi providers, so it complements the infrastructure as code you already run. Control Plane’s Universal Cloud Identity (UCI) lets workloads in any location call AWS, GCP, and Azure services with no long-lived cloud keys in your code.</p>
<p>Control Plane covers the data layer too. Control Plane’s Template Catalog, a library of preconfigured stacks you install into a GVC, includes multi-location PostgreSQL and CockroachDB templates whose members span the locations of a GVC, so the database spans providers along with the application. Multi-location PostgreSQL keeps one primary with asynchronous replicas. With three or more locations, it promotes a replica in a surviving location automatically. With two locations, the surviving replica stays read-only until you promote it. CockroachDB with three or more locations keeps serving reads and writes through the loss of one location. To survive the loss of a whole provider with either template, spread at least three locations across three providers, so no provider holds a majority. You pick the template that matches your RPO and drill failover on a schedule.</p>
<p>During the October 20, 2025 AWS us-east-1 outage, Control Plane customers with us-east-1 in their GVC had workloads active and running in healthy locations within 10 seconds, with no customer downtime, according to Control Plane’s internal incident telemetry (<a href="https://controlplane.com/blog/post/beyond-backups-designing-systems-that-survive-the-inevitable?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">how that failover worked</a>). For outage trends, see the <a href="https://controlplane.com/blog/post/cloud-outage-report-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">2026 cloud outage report</a>.</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations, and those locations can be on different providers. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. You pay for the CPU and memory a workload reserves, with no contracts or minimums. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<h2>FAQ</h2>
<p>Answers to the questions engineering leaders ask most before adding a second provider.</p>
<h3>Do I need Kubernetes on both clouds to fail over between them?</h3>
<p>No. Kubernetes on each provider gives a consistent runtime at the cost of operating two clusters. On Control Plane-managed locations, the same workload runs on AWS, GCP, Azure, and Oracle Cloud with no cluster to manage. Teams that want Kubernetes can still use Control Plane’s Managed Kubernetes or add clusters they already run as locations.</p>
<h3>What is the hardest part of multi-cloud failover?</h3>
<p>The data layer. Stateless services move easily between providers, while stateful services need replication, fencing, and tested promotion. Most teams underestimate how hard it is to prove the replication strategy meets the RPO under real failure conditions.</p>
<h3>How much does adding a second cloud for failover cost?</h3>
<p>Warm standby costs the least at rest, active-active costs more but recovers fastest, and cross-provider data transfer adds cost to both. Warm standby keeps a scaled-down copy, so recovery is slower. Active-active runs both providers at full readiness, so recovery is a routing change. On Control Plane, active-active runs without paying for idle standby capacity, because every location serves real traffic and scales with it.</p>
<h3>Can I fail over between clouds without a second operations team?</h3>
<p>Yes. One pipeline, one identity model, one observability stack, and one on-call rotation can cover both providers. If the second provider needs its own team, the operational layer has not been standardized.</p>
<h3>How do I test multi-cloud failover without affecting production users?</h3>
<p>Send a small share of traffic to the second provider, validate it with synthetic checks, and simulate failures by blocking the primary provider’s endpoints in a controlled window. On Control Plane, a workload can be suspended in one location while others keep serving, which turns a drill into a configuration change.</p>
<h3>How long does it take to add a second cloud provider?</h3>
<p>For a stateless service with a unified pipeline already in place, days to weeks. For a stateful service with demanding replication requirements, weeks to months. The phased plan delivers value one service at a time.</p>
<h3>What happens to compliance when I add a second provider?</h3>
<p>Each provider adds its own audit surface, configuration baselines, and evidence. Standardizing policies, logging, and access across both keeps the work from doubling, but both providers stay in scope for your audits.</p>
<h3>Is multi-cloud failover worth it if my primary provider has multi-region redundancy?</h3>
<p>Yes, if you need to stay up through a provider-wide incident or a failure in a provider’s global services. Multi-region within one provider covers regional failures only.</p>
<p>To add a second cloud without a second operations team, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/add-second-cloud-provider-failover-without-doubling-ops?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=add-second-cloud-provider-failover-without-doubling-ops">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[What It Costs to Run AI Agents in Production: A Worked Cost Model for Tokens, Sandboxes, Storage, and Networking]]></title><description><![CDATA[A worked cost model for AI agents in production: tokens, prompt caching, sandboxes, NAT, and storage at 300,000 tasks a month, plus how to cut cost.]]></description><link>https://controlplane-eng.hashnode.dev/what-it-costs-to-run-ai-agents-in-production-a-worked-cost-model-for-tokens-sandboxes-storage-and-networking</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/what-it-costs-to-run-ai-agents-in-production-a-worked-cost-model-for-tokens-sandboxes-storage-and-networking</guid><category><![CDATA[AI]]></category><category><![CDATA[agents]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[finops]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 06:48:37 GMT</pubDate><content:encoded><![CDATA[<p>In production, an AI agent’s cost is model tokens plus the infrastructure around them (orchestration services, code-execution sandboxes, networking, storage, and observability), and at moderate scale tokens usually dominate, so prompt caching, model choice, and call count matter more than compute. In the worked model in this guide, 300,000 tasks a month cost about $21,919, of which model tokens are about 96 percent. Control Plane is a platform that runs agent services and their code-execution steps with autoscaling, scale to zero, and billing for the CPU and memory a workload reserves.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Every input in the model is stated so you can swap in your own numbers.</p>
<ul>
<li><strong>Cost formula.</strong> Tasks × calls per task × tokens per call × token price, plus infrastructure (compute, networking, storage, observability).</li>
<li><strong>Worked result.</strong> 300,000 tasks a month at 8 model calls each costs about $21,919, or $0.073 per task, at list prices.</li>
<li><strong>Biggest levers.</strong> Prompt caching cut the token bill 45 percent. Routing simple steps to a smaller model, fewer calls per task, and shorter outputs come next.</li>
<li><strong>Infrastructure.</strong> Sandboxes, always-on orchestration replicas, NAT gateways, and trace storage came to about $799 a month, or $0.0027 per task.</li>
<li><strong>Control Plane</strong> runs agent services and their code-execution steps on AWS, GCP, and Azure with autoscaling and scale to zero, and, where enabled, Control Plane’s Capacity AI adjusts a workload’s reserved CPU and memory between set minimums and maximums based on historical usage.</li>
</ul>
<h2>What does it cost to run AI agent workloads in production?</h2>
<p>Monthly cost splits into token spend and infrastructure spend.</p>
<p>Token spend depends on four variables: tasks, model calls per task, tokens per call (input and output), and price per token. Agents run multi-step loops that resend accumulated context, so they use far more tokens per task than a single-turn chatbot.</p>
<p>Infrastructure spend covers the orchestration services that run the agent loop, sandboxes that execute model-generated code, NAT gateways that carry traffic to model APIs, and storage for traces and logs.</p>
<p><strong>Monthly cost = token cost across all calls + sandbox compute + orchestration compute + networking + storage</strong></p>
<h3>Worked model: 300,000 tasks per month</h3>
<p>This is an illustrative scenario at list prices checked in November 2026. Check current pricing before you budget.</p>
<p><strong>Assumptions</strong></p>
<ul>
<li>10,000 agent tasks per day, 300,000 per month.</li>
<li>Each task makes 8 model calls.</li>
<li>Each call sends 6,000 input tokens, of which 4,500 are a repeated prefix (system prompt, tool definitions, context) that is cached, and returns 400 output tokens. Input is held flat for simplicity; real loops grow context with each step, which raises cost, and token counts differ by model tokenizer.</li>
<li>The first call in each task writes the cache and the other 7 read it, assuming calls are less than 5 minutes apart (each hit refreshes the 5-minute cache lifetime). A long sandbox run between calls can force a new write. If the prefix is identical across tasks and traffic is steady, most first calls also hit the cache, so this assumption is conservative.</li>
<li>Model: Claude Sonnet 5.5 at list prices of $2 per million input tokens, $10 per million output tokens, $2.50 per million tokens for 5-minute cache writes, and $0.10 per million for cache reads (<a href="https://platform.claude.com/docs/en/about-claude/pricing">Claude pricing</a>, <a href="https://platform.claude.com/docs/en/build-with-claude/prompt-caching">prompt caching</a>).</li>
</ul>
<table>
<thead>
<tr>
<th>Line item</th>
<th>Tokens per month</th>
<th>Price per million tokens</th>
<th>Monthly cost</th>
</tr>
</thead>
<tbody><tr>
<td>Uncached input</td>
<td>3.6 billion</td>
<td>$2.00</td>
<td>$7,200.00</td>
</tr>
<tr>
<td>Cache reads</td>
<td>9.45 billion</td>
<td>$0.10</td>
<td>$945.00</td>
</tr>
<tr>
<td>Cache writes</td>
<td>1.35 billion</td>
<td>$2.50</td>
<td>$3,375.00</td>
</tr>
<tr>
<td>Output</td>
<td>0.96 billion</td>
<td>$10.00</td>
<td>$9,600.00</td>
</tr>
<tr>
<td><strong>Token total</strong></td>
<td></td>
<td></td>
<td><strong>$21,120.00</strong></td>
</tr>
</tbody></table>
<p>Without caching, all 14.4 billion input tokens bill at $2 per million ($28,800), plus $9,600 of output, for $38,400. Caching cuts the token bill 45 percent.</p>
<p>Prices are AWS us-east-1 on-demand list prices, applied to both regions in the model: <a href="https://aws.amazon.com/fargate/pricing/">AWS Fargate</a> (Linux/x86) at $0.04048 per vCPU-hour and $0.004445 per GB-hour, <a href="https://aws.amazon.com/vpc/pricing/">NAT gateways</a> at $0.045 per hour and $0.045 per GB processed, and <a href="https://aws.amazon.com/s3/pricing/">Amazon S3 Standard</a> at $0.023 per GB-month.</p>
<table>
<thead>
<tr>
<th>Line item</th>
<th>Sizing</th>
<th>Monthly cost</th>
</tr>
</thead>
<tbody><tr>
<td>Code-execution sandboxes</td>
<td>30% of tasks run code for 3 minutes on 2 vCPU and 4 GB = 4,500 sandbox-hours</td>
<td>$444.33</td>
</tr>
<tr>
<td>Agent orchestration service</td>
<td>3 replicas of 1 vCPU and 2 GB, always on, in each of 2 regions (6 replicas × 730 hours)</td>
<td>$216.24</td>
</tr>
<tr>
<td>NAT gateways</td>
<td>One per availability zone, 2 zones in each of 2 regions (4 gateways × 730 hours)</td>
<td>$131.40</td>
</tr>
<tr>
<td>NAT data processing</td>
<td>About 57.6 GB of model API request traffic (about 24 KB per call; responses add little)</td>
<td>$2.59</td>
</tr>
<tr>
<td>Trace and log storage</td>
<td>50 KB per task = 15 GB a month, kept 12 months = 180 GB at steady state</td>
<td>$4.14</td>
</tr>
<tr>
<td><strong>Infrastructure total</strong></td>
<td></td>
<td><strong>$798.70</strong></td>
</tr>
</tbody></table>
<p>Sandbox hours count execution time only. Fargate bills per second with a one-minute minimum from the start of the image pull, so startup time, warm pools held for latency, and peak concurrency above the average all add cost.</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Value</th>
</tr>
</thead>
<tbody><tr>
<td>Monthly total</td>
<td>About $21,918.70</td>
</tr>
<tr>
<td>Cost per task</td>
<td>About $0.073</td>
</tr>
<tr>
<td>Token share of total</td>
<td>96.4%</td>
</tr>
<tr>
<td>Infrastructure per task</td>
<td>About $0.0027</td>
</tr>
</tbody></table>
<p>The model deliberately leaves out databases, vector stores and embedding calls, observability or tracing subscriptions, load balancers, internet egress to end users, engineering time, and taxes, because they vary too much by architecture to price generically. The storage line prices S3 at rest only; log and trace ingestion and indexing are billed separately and often cost more than storage.</p>
<p><strong>What the model shows</strong></p>
<ul>
<li>Tokens dominate at this scale.</li>
<li>Caching the repeated prefix is the single largest saving.</li>
<li>Output tokens cost 5 times input tokens, so verbose outputs are expensive.</li>
<li>Each model call removed from a task cuts cost roughly in proportion.</li>
<li>Sandbox cost scales with execution minutes, so idle sandboxes should sleep.</li>
<li>Always-on replicas and NAT gateways are fixed costs, so at much lower task volumes their share of the bill rises.</li>
</ul>
<h2>How do I estimate costs for AI agent infrastructure including sandbox execution, storage, and networking at scale?</h2>
<p>Build the estimate from measured traces wherever you can, in seven steps:</p>
<ol>
<li><strong>Measure tokens per call and calls per task.</strong> Pull input and output token counts from your provider’s usage data or trace spans, then multiply by projected task volume. Re-count tokens with the target model before switching, because tokenizers differ.</li>
<li><strong>Separate cached from uncached input.</strong> Identify the stable prefix (system prompt, tool schemas, shared context) and count how many calls per task read the cache and how many write it.</li>
<li><strong>Size sandboxes by execution minutes.</strong> Estimate the share of tasks that run code, how long each run lasts, and the CPU and memory each sandbox needs.</li>
<li><strong>Count always-on replicas and regions.</strong> Multiply replicas by their CPU and memory, by hours per month, and by the number of regions.</li>
<li><strong>Add networking.</strong> NAT gateways charge per hour and per GB processed; add internet egress and cross-zone traffic between orchestration, sandboxes, and databases.</li>
<li><strong>Add storage retention.</strong> Multiply per-task trace and output size by monthly volume and by the retention period to get steady-state storage.</li>
<li><strong>Add a margin for retries and failed tasks.</strong> Size it from your observed failure and retry rates, since agents can retry steps or loop, and plan for provider rate limits, which can force higher usage tiers or queueing at peak.</li>
</ol>
<table>
<thead>
<tr>
<th>Line item</th>
<th>What drives cost</th>
<th>How to measure</th>
</tr>
</thead>
<tbody><tr>
<td>Model tokens</td>
<td>Calls per task, tokens per call, model price</td>
<td>Trace spans, provider usage data</td>
</tr>
<tr>
<td>Prompt caching</td>
<td>Prefix size, cache hit rate</td>
<td>Cache read and write token counts per call</td>
</tr>
<tr>
<td>Sandbox compute</td>
<td>Execution minutes, vCPU and memory, share of tasks</td>
<td>Sandbox runtime logs</td>
</tr>
<tr>
<td>Orchestration compute</td>
<td>Replicas, CPU and memory, regions</td>
<td>Deployment configuration</td>
</tr>
<tr>
<td>NAT and networking</td>
<td>Gateway hours, GB processed, cross-zone and egress traffic</td>
<td>VPC flow logs, billing reports</td>
</tr>
<tr>
<td>Storage</td>
<td>Per-task data size, retention</td>
<td>Log volume metrics</td>
</tr>
<tr>
<td>Retries</td>
<td>Failure rate, retry depth</td>
<td>Error-rate dashboards</td>
</tr>
</tbody></table>
<h2>How do I cut AI agent costs?</h2>
<p>Roughly ordered by typical impact; items 1 and 3 are calculated in the worked model.</p>
<ol>
<li><strong>Prompt caching.</strong> Keep the cacheable prefix stable across calls within a task so later calls hit the cache.</li>
<li><strong>Route simple steps to a smaller model.</strong> Parsing, extraction, and formatting steps rarely need a frontier model; reserve the larger model for planning and hard reasoning.</li>
<li><strong>Make fewer calls per task.</strong> In the worked model, going from 8 calls to 6 cuts the token bill about 21 percent. Combine steps and detect completion early.</li>
<li><strong>Shorten outputs.</strong> At $10 per million output tokens against $2 for input, concise and structured outputs save money on every call.</li>
<li><strong>Batch non-interactive work.</strong> Anthropic’s <a href="https://platform.claude.com/docs/en/build-with-claude/batch-processing">Message Batches API</a> costs 50 percent less than standard API calls, which suits nightly processing, evaluations, and bulk classification.</li>
<li><strong>Let idle sandboxes sleep.</strong> Stop or sleep environments between tasks.</li>
<li><strong>Right-size reservations.</strong> Match always-on replicas to measured load with autoscaling and right-sizing.</li>
<li><strong>Avoid NAT processing charges where possible.</strong> For model APIs reachable through private endpoints, such as Amazon Bedrock over AWS PrivateLink interface endpoints, traffic skips NAT gateway processing, though the endpoints carry their own hourly and per-GB charges. The charge was small in the worked model and grows with data volume.</li>
</ol>
<h2>How much does setting up a production grade LangChain stack cost?</h2>
<p>The open-source LangChain and LangGraph libraries are free under the MIT license, so production cost comes from what surrounds them: model tokens, hosting, a database or vector store, and observability.</p>
<ul>
<li><strong>Model tokens</strong> remain the largest line item; the framework does not change per-token prices.</li>
<li><strong>Hosting</strong> for the agent service and its workers, with autoscaling, availability, and security, drives compute cost.</li>
<li><strong>Databases and vector stores</strong> depend on corpus size, embedding model, and query volume.</li>
<li><strong>Observability and evaluation.</strong> LangSmith, LangChain’s tracing and evaluation product, has a free tier and paid plans; see <a href="https://www.langchain.com/pricing">LangSmith pricing</a> for current plans and limits.</li>
</ul>
<p>At the volume in the worked model, a LangChain stack faces the same token bill as any other framework, plus hosting and tooling costs set by your architecture.</p>
<h2>What infrastructure do I need to run AI agents securely at scale?</h2>
<p>A secure production setup includes:</p>
<ul>
<li><strong>Isolated sandboxes for model-generated code,</strong> ideally with microVM isolation, so generated code cannot escape to the host or other workloads. See <a href="https://controlplane.com/blog/post/best-ai-agent-sandboxes-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">the best AI agent sandboxes in 2026</a>.</li>
<li><strong>Per-agent identity and least privilege,</strong> scoped to the services each agent needs.</li>
<li><strong>Short-lived credentials</strong> through identity federation instead of static API keys.</li>
<li><strong>Network egress controls</strong> that restrict which endpoints an agent can reach.</li>
<li><strong>Audit logs</strong> of every action an agent takes.</li>
<li><strong>Human approval</strong> for destructive or irreversible actions.</li>
<li><strong>Autoscaling and multiple regions</strong> for availability under spikes and regional outages.</li>
</ul>
<p>For the full checklist, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">how to let AI agents operate production infrastructure safely</a>, and for why agent work should leave local machines, <a href="https://controlplane.com/blog/post/stop-running-ai-agents-on-developer-laptops?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">stop running AI agents on developer laptops</a>.</p>
<h2>Which platform gives the lowest cost for always-on production workloads?</h2>
<p>The cheapest platform depends on your load pattern. Compare platforms on these factors:</p>
<ul>
<li><strong>Billing granularity.</strong> Platforms bill provisioned instances, reserved CPU and memory, or per-request consumption at different granularities; unused reservation is waste unless right-sizing closes the gap.</li>
<li><strong>Right-sizing.</strong> Automatic adjustment of CPU and memory reservations to observed usage prevents chronic over-provisioning.</li>
<li><strong>Commitments vs. on-demand.</strong> Reserved instances and savings plans lower unit prices in exchange for a term commitment; on-demand keeps flexibility at a higher rate.</li>
<li><strong>Scale to zero.</strong> Services idle for hours, including staging and low-traffic agent endpoints, should cost little or nothing in compute while idle.</li>
<li><strong>Networking and egress fees.</strong> NAT, cross-region transfer, and internet egress pricing differ by provider and grow with data volume.</li>
<li><strong>Multi-region duplication.</strong> Running in two regions roughly doubles always-on capacity, so per-unit price and right-sizing matter more.</li>
</ul>
<p>Compare total cost across all of these factors.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. Each workload runs across a Control Plane Global Virtual Cloud (GVC), a named set of locations across one or more clouds.</p>
<ul>
<li><strong>Billing.</strong> You pay for the CPU and memory a workload reserves, with no contracts or minimums, and, where enabled, Capacity AI adjusts the reservation between set minimums and maximums based on historical usage. Egress, storage, observability, dedicated load balancers, and GPUs are billed separately, and Capacity AI does not apply to GPU workloads or to workloads that autoscale on CPU utilization or multiple metrics.</li>
<li><strong>Scale to zero.</strong> Serverless workloads scale to zero natively; standard and stateful workloads can scale to zero through KEDA, enabled per GVC.</li>
<li><strong>Sandboxes.</strong> Control Plane Sandboxes give coding agents dedicated environments, sized from 2 to 16 or more CPUs, that sleep when idle and spin back up in under one second. Sandboxes are for building and running agent code during development; production agent services, including their code-execution steps, run as Control Plane workloads. Each workload is isolated with cgroups, namespaces, and restricted syscalls and capabilities, and Sandboxes run in dedicated Kata Containers microVMs.</li>
<li><strong>Cloud access without stored keys.</strong> Control Plane’s Universal Cloud Identity (UCI) lets a workload call AWS, GCP, and Azure services, such as Amazon Bedrock or Google’s Gemini Enterprise Agent Platform (formerly Vertex AI), through an IAM role or service-account grant instead of long-lived keys in your code, with short-lived, least-privilege credentials at runtime.</li>
<li><strong>Operations.</strong> Built-in logs, metrics, and traces, and Control Plane’s MCP server, which lets AI assistants operate Control Plane resources with the signed-in user’s permissions. A Cost &amp; Usage view, a billing_viewer role, and a monthly spend alert for billing admins track spend.</li>
<li><strong>Availability.</strong> The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Agent services spread across locations keep running when a zone, region, or provider fails.</li>
</ul>
<p>Control Plane handles Day 2 operations for you, including autoscaling, built-in observability, and security. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure; that applies to the compute share of agent costs, while model tokens are billed by the model provider. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. For how training, inference, and agents fit together, see <a href="https://controlplane.com/blog/post/ai-infrastructure-training-inference-agents?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">AI infrastructure in 2026</a>.</p>
<h2>FAQ</h2>
<p>Short answers on AI agent production costs.</p>
<h3>What does it cost to run AI agent workloads in production?</h3>
<p>It depends on task volume, calls per task, tokens per call, and model price. In the worked model, 300,000 tasks a month on Claude Sonnet 5.5 cost about $21,919: $21,120 in tokens and $799 in infrastructure.</p>
<h3>How do I estimate costs for AI agent infrastructure including sandbox execution, storage, and networking at scale?</h3>
<p>Measure tokens and calls from traces, split cached from uncached input, size sandboxes by execution minutes, count always-on replicas per region, then add NAT, egress, storage retention, and a retry margin.</p>
<h3>How much does setting up a production grade LangChain stack cost?</h3>
<p>The LangChain and LangGraph libraries are free under the MIT license; you pay for model tokens, hosting, a database or vector store, and observability such as LangSmith’s paid plans.</p>
<h3>What infrastructure do I need to run AI agents securely at scale?</h3>
<p>Isolated sandboxes for generated code, per-agent identity with least privilege, short-lived credentials, egress controls, audit logs, human approval for destructive actions, and autoscaling across regions.</p>
<h3>Which platform gives the lowest cost for always-on production workloads?</h3>
<p>It depends on load pattern. Compare billing granularity, right-sizing, commitment discounts, scale to zero, networking fees, and multi-region duplication.</p>
<h3>What share of AI agent costs is tokens versus infrastructure?</h3>
<p>Tokens dominate at moderate scale: 96.4 percent in the worked model. At low volume, fixed costs such as always-on replicas and NAT gateways take a larger share.</p>
<h3>How much does prompt caching save?</h3>
<p>In the worked model, caching the 4,500-token prefix cut the token bill from $38,400 to $21,120, or 45 percent.</p>
<h3>Why are output tokens so expensive for agents?</h3>
<p>Output costs 5 times input in the worked model ($10 versus $2 per million), and every call in every task pays it, so concise outputs save money quickly.</p>
<h3>Does batch processing reduce agent costs?</h3>
<p>Yes, for work that can wait. Anthropic’s Message Batches API costs 50 percent less than standard calls.</p>
<h3>How do always-on costs affect agent economics at low volume?</h3>
<p>They dominate it. The $347.64 of orchestration and NAT gateway hours in the worked model stays roughly the same at 1,000 tasks a month, so per-task infrastructure cost rises sharply unless idle orchestration services scale to zero and gateway count shrinks.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to run agent services with autoscaling and scale to zero.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/cost-to-run-ai-agents-production-worked-model?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=cost-to-run-ai-agents-production-worked-model">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Choose an AI Model Inference Service: Managed APIs vs ML Endpoints vs Serverless GPUs vs Self-Hosted Serving]]></title><description><![CDATA[Choose an AI inference service by model type, traffic, latency, and data control: managed APIs, ML endpoints, serverless GPUs, or self-hosted serving.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-choose-an-ai-model-inference-service-managed-apis-vs-ml-endpoints-vs-serverless-gpus-vs-self-hosted-serving</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-choose-an-ai-model-inference-service-managed-apis-vs-ml-endpoints-vs-serverless-gpus-vs-self-hosted-serving</guid><category><![CDATA[AI]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[llm]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 02:51:01 GMT</pubDate><content:encoded><![CDATA[<p>Choose an inference deployment option by model type (proprietary vs open-weight), traffic shape, latency target, model features, data control requirements, and cost model. Managed model APIs are the fastest way to start, managed ML endpoints and serverless GPU services trade some control for convenience, and self-hosted serving on containers gives the most control over cost, data residency, and portability. Control Plane runs containerized model servers on AWS, GCP, and Azure regions and on your own GPU clusters, with built-in NVIDIA GPUs on Control Plane-managed locations that offer them and no Kubernetes cluster to operate on those locations.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p><strong>Five deployment options:</strong></p>
<ul>
<li>Managed model APIs: Amazon Bedrock, Google Gemini Enterprise Agent Platform (formerly Vertex AI), Microsoft Foundry (formerly Azure AI Foundry), and model providers’ own APIs</li>
<li>Managed ML endpoints (Amazon SageMaker AI endpoints, Gemini Enterprise Agent Platform endpoints, Azure Machine Learning online endpoints)</li>
<li>Serverless GPU inference services</li>
<li>Self-hosted serving on containers or Kubernetes: vLLM, NVIDIA Dynamo-Triton (formerly Triton Inference Server), or KServe as the Kubernetes serving layer</li>
<li>A platform layer that runs your model containers across clouds, such as Control Plane</li>
</ul>
<p><strong>Decision factors:</strong></p>
<ul>
<li>Model type: a proprietary API model or an open-weight model</li>
<li>Traffic shape: steady, bursty, or batch</li>
<li>Latency target: interactive or offline</li>
<li>Model features: structured output, tool calling, context length, and fine-tuned adapters</li>
<li>Data control and residency: where prompts and completions are processed</li>
<li>Cost model: per token, per GPU-hour, or reserved capacity</li>
<li>Team skills: the operations experience you have to run what you choose</li>
</ul>
<p><strong>Top inference challenges:</strong> latency, GPU cost from low utilization, cold starts, autoscaling on the wrong signal, provider rate limits and outages, GPU capacity, data privacy, observability gaps, and multi-region availability.</p>
<p><strong>Containers vs managed platforms:</strong> Running model servers in your own containers gives you full control over the runtime, weights, and optimizations. A platform layer removes the work of operating Kubernetes clusters, autoscaling, and multi-cloud networking while keeping that container-level control.</p>
<p><strong>How Control Plane fits:</strong> Control Plane runs containerized model servers such as <a href="https://docs.vllm.ai/">vLLM</a> as workloads, on Control Plane-managed locations in AWS, GCP, and Azure regions or on GPU clusters you add as locations, and handles Day 2 operations for you, including autoscaling, built-in observability, and security.</p>
<h2>How do I choose an AI model inference service for my application?</h2>
<p>Start with these seven factors.</p>
<h3>Model type</h3>
<p>If you need a proprietary model from a provider such as OpenAI, Anthropic, or Google, you call it through a managed model API. If you run an open-weight model such as Llama, Mistral, or Qwen, you can call it per token through a managed API that hosts it, deploy it to a managed ML endpoint, or serve it yourself. Open-weight models give you portability and the ability to fine-tune, quantize, and change versions on your schedule.</p>
<h3>Traffic shape</h3>
<p>Steady, predictable traffic favors reserved or dedicated compute where GPU utilization stays high. Bursty traffic benefits from services that scale elastically and avoid paying for idle GPUs. Batch workloads, such as nightly embedding jobs, can run on spot or preemptible GPUs and tolerate queuing.</p>
<h3>Latency target</h3>
<p>Interactive applications such as chat, code completion, and retrieval-augmented search need a short time to first token and steady token output. Dedicated endpoints and self-hosted serving give the most predictable p99 latency. Offline workloads such as summarization pipelines or evaluation runs can tolerate cold starts and queuing.</p>
<h3>Model features</h3>
<p>List the features your application depends on before you pick a service. Structured output and tool calling vary by API and model, and self-hosted servers such as vLLM enforce JSON schemas through structured outputs (guided decoding). Context length sets KV cache memory, so long contexts need much more GPU memory per request than short ones. Serving many fine-tuned variants is cheapest as LoRA adapters on one base model, which vLLM can serve together on one GPU. Applications that call several models need a routing layer, such as an LLM gateway, for fallback and cost-based routing.</p>
<h3>Data control and residency</h3>
<p>Regulated industries and privacy-sensitive applications often require that prompts and completions stay in a specific region or in the organization’s own environment. Self-hosted serving and managed ML endpoints with private networking can meet these requirements. Managed model APIs process data on the provider’s infrastructure. Hyperscaler APIs such as Bedrock, Gemini Enterprise Agent Platform, and Microsoft Foundry offer regional processing and private connectivity, and retention terms vary by provider and contract. Check whether cross-region inference routing is on, because it can move requests out of your chosen region.</p>
<h3>Cost model</h3>
<p>Per-token pricing is simple to budget at low volume but grows with usage. Per-GPU-hour pricing rewards high utilization. Reserved capacity lowers the hourly rate but requires a volume forecast. Include idle GPU time, egress fees, and engineering time to get a true total cost of ownership. For the build-or-rent decision, see <a href="https://controlplane.com/blog/post/build-vs-rent-gpus-break-even-model?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">the build vs rent GPUs break-even model</a>.</p>
<h3>Team skills</h3>
<p>Managed APIs need almost no MLOps experience. Managed ML endpoints need moderate DevOps and ML engineering effort. Self-hosted serving needs experience with GPU drivers, container runtimes, model optimization, autoscaling, and incident response. A platform layer needs container and configuration skills without cluster operations.</p>
<h3>Decision table</h3>
<table>
<thead>
<tr>
<th>If you need</th>
<th>Start with</th>
</tr>
</thead>
<tbody><tr>
<td>Fastest integration, proprietary models, minimal operations</td>
<td>Managed model API</td>
</tr>
<tr>
<td>Custom or fine-tuned models with cloud automation</td>
<td>Managed ML endpoint</td>
</tr>
<tr>
<td>Elastic GPU scaling for bursty open-weight workloads</td>
<td>Serverless GPU inference service</td>
</tr>
<tr>
<td>Full control over runtime, weights, data, and cost</td>
<td>Self-hosted serving on containers</td>
</tr>
<tr>
<td>Container control across several clouds without operating clusters</td>
<td>A platform layer such as Control Plane</td>
</tr>
</tbody></table>
<h2>Can you compare different AI model deployment solutions?</h2>
<p>This table compares five inference deployment options across six dimensions, based on each option’s published documentation.</p>
<table>
<thead>
<tr>
<th>Option</th>
<th>What you manage</th>
<th>Model choice</th>
<th>Scaling and cold starts</th>
<th>Cost model</th>
<th>Data control</th>
<th>Best fit</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Managed model APIs</strong> (<a href="https://aws.amazon.com/bedrock/">Amazon Bedrock</a>, <a href="https://cloud.google.com/products/gemini-enterprise-agent-platform">Google Gemini Enterprise Agent Platform</a>, <a href="https://azure.microsoft.com/en-us/products/ai-foundry">Microsoft Foundry</a>, provider APIs)</td>
<td>Prompts and application code. The provider runs serving and scaling.</td>
<td>A catalog of proprietary and open-weight models, with fine-tuning on some.</td>
<td>Automatic, with no cold starts for provider-hosted models; imported custom models can cold start. Rate limits can throttle bursts.</td>
<td>Per token, with provisioned throughput options for reserved capacity, billed hourly or on a fixed-term commitment depending on the provider.</td>
<td>The provider processes prompts and completions under its retention terms. Hyperscaler APIs offer regional processing and private connectivity.</td>
<td>Prototyping, low to moderate volume, and teams without ML infrastructure experience.</td>
</tr>
<tr>
<td><strong>Managed ML endpoints</strong> (<a href="https://aws.amazon.com/sagemaker/ai/">Amazon SageMaker AI</a> endpoints, Gemini Enterprise Agent Platform endpoints, Azure Machine Learning online endpoints)</td>
<td>Model artifacts, container choice, endpoint configuration, and monitoring.</td>
<td>Your own custom, fine-tuned, or open-weight models.</td>
<td>Autoscaling on configured metrics. A minimum instance count avoids scale-up delay but adds cost; some services can scale to zero.</td>
<td>Per instance-hour while instances run.</td>
<td>Runs in your cloud account, with private networking options.</td>
<td>Custom models that need predictable latency on cloud-managed infrastructure.</td>
</tr>
<tr>
<td><strong>Serverless GPU inference services</strong> (on-demand GPU platforms, such as Google Cloud Run with GPUs)</td>
<td>Container image and model weights. The provider schedules GPUs and scales.</td>
<td>Any model you package in a container, including custom and fine-tuned models.</td>
<td>Scales to zero by default, with optional warm instances. Cold starts include image pull, weight loading, and engine warmup.</td>
<td>Per second of instance time, including idle time before an instance scales down and any warm minimum instances.</td>
<td>Varies by provider.</td>
<td>Bursty or unpredictable traffic where cold starts are acceptable.</td>
</tr>
<tr>
<td><strong>Self-hosted serving</strong> (<a href="https://docs.vllm.ai/">vLLM</a>, <a href="https://developer.nvidia.com/dynamo-triton">NVIDIA Dynamo-Triton</a>, <a href="https://kserve.github.io/website/">KServe</a> on Kubernetes)</td>
<td>GPU provisioning, Kubernetes or VMs, networking, autoscaling configuration, monitoring, and patching.</td>
<td>Any model you can load, with full control over weights, quantization, and runtime.</td>
<td>You configure autoscaling. KServe uses Knative, HPA, or KEDA, and plain vLLM needs HPA or KEDA. Warm replicas avoid cold starts.</td>
<td>GPU instances plus engineering and operations time.</td>
<td>Full control; data stays in your environment.</td>
<td>High-volume, latency-sensitive, or compliance-driven workloads with an experienced platform team.</td>
</tr>
<tr>
<td><strong>Control Plane</strong> (platform layer for containers across clouds)</td>
<td>Container image and workload configuration. Control Plane runs compute, networking, scaling, and Day 2 operations; on clusters you add as locations, you run the underlying servers.</td>
<td>Any model you package in a container, plus a vLLM template for Hugging Face models.</td>
<td>Serverless workloads scale on request concurrency and can scale to zero, and standard and stateful workloads, including GPU model servers, can scale on custom metrics through KEDA, which is enabled on Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds. The vLLM template runs as a stateful workload with a set replica count and caches weights on a volume to shorten restarts.</td>
<td>You pay for the CPU and memory a workload reserves, with no contracts or minimums; the pricing page lists GPU rates per GPU-hour.</td>
<td>Runs in the locations you select, on Control Plane-managed compute in AWS, GCP, and Azure regions or on your own clusters.</td>
<td>Teams that want container control, Day 2 operations handled, and active-active serving across regions and clouds, with their own GPU clusters as additional locations, without cluster operations.</td>
</tr>
</tbody></table>
<p>Many production architectures combine more than one option. A common pattern uses a managed model API for proprietary models and self-hosted serving for open-weight models where cost, data control, or customization matter.</p>
<h2>What are common challenges in AI model inference and how can I overcome them?</h2>
<p>This table maps each common problem to its cause and a fix.</p>
<table>
<thead>
<tr>
<th>Challenge</th>
<th>Why it happens</th>
<th>How to fix it</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Latency: time to first token and inter-token latency</strong></td>
<td>Prefill on long prompts sets time to first token. Decode, which is bound by memory bandwidth, sets inter-token latency. Network hops add to both.</td>
<td>Enable prefix caching for repeated system prompts and retrieved context, use chunked prefill so long prompts do not stall other requests, quantize weights (FP8, AWQ, or GPTQ) to speed decoding, use speculative decoding to cut inter-token latency at low batch sizes, and serve from regions close to users.</td>
</tr>
<tr>
<td><strong>GPU cost and low utilization</strong></td>
<td>GPUs sit idle between requests or off-peak, and reserved capacity costs the same regardless of load.</td>
<td>Right-size GPU types, autoscale on request concurrency or queue depth, and scale idle low-traffic services down. See <a href="https://controlplane.com/blog/post/best-gpu-cloud-providers-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">the best GPU cloud providers</a>.</td>
</tr>
<tr>
<td><strong>Cold starts from large model weights</strong></td>
<td>Loading multi-gigabyte weights into GPU memory takes time when a new replica starts, on top of image pull and engine warmup.</td>
<td>Cache weights on persistent volumes, use quantized models, keep a warm minimum of replicas before expected traffic, and use a fast weight loader such as the Run:ai Model Streamer, which vLLM supports.</td>
</tr>
<tr>
<td><strong>Autoscaling on the wrong signal</strong></td>
<td>CPU utilization misses the real bottleneck, which is request concurrency, queue depth, or KV cache usage.</td>
<td>Scale on request concurrency, waiting requests (vLLM’s num_requests_waiting), or KV cache usage. GPU memory and GPU utilization are poor signals because vLLM preallocates most GPU memory and utilization reads high even at low load.</td>
</tr>
<tr>
<td><strong>Throughput under concurrent load</strong></td>
<td>Serving one request at a time wastes GPU cycles, and KV cache pressure forces recomputation.</td>
<td>Use a server with continuous batching (vLLM, SGLang, and TensorRT-LLM batch this way by default), size the KV cache for expected concurrency with max model length and an FP8 KV cache, use tensor parallelism within one node only when a model does not fit on one GPU, and add replicas for throughput.</td>
</tr>
<tr>
<td><strong>Provider rate limits and outages</strong></td>
<td>Managed APIs impose token and request limits, and a single provider is a single point of failure.</td>
<td>Retry with exponential backoff, keep a fallback model or provider, and route around unhealthy endpoints. See <a href="https://controlplane.com/blog/post/ai-inference-multiple-gpu-clouds?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">how to run AI inference across multiple GPU clouds</a>.</td>
</tr>
<tr>
<td><strong>GPU capacity and quotas</strong></td>
<td>High-end GPUs are often unavailable in a given region or blocked by account quotas.</td>
<td>Request quotas early, qualify more than one GPU type per model, and keep capacity in more than one region or provider.</td>
</tr>
<tr>
<td><strong>Data privacy and residency</strong></td>
<td>Sending prompts to third-party APIs can conflict with residency rules or expose sensitive data.</td>
<td>Host open-weight models in your own environment or use managed endpoints with private networking, keep regional processing on, and review each provider’s retention terms.</td>
</tr>
<tr>
<td><strong>Model and version management</strong></td>
<td>Rolling out new model versions, rolling back bad ones, and running variants side by side adds risk.</td>
<td>Version model servers by container image tag and pin model weights to a fixed revision, roll out gradually, and keep the previous version ready for rollback.</td>
</tr>
<tr>
<td><strong>Observability gaps</strong></td>
<td>Standard monitoring misses tokens per second, time to first token, and KV cache pressure.</td>
<td>Export serving-framework metrics and track time to first token, inter-token latency, latency percentiles (p50, p95, p99), token throughput, queue depth, and KV cache usage.</td>
</tr>
<tr>
<td><strong>Multi-region availability</strong></td>
<td>One region adds latency for distant users and is a single point of failure.</td>
<td>Run replicas in at least two regions behind a global endpoint that routes to the nearest healthy one.</td>
</tr>
</tbody></table>
<p>For the infrastructure components behind these fixes, see <a href="https://controlplane.com/blog/post/what-infrastructure-do-you-need-to-run-an-inference-layer?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">what infrastructure you need to run an inference layer</a>.</p>
<h2>Where can I find a cloud friendly deployment platform for AI models?</h2>
<p>A cloud friendly inference platform meets five criteria:</p>
<ul>
<li><strong>Runs standard containers.</strong> You package your model server as a standard container image and deploy it without rewriting it for a proprietary runtime.</li>
<li><strong>Works on more than one cloud.</strong> You can run the same workload definition on AWS, GCP, and Azure regions and on your own GPU clusters.</li>
<li><strong>Supports GPUs.</strong> Your serving framework gets GPU access without manual driver work.</li>
<li><strong>Scales on demand signals.</strong> Autoscaling follows request concurrency or queue depth instead of generic CPU metrics.</li>
<li><strong>Keeps data where you choose.</strong> Inference traffic and model weights stay in the regions and clusters you select.</li>
</ul>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. For a wider comparison of hosting platforms, see <a href="https://controlplane.com/blog/post/best-paas-providers-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">the best PaaS providers in 2026</a>.</p>
<h2>How do containers compare with a managed PaaS for scaling AI infrastructure with predictable costs?</h2>
<p>Running model servers in containers yourself gives you full control over the serving framework, weights, quantization, and GPU choice. The cost is operational work, including Kubernetes clusters, GPU drivers, networking, autoscaling policies, certificate rotation, and incident response.</p>
<p>A managed platform takes over that layer. You still bring your container image, and the platform runs compute, scaling, load balancing, and Day 2 operations. The cost shifts from engineering hours to platform fees.</p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Self-managed containers</th>
<th>Managed platform (Control Plane)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Control</strong></td>
<td>Every layer</td>
<td>Container image and workload configuration, with infrastructure run by the platform</td>
</tr>
<tr>
<td><strong>Cost predictability</strong></td>
<td>Varies with utilization, spot pricing, and engineering time</td>
<td>Billing follows the CPU and memory a workload reserves, and the pricing page lists GPU rates per GPU-hour, so monthly cost tracks workload configuration</td>
</tr>
<tr>
<td><strong>Operational work</strong></td>
<td>Cluster management, patching, scaling, and monitoring</td>
<td>Control Plane runs clusters, patching, scaling, and monitoring on Control Plane-managed locations</td>
</tr>
<tr>
<td><strong>Multi-cloud</strong></td>
<td>A separate cluster and networking setup per cloud</td>
<td>One workload definition runs across AWS, GCP, Azure, and your own clusters. A GPU workload’s GPU setting applies to every location in its GVC, so run built-in GPUs (NVIDIA T4 or A10G) and GPUs on your own clusters in separate GVCs</td>
</tr>
<tr>
<td><strong>Availability</strong></td>
<td>You build redundancy</td>
<td>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations</td>
</tr>
</tbody></table>
<h2>How Control Plane fits</h2>
<p>Control Plane runs containerized model servers such as vLLM as workloads. On Control Plane-managed locations in AWS, GCP, and Azure regions there is no Kubernetes cluster to operate, and teams can also add GPU clusters they already run, including on a neocloud, as locations.</p>
<p>The vLLM template serves one Hugging Face model through vLLM’s OpenAI-compatible API on a built-in NVIDIA A10G or T4, or on your own GPU cluster registered as a location, and caches weights on a persistent volume so restarts skip the download. It runs in a GVC with exactly one location. For redundancy across regions, install it once per region, each in its own single-location GVC, and fail over between their endpoints in your client or gateway.</p>
<p>On Control Plane, serverless workloads scale on request concurrency and can scale to zero, and standard and stateful workloads can scale on custom metrics such as queue length through KEDA, enabled per GVC. A workload deployed to a GVC runs active-active in every location of that GVC from one definition, and the workload’s global endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes.</p>
<p>Control Plane’s Universal Cloud Identity (UCI) lets workloads call AWS, GCP, and Azure services, such as Amazon Bedrock or Google’s Gemini Enterprise Agent Platform, through an IAM role or service-account grant instead of long-lived keys in your code, with short-lived, least-privilege credentials at runtime, so an application can combine self-hosted open-weight models with managed model APIs.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<h2>FAQ</h2>
<p>These questions come up often when teams compare inference deployment options.</p>
<h3>Should I use a model API or host my own model?</h3>
<p>Use a model API when you need a proprietary model, want to start quickly, or have low to moderate traffic. Host your own model when you need control over data, want to fine-tune or quantize, or when per-token cost at your volume exceeds the cost of dedicated GPU compute.</p>
<h3>What is the cheapest way to serve an open-weight model?</h3>
<p>It depends on utilization. At high, steady traffic, self-hosted serving on reserved GPUs usually gives the lowest cost per token, and spot GPUs suit batch jobs that tolerate preemption. At low or bursty traffic, a per-token API that hosts the model, or a GPU service that scales down when idle, avoids paying for unused GPUs. Include engineering and operations time in the comparison.</p>
<h3>How do I reduce inference latency?</h3>
<p>Cut time to first token by reusing cached prompt prefixes and splitting long prompts into chunks. Cut the time between tokens with quantized weights and speculative decoding. Keep warm replicas near users so requests never wait on a cold start.</p>
<h3>How do I keep inference running when a model provider has an outage?</h3>
<p>Keep a fallback. For managed model APIs, route to an alternative provider or model when calls fail. For self-hosted models, run replicas in at least two regions. On Control Plane, a workload in a GVC with several locations runs active-active, and the workload’s global endpoint uses DNS to route clients to the nearest location where it passes its readiness probes. Every location in that GVC must offer the GPU model the workload requests.</p>
<h3>What GPU should I use for LLM inference?</h3>
<p>Match GPU memory to model size, context length, and concurrency. Weight memory is the parameter count times bytes per parameter: 2 at FP16 or BF16, 1 at FP8, and about 0.5 at 4-bit, plus headroom for the KV cache, which grows with context length and concurrent requests. A 7 or 8 billion parameter model needs about 14 to 16 GB at FP16 and fits on a 24 GB GPU such as the A10G with moderate context, or on a 16 GB T4 with 4-bit quantization. A 70 billion parameter model needs about 140 GB at FP16, so it runs on four 80 GB GPUs such as the H100 with tensor parallelism, on two 80 GB GPUs at FP8, on one 80 GB GPU only at 4-bit, or on one H200 or B200 at FP8. Control Plane’s pricing page lists NVIDIA GPUs from T4 to B200, subject to availability.</p>
<h3>How do I autoscale AI inference workloads correctly?</h3>
<p>Scale on request concurrency, waiting requests, or KV cache usage instead of CPU or GPU utilization, which do not reflect inference load. On Control Plane, a vLLM server running as a standard or stateful workload can scale on vLLM’s waiting-request count through KEDA.</p>
<h3>Can I run inference across multiple clouds?</h3>
<p>Yes. Package the model server as a container and run it in more than one cloud. On Control Plane, one workload definition runs across AWS, GCP, and Azure regions and your own clusters. A GPU workload uses one GPU source per GVC: built-in NVIDIA T4 or A10G on Control Plane-managed regions, or the GPUs on your own clusters added as locations.</p>
<h3>How do I handle data privacy requirements for AI inference?</h3>
<p>Host models in your own environment or use managed endpoints with private networking and regional processing. Send sensitive data to a third-party model API only when its retention and usage terms meet your requirements.</p>
<h3>What infrastructure do I need to run an inference layer?</h3>
<p>You need GPU compute, a model server such as vLLM or Dynamo-Triton, a container runtime or a serving layer such as KServe, autoscaling, load balancing, observability, and storage for model weights. For the full breakdown, see <a href="https://controlplane.com/blog/post/what-infrastructure-do-you-need-to-run-an-inference-layer?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">what infrastructure you need to run an inference layer</a>.</p>
<h3>Is a platform layer worth it compared to managing Kubernetes myself?</h3>
<p>For most teams, yes, when engineering time is the constraint. A platform layer removes cluster operations and custom autoscaling setup while you keep control of the model server and weights. The tradeoff is a platform fee in place of engineering hours, and Control Plane customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure.</p>
<p>To run inference workloads across clouds without operating clusters, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/choose-ai-model-inference-service?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=choose-ai-model-inference-service">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Choose an AI Agent Sandbox: 12 Criteria, Self-Hosted vs Managed, and When a Sandbox Is the Wrong Tool]]></title><description><![CDATA[Choose an AI agent sandbox by isolation, startup time, persistence, network control, and cost: 12 criteria, self-hosted vs managed, and alternatives.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-choose-an-ai-agent-sandbox-12-criteria-self-hosted-vs-managed-and-when-a-sandbox-is-the-wrong-tool</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-choose-an-ai-agent-sandbox-12-criteria-self-hosted-vs-managed-and-when-a-sandbox-is-the-wrong-tool</guid><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[Devops]]></category><category><![CDATA[agents]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 02:48:22 GMT</pubDate><content:encoded><![CDATA[<p>Choose an AI agent sandbox by isolation strength, startup and lifetime behavior, state persistence, network and secret controls, and how it fits the tools and clouds you already use. Sandboxes are for running untrusted or model-generated code and agent development work, while production agent services belong in hardened, observable production workloads. Control Plane Sandboxes, Control Plane’s cloud development environments, run in dedicated Kata Containers microVMs for building and running untrusted code, and Control Plane runs production agents as workloads active-active across regions and clouds, on AWS, GCP, Azure, and your own infrastructure. For a ranked comparison of providers, see <a href="https://controlplane.com/blog/post/best-ai-agent-sandboxes-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">the best AI agent sandboxes in 2026</a>.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>Twelve criteria.</strong> They cover isolation, lifecycle, developer experience, cost, and compliance. Use them as a vendor questionnaire and to find claims that need technical proof.</li>
<li><strong>Managed sandbox vs self-hosted sandbox vs production workload.</strong> The trade-off is who owns isolation, patching, capacity, and monitoring. Managed services cut operations work, self-hosting gives control for custom isolation and compliance, and production workloads add replicas, health checks, autoscaling, and SLAs.</li>
<li><strong>Alternatives exist.</strong> Allow-listed tool calls, WebAssembly runtimes, single-use CI runners, per-tenant isolated workloads, and human-approved actions reduce risk when general-purpose code execution is unnecessary.</li>
<li><strong>Portability.</strong> Use standard container images, open APIs and CLIs, workload identity for cloud access, and secrets kept outside the sandbox so you can change or mix providers.</li>
<li><strong>How Control Plane fits.</strong> Control Plane Sandboxes are for development and untrusted, agent-generated code in dedicated Kata Containers microVMs. Production agents run as Control Plane workloads, active-active across regions and clouds from one definition.</li>
</ul>
<h2>What should I look for in an AI agent sandbox?</h2>
<p>Evaluate these 12 criteria before you select a sandbox for AI agents.</p>
<table>
<thead>
<tr>
<th>Criterion</th>
<th>Why it matters for agents</th>
<th>What to ask</th>
<th>Red flags</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Isolation boundary</strong></td>
<td>Agents run model-generated code that may be faulty or malicious. A microVM gives each sandbox its own kernel inside a lightweight virtual machine. A user-space kernel intercepts system calls without a full VM. A shared-kernel container relies on Linux namespaces, cgroups, seccomp filters, and capability limits, and every container on the host shares one kernel. Stronger isolation shrinks the blast radius of a compromised sandbox.</td>
<td>Is each sandbox a dedicated VM, a user-space kernel process, or a standard container? Which hypervisor or runtime is used, and how fast are host kernel and hypervisor vulnerabilities patched? Do different customers share physical hosts? Is there security testing evidence?</td>
<td>“Full isolation” claims with no architectural detail or testing evidence.</td>
</tr>
<tr>
<td><strong>Startup time</strong></td>
<td>Interactive coding agents and evaluation harnesses create many environments, so latency compounds.</td>
<td>What is the measured create-to-first-command time with a representative image? Are there warm pools, snapshots, or image caching?</td>
<td>Cold-start numbers that measure only VM boot, with no data for realistic image sizes.</td>
</tr>
<tr>
<td><strong>Lifetime, idle behavior, and limits</strong></td>
<td>Some agents run short tasks; others hold multi-hour sessions. Idle sandboxes waste money, forced terminations lose work, and runaway code needs a ceiling.</td>
<td>Is there a maximum session length? Are there per-command timeouts and process, file, and disk quotas that stop runaway or fork-bomb code? Can a sandbox suspend to zero and keep its state? What warning comes before termination?</td>
<td>Hard limits that kill sessions without saving, no suspend option, or no per-command timeout, so one hung process holds a sandbox indefinitely.</td>
</tr>
<tr>
<td><strong>State persistence and forking</strong></td>
<td>Coding agents keep repos, dependencies, and configuration across sessions, and agents that try several approaches in parallel need to branch one environment into many.</td>
<td>Do volumes persist across restarts and suspend? Where does the home directory live? Can you snapshot a running sandbox, fork it into parallel copies, or export state? Is state encrypted at rest?</td>
<td>Ephemeral storage only, with no export, snapshot, or fork capability.</td>
</tr>
<tr>
<td><strong>Images, packages, and supply chain</strong></td>
<td>Agents install packages and change files, and every sandbox inherits its base image. A locked-down filesystem breaks workflows, and an unvetted image ships known vulnerabilities into every session.</td>
<td>Can you bring your own container image or build from templates? Can agents install OS and language packages? Can you choose a read-only root? Who maintains base images, how fast are vulnerabilities patched, and are images signed with an SBOM?</td>
<td>Proprietary image formats you cannot reproduce elsewhere, or base images with no patch cadence, scan results, or provenance.</td>
</tr>
<tr>
<td><strong>Network ingress and egress control</strong></td>
<td>An agent that reaches arbitrary endpoints can exfiltrate data, call unauthorized APIs, or query cloud metadata services, and an exposed port can let others in.</td>
<td>Is egress deny-by-default, with allow-listed domains, ports, and IP ranges? Is the policy enforced outside the sandbox, at the host or an egress proxy, so code inside cannot change it? Does domain filtering use a proxy or TLS SNI, or only DNS? Are metadata endpoints blocked? Are exposed ports and preview URLs private or authenticated by default?</td>
<td>Unrestricted outbound access, domain allow-lists enforced only through DNS, or exposed ports that are public by default without your choice.</td>
</tr>
<tr>
<td><strong>Secrets handling</strong></td>
<td>Long-lived API keys or cloud credentials inside a sandbox are a high-value target.</td>
<td>How are secrets injected? Are they scoped and short-lived? Can the sandbox reach cloud services through workload identity instead of static keys? Can a proxy outside the sandbox attach credentials to outbound requests so the agent never sees them?</td>
<td>Long-lived keys baked into images or exposed as environment variables to every process.</td>
</tr>
<tr>
<td><strong>Resource sizing, GPUs, and concurrency</strong></td>
<td>ML-heavy agents need GPUs, and every agent needs predictable CPU and memory. A GPU passed into a sandbox adds a large driver attack surface, and GPUs shared across tenants weaken isolation.</td>
<td>Which CPU, memory, disk, and GPU options exist? Is each GPU dedicated to one sandbox, or partitioned or time-sliced across tenants? What are the account limits on concurrent sandboxes and creation rate?</td>
<td>GPUs time-sliced across tenants, fixed tiers, or concurrency limits below your peak.</td>
</tr>
<tr>
<td><strong>API, SDK, and CLI access</strong></td>
<td>Orchestration, testing, and CI need programmatic lifecycle control.</td>
<td>Is there a REST API, SDKs, and a CLI? Can you create, exec, upload, download, snapshot, and destroy programmatically? Does exec stream output? What are the file transfer size limits and rate limits?</td>
<td>Console-only management, or an SDK for one language only.</td>
</tr>
<tr>
<td><strong>Observability and audit logs</strong></td>
<td>Debugging, compliance, and incident response need records stored outside the sandbox.</td>
<td>Do logs stream to external storage or your SIEM? Is there an audit trail of commands, file changes, and network flows? Can you export telemetry through OpenTelemetry?</td>
<td>Logs readable only from inside the sandbox, with no audit trail.</td>
</tr>
<tr>
<td><strong>Cost model</strong></td>
<td>Sandbox costs multiply at scale, especially for evaluation harnesses and concurrent runs.</td>
<td>What are the compute rates? Are idle time, storage, bandwidth, snapshots, or API calls billed? What does a completed task cost, including retries?</td>
<td>High billing minimums, hidden bandwidth or storage fees, or no cost visibility until after launch.</td>
</tr>
<tr>
<td><strong>Compliance, residency, and support</strong></td>
<td>Customer code and data inside sandboxes fall under the same audit and residency rules as the rest of your stack.</td>
<td>Which regions can sandboxes and their volumes run in? Which attestations cover the sandbox product specifically? Is there an availability SLA and a support response time for sandbox incidents?</td>
<td>Attestations that cover the vendor’s other products but not the sandbox service, or no control over where sandbox data is stored.</td>
</tr>
</tbody></table>
<h2>How do I choose an AI agent sandbox for my project?</h2>
<p>Different projects weight the criteria differently. Find the row closest to your project and weight the checklist accordingly.</p>
<table>
<thead>
<tr>
<th>Project type</th>
<th>What matters most</th>
<th>Typical choice</th>
</tr>
</thead>
<tbody><tr>
<td>Coding agents editing a repo</td>
<td>State persistence, writable filesystem, package installs, IDE access</td>
<td>Persistent sandbox with volumes, custom images, and a browser IDE</td>
</tr>
<tr>
<td>Data analysis code execution</td>
<td>Runtimes such as Python and R, resource sizing, output persistence</td>
<td>Sandbox with notebook-style access or persistent volumes and exportable artifacts</td>
</tr>
<tr>
<td>Browser and computer-use agents</td>
<td>Desktop environment, controlled network access, longer sessions</td>
<td>Sandbox with browser or desktop streaming and configurable egress</td>
</tr>
<tr>
<td>Evaluation and RL harnesses</td>
<td>Startup speed, concurrency, forking, predictable cost per run</td>
<td>Ephemeral sandboxes with fast creation, image caching, and fine-grained billing</td>
</tr>
<tr>
<td>Multi-tenant SaaS letting customers run code</td>
<td>Strong isolation, per-tenant network and secret policies, audit logs</td>
<td>MicroVM-based sandboxes with per-tenant isolation and external audit logging</td>
</tr>
</tbody></table>
<p>Many teams combine approaches: microVM sandboxes for customer-submitted code, and the agent’s API and orchestration on a production platform.</p>
<h2>Can I use a self-hosted AI sandbox for production applications?</h2>
<p>Yes, as the execution layer behind an agent product, if your team can staff host operations, upgrades, and on-call. You might run Kata Containers on your own Kubernetes cluster to give customer-submitted code microVM isolation, while the agent’s API, orchestration, and user-facing endpoints run as production workloads. In its standard setup, Kata Containers needs hardware virtualization, so nodes must be bare metal, or VMs with nested virtualization, which adds CPU and I/O overhead. The peer pods option launches each pod VM as a separate cloud instance instead. You also own the RuntimeClass setup, guest kernel and hypervisor upgrades, capacity planning for per-pod memory overhead, and any GPU passthrough.</p>
<p>| Managed sandbox service| Self-hosted sandbox| Production workload<br />---|---|---|---<br /><strong>What you operate</strong>|  Your agent code and orchestration. The provider runs the sandbox runtime, hosts, and networking.| Hosts, the container or microVM runtime, networking, patching, capacity, and compliance controls.| Your application code and configuration. The platform runs compute, networking, scaling, and routing.<br /><strong>Isolation</strong>|  Provider-managed, often microVMs or user-space kernels.| Your choice and configuration, such as Kata Containers on your Kubernetes.| Platform-enforced isolation with cgroups, namespaces, restricted syscalls and capabilities, network policy, and access controls.<br /><strong>Best for</strong>|  Validating agent concepts and running untrusted code without deep infrastructure work.| Strict customization, data residency, or compliance needs with the operations capacity to match.| User-facing APIs, orchestration, and services that need replicas, health checks, autoscaling, and SLAs.<br /><strong>Watch out for</strong>|  Lock-in, limited customization, and cost at sustained scale.| KVM-capable nodes, patching, scaling, monitoring, incident response, and security testing are all yours.| Arbitrary untrusted code belongs in a sandbox.  </p>
<h2>Are there alternatives to traditional AI agent sandboxes?</h2>
<p>Yes. When an agent does not need general-purpose code execution, these options reduce attack surface and cost:</p>
<ul>
<li><strong>Restricted tools.</strong> If the agent performs a fixed set of actions, give it an allow-list of tool calls or curated APIs instead of a shell.</li>
<li><strong>WebAssembly runtimes.</strong> WebAssembly runs code in a sandboxed linear memory that cannot reach host memory, and the host grants file, network, and system access explicitly through capability-based interfaces such as WASI. It suits small functions such as transformations, plugins, and user-defined functions, with lower overhead than a VM. It cannot run native binaries, and WASI support for networking, threads, and packages with C extensions is limited, so most agent toolchains will not run unchanged.</li>
<li><strong>Single-use CI runners.</strong> When agent tasks resemble build or test jobs, single-use runners give predictable cleanup and reuse existing controls. Use one runner per job with no repository secrets attached, since persistent self-hosted runners carry files and credentials between jobs.</li>
<li><strong>Per-tenant isolated workloads.</strong> When tenants run code your team wrote and reviewed, per-tenant workloads with resource limits, network policies, and service identities are often enough and cost less at scale.</li>
<li><strong>Human-approved actions.</strong> For sensitive operations, the agent proposes a concrete plan, a person approves it, and the action runs with logging.</li>
</ul>
<p>For arbitrary, unpredictable model-generated code, a full sandbox remains the right choice.</p>
<h2>How do I evaluate open ecosystems that let third-party tools plug into an AI agent infrastructure platform?</h2>
<p>Check whether the platform exposes standard interfaces at every layer:</p>
<ul>
<li><strong>MCP support.</strong> A Model Context Protocol server lets agents discover and call tools through a standard contract.</li>
<li><strong>Standard container images.</strong> You can move images between providers and run the same image locally and in CI.</li>
<li><strong>Open APIs and CLIs.</strong> Everything in the console is scriptable through a REST API with stable schemas and a CLI.</li>
<li><strong>Terraform or Pulumi providers.</strong> You can version, review, and automate configuration with the rest of your infrastructure.</li>
<li><strong>OpenTelemetry export.</strong> Logs, metrics, and traces flow to your existing observability stack.</li>
<li><strong>No proprietary runtime.</strong> No platform-only binaries or SDKs stand between you and another provider.</li>
</ul>
<p>Ask each vendor for a concrete export workflow covering images, state, and telemetry. A vendor that cannot show one will be harder to leave.</p>
<h2>How can I build a portable AI agent SDK that works across different sandbox providers and clouds?</h2>
<p>Put a thin interface in front of every provider and keep responsibilities separate:</p>
<ul>
<li><strong>Adapter interface.</strong> Make create, exec, upload, download, and destroy required, and treat snapshot, fork, suspend, and port exposure as optional capabilities each adapter declares. Define exec semantics (argument list or shell, streaming output, exit codes, timeouts) explicitly, since providers differ most there. Changing providers then means writing a new adapter.</li>
<li><strong>Standard images.</strong> Bake runtimes, packages, and tools into small, cacheable container images built from templates, so the same image runs on any provider that accepts standard container images.</li>
<li><strong>Secrets at runtime.</strong> Inject credentials when a task starts, scoped to that task, and use workload identity or short-lived tokens for cloud access.</li>
<li><strong>Configuration as code.</strong> Keep image definitions, network policies, and quotas in Terraform or Pulumi so environments are reproducible.</li>
</ul>
<p>For guardrails on agents that touch production, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">how to let AI agents operate production infrastructure safely</a>.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane Sandboxes are cloud development environments for building and for running untrusted, agent-generated code. Each sandbox provides a browser IDE (code-server), a browser terminal, SSH access for desktop IDEs through <code>cpln sandbox connect</code> in the Control Plane CLI, and a shareable public URL that serves only the app port you set when you create the sandbox. The IDE, terminal, and every other detected port sit behind the sandbox password, SSH is reachable only through a port-forward, and callback paths for OAuth and webhooks are open so external services can reach them. Treat anything served on the app port as public. Sandboxes start from toolbox images that you build from a template, from scratch, or from your own container image, with runtimes, packages, and AI coding tools such as Claude Code, Codex CLI, and Gemini CLI; templates and scratch builds include the Claude Code CLI. When an agent or developer installs packages in a running sandbox, Fork captures them into a new toolbox image.</p>
<p>The home directory (/root) sits on a persistent volume, so files there survive container restarts and suspend/resume. Suspend scales the sandbox to zero and keeps the volume, so you pay for storage only, and deleting the sandbox removes the volume.</p>
<p>Production agents run as Control Plane workloads. Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. Each workload is isolated with cgroups, namespaces, and restricted syscalls and capabilities, and Sandboxes run in dedicated Kata Containers microVMs.</p>
<p>A workload deployed to Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds, runs active-active in every location of that GVC from one definition, and its canonical endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations.</p>
<p>Control Plane’s Universal Cloud Identity (UCI) lets workloads call AWS, GCP, and Azure services through an IAM role or service-account grant instead of long-lived keys in your code, with short-lived, least-privilege credentials at runtime. The Control Plane MCP server lets AI agents operate Control Plane through the same API as the console and CLI, with OAuth and per-org consent, and a readonly profile that has no write tools. Control Plane records platform actions in a tamper-proof audit trail and includes built-in logs, metrics, and traces for workloads. Control Plane ships its own Terraform and Pulumi providers, so it complements the infrastructure as code you already run.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. The Control Plane platform that runs these workloads is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. For more context, see why you should <a href="https://controlplane.com/blog/post/stop-running-ai-agents-on-developer-laptops?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">stop running AI agents on developer laptops</a> and <a href="https://controlplane.com/blog/post/10-best-ai-agent-infrastructure-platforms-in-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">the best AI agent infrastructure platforms</a>.</p>
<h2>FAQ</h2>
<p>These questions come up often when teams evaluate AI agent sandboxes.</p>
<h3>How do I choose an AI agent sandbox?</h3>
<p>Score candidates against the 12 criteria, weighted by your project type and risk profile, and pilot the top two with a representative workload before you commit.</p>
<h3>Is a container enough isolation for AI agents?</h3>
<p>For untrusted model-generated code, usually no. Containers share the host kernel, so microVMs or user-space kernels give stronger separation. Hardened containers can be enough for trusted internal code.</p>
<h3>What is a microVM sandbox?</h3>
<p>A microVM sandbox runs each environment inside a lightweight virtual machine with its own kernel, so a hypervisor using hardware virtualization, such as KVM, separates sandboxes from each other and from the host.</p>
<h3>Should coding agents run on developer laptops?</h3>
<p>No. Laptops hold broad access to credentials, source code, internal networks, and cloud accounts. Run coding agents in isolated sandboxes with controlled network access and scoped credentials.</p>
<h3>How long should an AI agent sandbox live?</h3>
<p>As long as the task needs. Ephemeral sandboxes should end with the task. Persistent sandboxes for active development can run for hours or days, with suspend and explicit lifecycle controls.</p>
<h3>What is the difference between a sandbox and a production workload for AI agents?</h3>
<p>A sandbox isolates untrusted code and developer work. A production workload serves users and orchestration with replicas, monitoring, autoscaling, routing, and SLAs.</p>
<h3>How do I control network access in an AI agent sandbox?</h3>
<p>Start with deny-by-default egress enforced outside the sandbox, allow-list only what the agent needs, block cloud metadata endpoints, keep exposed ports private unless you choose otherwise, and log outbound connections for audit.</p>
<h3>Can I run AI agent sandboxes across multiple clouds?</h3>
<p>Yes. Run one provider’s sandboxes in several clouds or regions, or put a common adapter in front of several providers. Standard images, open APIs, and workload identity keep the setup portable, and data residency rules decide where sandbox volumes may live.</p>
<h3>What should I look for in AI agent sandbox security?</h3>
<p>Strong isolation, controlled egress, short-lived scoped credentials injected at runtime, audit logs stored outside the sandbox, and patched, signed base images, plus human approval for high-risk actions.</p>
<h3>How do managed and self-hosted AI sandboxes compare on cost?</h3>
<p>Managed sandboxes usually cost more per unit of compute but remove operations work. Self-hosted sandboxes can cost less per unit at high, steady utilization, but microVM isolation usually needs bare-metal or nested-virtualization nodes and engineering time for provisioning, patching, monitoring, and capacity. Compare the cost per completed task, including retries, storage, and engineering hours.</p>
<p>To run agent sandboxes in dedicated microVMs and production agents active-active across regions and clouds on one platform, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/how-to-choose-ai-agent-sandbox?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-choose-ai-agent-sandbox">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[The Best Business Continuity Solutions for High Availability Across On Premises and Cloud (2026)]]></title><description><![CDATA[Business continuity across on premises and cloud takes four layers: app availability, data protection, workload recovery, planning. Tools for each.]]></description><link>https://controlplane-eng.hashnode.dev/the-best-business-continuity-solutions-for-high-availability-across-on-premises-and-cloud-2026</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/the-best-business-continuity-solutions-for-high-availability-across-on-premises-and-cloud-2026</guid><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[SRE]]></category><category><![CDATA[Disaster recovery]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 01:09:37 GMT</pubDate><content:encoded><![CDATA[<p>Business continuity for high availability services across on premises and cloud requires an application availability layer that keeps services running across sites, combined with data protection, recovery orchestration, and continuity planning. Control Plane leads the availability layer, running workloads active-active across on premises data centers and multiple cloud providers. Veeam, HPE Zerto, Commvault, Rubrik, Cohesity, AWS Elastic Disaster Recovery, and Azure Site Recovery lead data protection and recovery. No single product covers every layer. The strongest posture stacks purpose-built tools so that a site loss, a ransomware event, or a regional cloud outage does not stop critical services.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Each layer covers a different failure. Most hybrid estates need a tool from every layer.</p>
<ul>
<li><strong>Layer 1, keep services running (application availability):</strong> Control Plane, Red Hat OpenShift with Advanced Cluster Management, InfoScale, Linux Pacemaker</li>
<li><strong>Layer 2, recover data (backup, replication, immutability):</strong> Veeam Data Platform, HPE Zerto, Commvault Cloud, Rubrik Security Cloud, Cohesity, Veeam Kasten for Kubernetes, Google Cloud Backup and DR Service</li>
<li><strong>Layer 3, orchestrate recovery (DRaaS and cloud-native DR):</strong> AWS Elastic Disaster Recovery, Azure Site Recovery</li>
<li><strong>Layer 4, plan and govern (BC management software):</strong> Fusion Risk Management, Archer, Riskonnect</li>
</ul>
<h2>How do high availability, disaster recovery, and business continuity differ?</h2>
<p>Three terms get used interchangeably but mean different things. High availability keeps a service running through component or site failures using redundancy and automatic failover, and its target is expressed in <a href="https://controlplane.com/blog/post/what-is-high-availability-how-it-works-and-how-many-nines-you-actually-need?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">nines of uptime</a>. Disaster recovery restores a service after a failure that exceeds the HA design, such as a full data center loss or a ransomware attack. Business continuity is the broadest discipline, covering people, process, and technology so the organization can sustain critical operations under any disruption.</p>
<p>Two metrics drive every design decision. Recovery Time Objective (RTO) defines how quickly a service must be back. Recovery Point Objective (RPO) defines how much data loss is tolerable. Teams set both per service from a business impact analysis. Mission-critical services commonly target near-zero values for both. Less critical workloads often accept an RTO and RPO of hours, which allows scheduled backups instead of continuous replication.</p>
<p>Replication without point-in-time history does not protect against corruption or ransomware. Corrupted or encrypted data replicates to the secondary site with the next replication cycle, within seconds when replication is continuous, so both copies hold the damage. Immutable backups stored in a separate account or air-gapped environment remain necessary however strong the HA layer is.</p>
<h2>What are the four layers of hybrid business continuity?</h2>
<p><strong>Layer 1: Keep services running.</strong> Application availability tools run workloads across multiple sites, either active-active or as clusters with automatic failover, so losing one location does not take the service down. Active-active designs can shift traffic in seconds. Cluster failover typically takes seconds to minutes.</p>
<p><strong>Layer 2: Recover data.</strong> Backup, replication, and immutability tools capture point-in-time copies of data and replicate state between sites. They protect against data loss, corruption, and ransomware. RPO depends on the method: zero with synchronous replication, seconds with continuous data protection, and hours to a day with scheduled snapshots.</p>
<p><strong>Layer 3: Orchestrate recovery.</strong> Disaster Recovery as a Service (DRaaS) and cloud-native DR products automate the failover of servers and VMs to a secondary environment. They handle network remapping, boot order, and test drills. They matter most when whole environments must come up in a specific order.</p>
<p><strong>Layer 4: Plan and govern.</strong> Business continuity management software documents plans, tracks risks and business impact analyses, manages compliance, coordinates communication during incidents, and schedules and tracks readiness tests.</p>
<h2>Layer 1: Keep services running (application availability)</h2>
<p>Application availability tools keep a service running when a node, site, or region fails. They differ in whether sites run active-active or fail over as active-passive clusters, and in how they route traffic.</p>
<h3>Control Plane</h3>
<p><strong>What it is.</strong> Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes (MK8s), and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. A workload deployed to Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds, runs active-active in every location of that GVC from one definition. Each workload’s global endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes, and moves traffic automatically when a location fails.</p>
<p><strong>Best for.</strong> Production services that must stay up through a site or region loss, with traffic rerouted automatically and Day 2 operations handled by the platform.</p>
<p><strong>Strengths.</strong> Control Plane handles Day 2 operations for you, including autoscaling, built-in observability, and security, with no Kubernetes cluster to operate in Control Plane-managed regions. Locations can be Control Plane-managed regions on AWS, GCP, Azure, and Oracle Cloud, Kubernetes clusters you already run, joined as locations through Control Plane’s Bring Your Own Kubernetes (BYOK), or your own servers, including in an on premises data center, through MK8s. One GVC can mix an on premises location with cloud regions. Control Plane’s Cloud Wormhole connects workloads to TCP endpoints in private networks, including on premises data centers, through an agent inside the network that holds an outbound connection, so no inbound ports open to the internet. The Template Catalog, Control Plane’s library of ready-to-install apps, includes multi-location databases such as CockroachDB and pgEdge so the data layer can also run across locations. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations, and those locations can be on different providers. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure.</p>
<p>During the October 20, 2025 AWS us-east-1 outage, Control Plane customers with us-east-1 in their GVC had workloads active and running in healthy locations within 10 seconds, with no customer downtime, according to Control Plane’s internal incident telemetry.</p>
<p><strong>Scope.</strong> Control Plane keeps services running and routes traffic, and its volume sets take scheduled snapshots for point-in-time restore. Immutable, isolated backups and BC planning come from Layers 2 and 4.</p>
<p><strong>On premises and cloud coverage.</strong> On premises through MK8s or BYOK. AWS, GCP, and Azure through Control Plane-managed regions, and other providers such as Hetzner through MK8s or BYOK.</p>
<h3>Red Hat OpenShift with Advanced Cluster Management</h3>
<p><strong>What it is.</strong> An enterprise Kubernetes platform paired with a management layer that deploys, governs, and monitors workloads across many clusters in the data center, the cloud, and the edge.</p>
<p><strong>Best for.</strong> Organizations already standardized on OpenShift that need multi-cluster governance and policy-based placement.</p>
<p><strong>Strengths.</strong> Deep integration with Red Hat’s ecosystem. Policy-driven workload placement across clusters. Multisite, multicluster disaster recovery capabilities. Supports on premises, bare metal, and major cloud providers.</p>
<p><strong>Limitations.</strong> Global traffic routing across clusters requires external load balancing or DNS configuration. Operational work grows with cluster count.</p>
<p><strong>On premises and cloud coverage.</strong> On premises bare metal and virtualized, plus AWS, GCP, and Azure.</p>
<h3>InfoScale</h3>
<p><strong>What it is.</strong> A clustering and replication platform, now part of Cloud Software Group, that provides application-level HA and DR for physical, virtual, and cloud workloads.</p>
<p><strong>Best for.</strong> Enterprise applications on physical or virtual infrastructure that need automated failover between on premises sites or to the cloud.</p>
<p><strong>Strengths.</strong> Supports a wide range of operating systems and applications. Provides volume replication and cluster management in one product, with support for Kubernetes and OpenShift Virtualization.</p>
<p><strong>Limitations.</strong> Strongest with traditional enterprise applications. It does not route global traffic across sites.</p>
<p><strong>On premises and cloud coverage.</strong> On premises physical and virtual. Cloud support for AWS, Azure, Google Cloud, and Oracle Cloud.</p>
<h3>Linux Pacemaker clustering (open source)</h3>
<p><strong>What it is.</strong> An open source high availability cluster resource manager, commonly used with Corosync for Linux workloads.</p>
<p><strong>Best for.</strong> Teams with strong Linux expertise that need HA for specific services such as databases or file systems without commercial licensing costs.</p>
<p><strong>Strengths.</strong> Free and well documented. Long proven in production. Supported by major Linux distributions.</p>
<p><strong>Limitations.</strong> Requires significant manual configuration. No global traffic routing across sites. Large clusters add operational complexity.</p>
<p><strong>On premises and cloud coverage.</strong> On premises Linux servers, plus cloud VMs on AWS, Azure, and Google Cloud through cloud-specific fence and resource agents.</p>
<h2>Layer 2: Recover data (backup, replication, immutability)</h2>
<p>Data protection tools set the RPO. They differ in workload coverage, replication method (scheduled snapshots or continuous journaling), and ransomware features. They form the core of most <a href="https://controlplane.com/blog/post/best-cloud-disaster-recovery-solutions-for-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">cloud disaster recovery solutions</a>.</p>
<h3>Veeam Data Platform</h3>
<p><strong>What it is.</strong> A unified backup, recovery, and data security platform for virtual, physical, cloud, and SaaS workloads.</p>
<p><strong>Best for.</strong> Broad backup coverage across heterogeneous environments with strong ransomware protection.</p>
<p><strong>Strengths.</strong> Supports VMware, Hyper-V, Nutanix, AWS, Azure, Google Cloud, and physical servers. Immutable backup repositories. Instant VM recovery. Monitoring and reporting.</p>
<p><strong>Limitations.</strong> Licensing can be complex for large, diverse environments. Recovery orchestration is included in the Premium edition and sold as an add-on for Foundation and Advanced.</p>
<p><strong>On premises and cloud coverage.</strong> On premises hypervisors and physical servers. Native cloud backup for AWS, Azure, and Google Cloud.</p>
<h3>HPE Zerto</h3>
<p><strong>What it is.</strong> A continuous data protection and disaster recovery platform built for near-zero RPO replication of virtualized and cloud workloads.</p>
<p><strong>Best for.</strong> Near-zero RPO for VMware vSphere workloads replicating between on premises sites or to the cloud.</p>
<p><strong>Strengths.</strong> Journal-based continuous data protection, with restore points seconds apart, allows recovery to a point just before corruption. Automated failover orchestration with non-disruptive testing. Strong VMware integration.</p>
<p><strong>Limitations.</strong> Focused on virtualized workloads. Kubernetes protection requires a complementary tool.</p>
<p><strong>On premises and cloud coverage.</strong> On premises VMware vSphere. Cloud replication to AWS, Azure, Google Cloud, IBM Cloud, and Oracle Cloud.</p>
<h3>Commvault Cloud</h3>
<p><strong>What it is.</strong> An enterprise data management platform for backup, recovery, and data governance across on premises, cloud, and SaaS environments.</p>
<p><strong>Best for.</strong> Large enterprises that want one platform for data protection, compliance, and cyber resilience across diverse workloads.</p>
<p><strong>Strengths.</strong> Broad workload coverage including databases, VMs, containers, and SaaS applications. Built-in anomaly detection, cyber deception through ThreatWise, and on-demand cleanrooms for recovery testing.</p>
<p><strong>Limitations.</strong> Initial deployment and configuration can be complex. Smaller organizations may find the feature set more than they need.</p>
<p><strong>On premises and cloud coverage.</strong> On premises physical and virtual. AWS, Azure, and Google Cloud.</p>
<h3>Rubrik Security Cloud</h3>
<p><strong>What it is.</strong> A data security platform that combines backup, ransomware recovery, and data observability.</p>
<p><strong>Best for.</strong> Ransomware recovery and data security posture management across hybrid environments.</p>
<p><strong>Strengths.</strong> Immutable backups. Threat monitoring and anomaly detection in the backup workflow. Clean recovery after ransomware. A SaaS management plane reduces infrastructure to run.</p>
<p><strong>Limitations.</strong> Focused on data protection. Application-level HA and traffic routing are outside its scope.</p>
<p><strong>On premises and cloud coverage.</strong> On premises data centers and major public clouds.</p>
<h3>Cohesity</h3>
<p><strong>What it is.</strong> A data security and management platform that consolidates backup, recovery, file services, and analytics, and that took over Veritas’s data protection business, including NetBackup, in December 2024.</p>
<p><strong>Best for.</strong> Consolidating secondary storage and adding ransomware resilience to hybrid environments.</p>
<p><strong>Strengths.</strong> Reduces data fragmentation by unifying backup targets, file shares, and test and dev copies. Threat detection and anomaly scanning. Isolated recovery options.</p>
<p><strong>Limitations.</strong> Primarily a data platform. DR orchestration and application availability require separate solutions.</p>
<p><strong>On premises and cloud coverage.</strong> On premises appliances and software-defined deployments. Major public clouds.</p>
<h3>Veeam Kasten for Kubernetes</h3>
<p><strong>What it is.</strong> Kubernetes-native data protection for backup, DR, and mobility of containerized applications, formerly named Kasten K10.</p>
<p><strong>Best for.</strong> Kubernetes data protection across on premises and cloud clusters.</p>
<p><strong>Strengths.</strong> Application-aware snapshots and backups for Kubernetes workloads. Policy-based automation. Supports major Kubernetes distributions and cloud-managed Kubernetes services. Integrates with Veeam’s broader platform.</p>
<p><strong>Limitations.</strong> Scope is Kubernetes environments, including KubeVirt and OpenShift Virtualization VMs. Workloads outside Kubernetes need a separate backup product such as Veeam Data Platform.</p>
<p><strong>On premises and cloud coverage.</strong> Any supported Kubernetes cluster, on premises or cloud.</p>
<h3>Google Cloud Backup and DR Service</h3>
<p><strong>What it is.</strong> A Google Cloud managed service for centralized backup and recovery of workloads running in Google Cloud and hybrid environments.</p>
<p><strong>Best for.</strong> Organizations running workloads on Google Cloud, including Compute Engine, Google Cloud VMware Engine, Cloud SQL, AlloyDB, and self-managed databases.</p>
<p><strong>Strengths.</strong> Integrated with the Google Cloud console. Incremental-forever capture with instant volume mounting. Application-consistent protection for databases and VMs.</p>
<p><strong>Limitations.</strong> Backup and restore within Google Cloud; it does not orchestrate failover of a whole environment.</p>
<p><strong>On premises and cloud coverage.</strong> Google Cloud workloads, with limited hybrid support.</p>
<h2>Layer 3: Orchestrate recovery (DRaaS and cloud-native DR)</h2>
<p>Recovery orchestration tools restart replicated servers in a secondary environment in a defined order. AWS Elastic Disaster Recovery recovers only into AWS, and Azure Site Recovery recovers into Azure or a secondary on premises site, which is the main trade-off in <a href="https://controlplane.com/blog/post/cloud-vs-on-premises-disaster-recovery?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">cloud vs. on premises disaster recovery</a>.</p>
<h3>AWS Elastic Disaster Recovery</h3>
<p><strong>What it is.</strong> A cloud-native DR service that replicates on premises or cloud servers into AWS for automated failover and recovery.</p>
<p><strong>Best for.</strong> Organizations replicating on premises workloads to AWS as a DR target with minimal standby infrastructure cost.</p>
<p><strong>Strengths.</strong> Continuous block-level replication with RPOs of seconds and RTOs of minutes. A low-cost staging area holds replicated data until you launch recovery instances. Automated launch and recovery into AWS.</p>
<p><strong>Limitations.</strong> Recovery target is AWS only. Multi-cloud DR requires additional tooling.</p>
<p><strong>On premises and cloud coverage.</strong> Source: on premises physical servers, VMware vSphere, Microsoft Hyper-V, and other cloud providers. Target: AWS regions.</p>
<h3>Azure Site Recovery</h3>
<p><strong>What it is.</strong> Microsoft’s DR orchestration service for replicating and failing over VMs and physical servers.</p>
<p><strong>Best for.</strong> Organizations with Azure investments that need DR for VMware, Hyper-V, or physical servers.</p>
<p><strong>Strengths.</strong> Native integration with Azure services. Replication from on premises to Azure and between Azure regions. Recovery plans with customizable sequencing.</p>
<p><strong>Limitations.</strong> Recovery target is Azure, or a secondary on premises site for VMware, VMM-managed Hyper-V, and physical servers. Multi-cloud DR requires additional tooling.</p>
<p><strong>On premises and cloud coverage.</strong> Source: on premises VMware, Hyper-V, physical Windows and Linux servers, Azure VMs, and AWS Windows instances. Target: Azure regions or a secondary site.</p>
<h2>Layer 4: Plan and govern (BC management software)</h2>
<p>BC management software centralizes continuity plans, tracks business impact analyses, manages compliance obligations, and coordinates communication during incidents.</p>
<p><strong>Fusion Risk Management</strong> provides a cloud platform for business continuity, IT disaster recovery, crisis management, operational resilience, and third-party risk.</p>
<p><strong>Archer</strong> offers an integrated risk management platform with operational resilience modules for impact analysis, plan management, and incident response, deployable on premises or as SaaS.</p>
<p><strong>Riskonnect</strong> delivers risk management and business continuity planning tools focused on operational resilience, third-party risk, and regulatory compliance.</p>
<h2>How do the options compare?</h2>
<table>
<thead>
<tr>
<th>Option</th>
<th>Layer</th>
<th>What it protects</th>
<th>On premises</th>
<th>Public cloud</th>
<th>Typical recovery approach</th>
</tr>
</thead>
<tbody><tr>
<td>Control Plane</td>
<td>1</td>
<td>Service availability</td>
<td>Yes (MK8s, BYOK)</td>
<td>AWS, GCP, Azure, plus other providers through MK8s or BYOK</td>
<td>Active-active with automatic traffic rerouting</td>
</tr>
<tr>
<td>Red Hat OpenShift + ACM</td>
<td>1</td>
<td>Service availability</td>
<td>Yes</td>
<td>AWS, GCP, Azure</td>
<td>Policy-based placement, failover</td>
</tr>
<tr>
<td>InfoScale</td>
<td>1</td>
<td>Service availability</td>
<td>Yes</td>
<td>AWS, GCP, Azure, Oracle Cloud</td>
<td>Cluster failover</td>
</tr>
<tr>
<td>Linux Pacemaker</td>
<td>1</td>
<td>Service availability</td>
<td>Yes</td>
<td>AWS, GCP, Azure (via agents)</td>
<td>Cluster failover</td>
</tr>
<tr>
<td>Veeam Data Platform</td>
<td>2</td>
<td>Data</td>
<td>Yes</td>
<td>AWS, GCP, Azure</td>
<td>Restore, instant recovery</td>
</tr>
<tr>
<td>HPE Zerto</td>
<td>2</td>
<td>Data and VMs</td>
<td>Yes</td>
<td>AWS, GCP, Azure, and others</td>
<td>Continuous replication, failover</td>
</tr>
<tr>
<td>Commvault Cloud</td>
<td>2</td>
<td>Data</td>
<td>Yes</td>
<td>AWS, GCP, Azure</td>
<td>Restore, cleanroom recovery</td>
</tr>
<tr>
<td>Rubrik Security Cloud</td>
<td>2</td>
<td>Data</td>
<td>Yes</td>
<td>Major public clouds</td>
<td>Restore, clean recovery</td>
</tr>
<tr>
<td>Cohesity</td>
<td>2</td>
<td>Data</td>
<td>Yes</td>
<td>Major public clouds</td>
<td>Restore</td>
</tr>
<tr>
<td>Veeam Kasten</td>
<td>2</td>
<td>Data (Kubernetes)</td>
<td>Yes</td>
<td>AWS, GCP, Azure</td>
<td>Restore, mobility</td>
</tr>
<tr>
<td>Google Cloud Backup and DR</td>
<td>2</td>
<td>Workloads and data</td>
<td>Limited</td>
<td>GCP</td>
<td>Backup, restore, cloning</td>
</tr>
<tr>
<td>AWS Elastic Disaster Recovery</td>
<td>3</td>
<td>Servers and VMs</td>
<td>Source only</td>
<td>AWS (target)</td>
<td>Failover to AWS</td>
</tr>
<tr>
<td>Azure Site Recovery</td>
<td>3</td>
<td>Servers and VMs</td>
<td>Source or secondary site</td>
<td>Azure (target)</td>
<td>Failover to Azure or a secondary site</td>
</tr>
<tr>
<td>Fusion Risk Management</td>
<td>4</td>
<td>Plans and compliance</td>
<td>N/A</td>
<td>SaaS</td>
<td>Planning and governance</td>
</tr>
<tr>
<td>Archer</td>
<td>4</td>
<td>Plans and compliance</td>
<td>Yes (self-hosted option)</td>
<td>SaaS</td>
<td>Planning and governance</td>
</tr>
<tr>
<td>Riskonnect</td>
<td>4</td>
<td>Plans and compliance</td>
<td>N/A</td>
<td>SaaS</td>
<td>Planning and governance</td>
</tr>
</tbody></table>
<h2>What does a reference architecture for HA across on premises and cloud look like?</h2>
<p>A hybrid continuity design uses all four layers. Steps 1 to 3 follow the <a href="https://controlplane.com/blog/post/how-to-build-active-active-high-availability-across-regions-and-clouds?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">active-active high availability across regions and clouds</a> pattern on top of a <a href="https://controlplane.com/blog/post/how-to-deploy-hybrid-cloud?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">hybrid cloud deployment</a>.</p>
<ol>
<li><strong>Run the service active-active in the data center and at least one cloud region.</strong> Deploy workloads to a Control Plane GVC that includes an on premises location (through MK8s or BYOK) and one or more cloud regions. The application runs in every location of the GVC at once.</li>
<li><strong>Route users to healthy sites.</strong> On Control Plane, each workload’s global endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes, so users stop reaching a location that fails.</li>
<li><strong>Replicate data with a database built for multiple sites.</strong> Deploy a multi-location database from the Template Catalog so the data layer spans the same locations. CockroachDB replicates by consensus, and surviving a region loss needs three locations. pgEdge runs multi-master across locations with asynchronous replication and last-update-wins conflict resolution, which keeps writes local and fast, though writes not yet replicated when a location fails may need reconciliation. Synchronous replication between an on premises site and a distant cloud region adds a round trip to every write, so pick based on how strict consistency must be versus write latency.</li>
<li><strong>Keep immutable backups in a separate account.</strong> Use a Layer 2 tool such as Veeam, Rubrik, or Cohesity to keep immutable backups in a cloud account or air-gapped environment isolated from production credentials. Use object lock or WORM storage, separate credentials and MFA for the backup account, and a retention period longer than an attacker’s likely dwell time. Restore from these backups during tests. This protects against ransomware and data corruption that replication would spread.</li>
<li><strong>Orchestrate and test failover.</strong> For workloads outside the active-active footprint, such as legacy VMs, use AWS Elastic Disaster Recovery or Azure Site Recovery to automate failover. Many teams run non-disruptive DR tests quarterly and after major infrastructure changes; regulated industries may have their own required cadence.</li>
<li><strong>Document the plan.</strong> Keep runbooks, communication trees, and compliance records in a BC management platform, and update them after every test and every significant infrastructure change.</li>
</ol>
<h2>How do you choose a tool for each gap?</h2>
<p>Each row covers one gap, so most hybrid estates combine one tool per layer. Provider-level failover tools are compared in <a href="https://controlplane.com/blog/post/best-multi-cloud-failover-solutions-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">best multi-cloud failover solutions for 2026</a>.</p>
<table>
<thead>
<tr>
<th>If you need</th>
<th>Start with</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td>Keep customer-facing services up through a site or region loss</td>
<td>Control Plane</td>
<td>Active-active across on premises and cloud with automatic traffic routing and a 99.999% SLA for workloads with at least two replicas in at least two locations</td>
</tr>
<tr>
<td>Near-zero RPO for VMware workloads</td>
<td>HPE Zerto</td>
<td>Journal-based continuous data protection with point-in-time recovery</td>
</tr>
<tr>
<td>Broad backup across hypervisors and clouds</td>
<td>Veeam Data Platform</td>
<td>Coverage across hypervisors, physical servers, clouds, and SaaS, with immutable repositories</td>
</tr>
<tr>
<td>Ransomware recovery</td>
<td>Rubrik or Cohesity</td>
<td>Immutable backups with threat detection and clean recovery</td>
</tr>
<tr>
<td>On premises to one cloud DR</td>
<td>AWS Elastic Disaster Recovery or Azure Site Recovery</td>
<td>Low-cost standby with automated failover into one cloud</td>
</tr>
<tr>
<td>Kubernetes data protection</td>
<td>Veeam Kasten</td>
<td>Built for Kubernetes-native backup and mobility</td>
</tr>
<tr>
<td>Regulatory continuity planning</td>
<td>BC management software (Fusion, Archer, Riskonnect)</td>
<td>Central plan management, impact analysis, and compliance tracking</td>
</tr>
</tbody></table>
<h2>FAQ</h2>
<p>Answers to common questions about hybrid business continuity.</p>
<h3>What are the best business continuity solutions for scaling high availability services on premises and cloud?</h3>
<p>Control Plane for application availability. Veeam, HPE Zerto, Commvault, Rubrik, Cohesity, or Veeam Kasten for data protection. AWS Elastic Disaster Recovery or Azure Site Recovery for recovery orchestration. Fusion, Archer, or Riskonnect for BC planning. No single product covers all four layers.</p>
<h3>What are the best cloud operations solutions for addressing business continuity and disaster recovery?</h3>
<p>Pick by gap. Control Plane covers uptime across clouds and data centers. Backup platforms such as Veeam or Rubrik cover recoverability. AWS Elastic Disaster Recovery or Azure Site Recovery cover server failover into one cloud, and Azure Site Recovery can also fail over to a secondary on premises site. BC software such as Fusion covers governance.</p>
<h3>What is the difference between high availability and disaster recovery?</h3>
<p>High availability keeps a service running through component or site failures, typically with an RTO of seconds to a few minutes. Disaster recovery restores a service after events that exceed the HA design, such as a full site loss or ransomware, typically with an RTO of minutes to hours. Business continuity covers both, plus people and process.</p>
<h3>Do I still need backups if I run active-active?</h3>
<p>Yes. Active-active protects against infrastructure failures but not against data corruption or ransomware, so immutable backups in a separate account or air-gapped environment remain necessary.</p>
<h3>How do I fail over between an on premises data center and the cloud?</h3>
<p>At the application layer, run workloads in a Control Plane Global Virtual Cloud (GVC) that includes on premises and cloud locations, so traffic shifts automatically. For VM-level failover, replicate to a cloud DR target, trigger the DR plan when needed, and plan failback to the data center.</p>
<h3>What RTO and RPO should critical services target?</h3>
<p>Set RTO and RPO per service from a business impact analysis. Mission-critical customer-facing services commonly target near-zero RTO with an active-active application layer, and an RPO of zero to seconds with synchronous replication or continuous data protection.</p>
<h3>Is DRaaS enough for business continuity?</h3>
<p>No. DRaaS handles recovery orchestration but does not replace an HA layer, immutable backups, or BC governance, so it works alongside the other three layers.</p>
<h3>How does Control Plane support business continuity on premises and in the cloud?</h3>
<p>Control Plane runs each workload active-active across every location in its Global Virtual Cloud (GVC), which can mix on premises data centers, joined through Control Plane’s Managed Kubernetes (MK8s) or Bring Your Own Kubernetes (BYOK), with cloud regions on AWS, GCP, Azure, and Oracle Cloud. Each workload’s global endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes. Control Plane’s Cloud Wormhole connects workloads to TCP endpoints in private networks without opening inbound ports. Control Plane also handles Day 2 operations such as autoscaling, observability, and security. The 99.999% SLA applies to workloads running at least two replicas in at least two locations.</p>
<h3>Can I use Control Plane with my existing Kubernetes clusters?</h3>
<p>Yes. Control Plane’s Bring Your Own Kubernetes (BYOK) installs a few components into an existing cluster, which then registers as a Control Plane location. Add that location to a Global Virtual Cloud (GVC), and workloads run active-active across it alongside Control Plane-managed regions or Managed Kubernetes (MK8s) locations.</p>
<h3>How often should I test my business continuity plan?</h3>
<p>Quarterly is a common cadence for non-disruptive DR tests, with extra tests after significant infrastructure changes. Validate failover and restore separately, and update runbooks after each test.</p>
<p>To add the application availability layer to your business continuity stack, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/best-business-continuity-solutions-high-availability-on-premises-cloud?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-business-continuity-solutions-high-availability-on-premises-cloud">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Get Kubernetes Benefits Without Hiring a Platform Team]]></title><description><![CDATA[Get Kubernetes benefits without a platform team: compare self-managed, managed, and automated tiers, see who does the work, and pick a minimal stack.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-get-kubernetes-benefits-without-hiring-a-platform-team</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-get-kubernetes-benefits-without-hiring-a-platform-team</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Platform Engineering ]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Tue, 10 Nov 2026 01:06:15 GMT</pubDate><content:encoded><![CDATA[<p>Get the benefits of Kubernetes by buying the layers a platform team would build: an automated managed Kubernetes tier that runs nodes for you, or a platform that delivers the same outcomes with no cluster to operate. Control Plane is the unbreakable platform for running production workloads. It gives declarative deployments, autoscaling, self-healing, service discovery, mTLS, and multi-region failover with no Kubernetes cluster you have to operate, and when you need the Kubernetes API, Control Plane offers Managed Kubernetes (MK8s) and Bring Your Own Kubernetes (BYOK).</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>The Kubernetes outcomes are the same across deployment models. What changes is who does the operational work.</p>
<ul>
<li><strong>Benefits teams want:</strong> declarative deployments and rollbacks, autoscaling, self-healing, service discovery and load balancing, bin packing, portability across clouds, and a standard API with a large ecosystem.</li>
<li><strong>What automated managed tiers still leave to you:</strong> testing workloads against each Kubernetes version, third-party add-ons such as cert-manager and external-dns, pod-level autoscaling, secrets and identity bindings, tracing and alerting, multi-region failover, resource requests that drive cost, and on-call for workload configuration and add-ons.</li>
<li><strong>When serverless containers fit:</strong> stateless services on one cloud that need no custom controllers, CRDs, or Helm-based third-party software. Google Cloud Run, Amazon ECS with AWS Fargate, Azure Container Apps, and Control Plane serverless workloads all fit here.</li>
<li><strong>How Control Plane fits:</strong> Control Plane runs serverless, standard, stateful, and cron workloads on AWS, GCP, Azure, and Oracle Cloud, in one region or active-active across regions and clouds, and handles the Day 2 operations a platform team would own.</li>
</ul>
<h2>What are the benefits of Kubernetes?</h2>
<p>Teams commonly adopt Kubernetes for these seven outcomes.</p>
<ul>
<li><strong>Declarative deployments and rollbacks.</strong> You describe the desired state, and the system converges to it. Rolling back a Deployment is a single command.</li>
<li><strong>Autoscaling.</strong> The built-in Horizontal Pod Autoscaler adjusts replica counts on metrics you choose, and the Vertical Pod Autoscaler add-on adjusts resource requests.</li>
<li><strong>Self-healing.</strong> Failed containers restart automatically, and unhealthy pods are replaced.</li>
<li><strong>Service discovery and load balancing.</strong> Each Service gets a DNS name, ClusterIP Services get a stable virtual IP, and traffic is spread across healthy pods.</li>
<li><strong>Bin packing.</strong> The scheduler places pods to use CPU and memory across nodes efficiently.</li>
<li><strong>Portability across clouds.</strong> The same manifests run on any conformant cluster, in AWS, GCP, Azure, or on premises, with changes limited to cloud-specific pieces such as storage classes and load balancer settings.</li>
<li><strong>A large ecosystem and standard API.</strong> Operators, tools, and integrations speak the Kubernetes API, which helps with hiring and documentation.</li>
</ul>
<h2>Who does the work?</h2>
<p>Responsibility for each operational task, by deployment model:</p>
<table>
<thead>
<tr>
<th>Operational task</th>
<th>Self-managed Kubernetes</th>
<th>Standard managed (EKS, GKE Standard, AKS)</th>
<th>Automated tiers (GKE Autopilot, EKS Auto Mode, AKS Automatic)</th>
<th>Control Plane</th>
</tr>
</thead>
<tbody><tr>
<td>Version upgrades</td>
<td>You run and upgrade the API server, etcd, and scheduler</td>
<td>Provider runs the control plane. GKE Standard upgrades automatically by default; AKS upgrades manually unless you pick an upgrade channel; on EKS you start upgrades</td>
<td>Provider runs the control plane. GKE Autopilot and AKS Automatic upgrade automatically; on EKS Auto Mode you start the control plane upgrade and Auto Mode then replaces nodes. You test workloads and add-ons against each version</td>
<td>Control Plane operates and upgrades the runtime on Control Plane-provided compute; with MK8s, Control Plane operates the Kubernetes control plane</td>
</tr>
<tr>
<td>Nodes</td>
<td>You provision, patch, and scale nodes</td>
<td>You manage node groups or node pools; GKE Standard upgrades nodes by default, AKS applies node images through a channel, and on EKS managed node groups you roll out patched AMIs</td>
<td>Provider provisions, patches, and scales nodes</td>
<td>Control Plane provisions and scales compute; on Control Plane-provided compute there are no nodes to manage</td>
</tr>
<tr>
<td>Add-ons (ingress, cert-manager, external-dns, CNI)</td>
<td>You install, configure, and upgrade all of them</td>
<td>You install and upgrade most add-ons; some are offered as managed add-ons</td>
<td>Shared: provider manages networking and a load balancing or ingress integration; you install and upgrade third-party add-ons such as cert-manager and external-dns where you use them</td>
<td>Built in: global endpoint routing, automatic TLS certificates, mTLS, and a deny-by-default internal firewall; a custom domain needs a TXT record to prove ownership and a CNAME record at your DNS provider</td>
</tr>
<tr>
<td>Workload autoscaling</td>
<td>You configure HPA, install VPA, and run the cluster autoscaler</td>
<td>You configure HPA, install VPA where the provider does not offer it, and run the cluster autoscaler or Karpenter</td>
<td>Shared: provider scales nodes; you configure pod autoscaling</td>
<td>Control Plane autoscales on requests per second, CPU, memory, concurrency, latency, or KEDA event sources, depending on workload type</td>
</tr>
<tr>
<td>Secrets and cloud access</td>
<td>You manage secrets and IAM bindings</td>
<td>You manage secrets and set up workload identity (EKS Pod Identity or IRSA, GKE Workload Identity Federation, Microsoft Entra Workload ID)</td>
<td>You manage secrets and bind workload identities to cloud roles; GKE Autopilot and AKS Automatic preconfigure workload identity, and EKS Auto Mode includes the Pod Identity Agent</td>
<td>Built-in secrets and Control Plane’s Universal Cloud Identity (UCI) for cloud access</td>
</tr>
<tr>
<td>Observability</td>
<td>You deploy and run logging, metrics, and tracing</td>
<td>GKE Standard turns on Cloud Logging, Cloud Monitoring, and Managed Service for Prometheus by default; on EKS and AKS you enable or buy logging and metrics; tracing and alerting stay with you</td>
<td>Shared: GKE Autopilot and AKS Automatic turn on managed logs and Prometheus metrics; EKS Auto Mode leaves monitoring to you; tracing and alerting stay with you</td>
<td>Built-in logs and metrics in every location, with built-in tracing you turn on</td>
</tr>
<tr>
<td>Multi-region failover</td>
<td>You build multi-cluster failover</td>
<td>You build multi-cluster failover</td>
<td>You build multi-cluster failover</td>
<td>Built-in global endpoint with automatic failover between locations</td>
</tr>
<tr>
<td>Cost right-sizing</td>
<td>You choose instance types and reservations</td>
<td>You size node groups and reservations</td>
<td>Shared: provider picks nodes; your resource requests drive cost</td>
<td>Control Plane’s Capacity AI, where enabled, adjusts reserved CPU and memory between set minimums and maximums based on historical usage</td>
</tr>
<tr>
<td>On-call</td>
<td>Every layer</td>
<td>Nodes, networking, add-ons, and workloads</td>
<td>Workload configuration and add-ons</td>
<td>Control Plane operates the platform; you own your application code and configuration</td>
</tr>
</tbody></table>
<p>Each tier moves more rows from you to the provider. Even the most automated managed tiers leave workload-level operations, multi-region failover, and cost tuning with you. <a href="https://controlplane.com/blog/post/production-grade-infrastructure-without-platform-team?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Production-grade infrastructure without a platform team</a> lists the full set of production requirements.</p>
<h2>What do GKE Autopilot, EKS Auto Mode, and AKS Automatic handle?</h2>
<p>These are the most automated managed Kubernetes tiers from Google Cloud, AWS, and Azure.</p>
<p><strong>What they handle:</strong></p>
<ul>
<li>Node provisioning, patching, OS updates, and scaling</li>
<li>Core cluster components such as pod networking, cluster DNS, load balancer integration, and storage drivers</li>
<li>Version upgrades on GKE Autopilot and AKS Automatic, and node replacement after you start an upgrade on EKS Auto Mode</li>
<li>Managed logs and Prometheus metrics by default on GKE Autopilot and AKS Automatic</li>
</ul>
<p><strong>What still stays with you:</strong></p>
<ul>
<li><strong>Version compatibility.</strong> You test workloads, deprecated APIs, and third-party add-ons against each new Kubernetes version.</li>
<li><strong>Ingress and DNS beyond the defaults.</strong> You configure routes, TLS certificates, and DNS records, and on GKE Autopilot and EKS Auto Mode you install external-dns if you want automatic DNS records.</li>
<li><strong>Third-party add-ons.</strong> Helm charts and operators you install are yours to upgrade.</li>
<li><strong>Pod autoscaling.</strong> You configure the Horizontal Pod Autoscaler and Vertical Pod Autoscaler for each workload.</li>
<li><strong>Secrets and cloud access.</strong> You manage secrets and bind workload identities to cloud IAM roles.</li>
<li><strong>Tracing and alerting.</strong> You set up tracing and alerts, and on EKS Auto Mode, monitoring as a whole.</li>
<li><strong>Multi-region failover.</strong> Each cluster sits in one region. Multi-region takes several clusters, a global load balancer, and a data replication plan.</li>
<li><strong>Cost.</strong> You set resource requests on every pod. Overprovisioning raises cost, and underprovisioning causes throttling.</li>
<li><strong>On-call.</strong> The provider covers nodes. You are on call for workload configuration and add-ons.</li>
</ul>
<p>A small team can run a single-region production workload on an automated managed tier. The other items above still add work that a platform team would otherwise own, even in one region, and multi-region availability adds more.</p>
<h2>Kubernetes or serverless containers for a small team?</h2>
<p>Small teams with stateless services on one cloud should evaluate serverless containers before committing to Kubernetes.</p>
<p>Google Cloud Run runs containers with scaling to zero, built-in TLS, and request-based billing by default, with instance-based billing as an option. Amazon ECS with AWS Fargate runs containers without EC2 instances to manage, with Elastic Load Balancing, IAM, and CloudWatch integration. Azure Container Apps offers event-driven scaling, managed Dapr APIs, and managed ingress. Each gives revision-based or rolling deployments, health checks, autoscaling, and load balancing with no cluster to operate. Control Plane covers the same ground with serverless workloads and runs one workload definition active-active across regions and across AWS, GCP, Azure, and Oracle Cloud, with automatic failover between locations.</p>
<p><strong>When you need the Kubernetes API:</strong></p>
<ul>
<li>You depend on operators or custom resource definitions.</li>
<li>You deploy third-party software distributed as Helm charts that needs Kubernetes.</li>
<li>You need scheduling controls such as pod affinity, tolerations, or priority classes.</li>
<li>You want portability through the standard Kubernetes API.</li>
</ul>
<p>If any of these apply, you need the Kubernetes API. Control Plane’s Managed Kubernetes (MK8s) provides it, and Bring Your Own Kubernetes (BYOK) connects clusters you already run. <a href="https://controlplane.com/blog/post/best-kubernetes-alternatives?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Kubernetes alternatives for different team profiles</a> compares the options.</p>
<h2>A minimal stack for a team without platform engineers</h2>
<p>A team without platform engineers can run production containers on a stack that removes the tasks a platform team would handle.</p>
<ol>
<li><strong>Pick a managed runtime.</strong> Choose a platform such as Control Plane that handles infrastructure, scaling, and availability, an automated managed Kubernetes tier, or a serverless container service.</li>
<li><strong>Deploy with GitOps or CI pipelines.</strong> Argo CD or Flux reconciles desired state from Git, or your CI system pushes deployments. Either gives you auditability and rollback. <a href="https://controlplane.com/blog/post/argo-cd-vs-flux-gitops-environments-clusters?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Argo CD vs Flux for managing environments and clusters</a> compares the two GitOps tools.</li>
<li><strong>Use managed databases.</strong> Amazon RDS, Cloud SQL, or Azure Database for PostgreSQL keep backups and failover off your plate instead of running databases on a cluster yourself.</li>
<li><strong>Use managed observability.</strong> Datadog, Grafana Cloud, or your cloud provider’s monitoring give you logs, metrics, and alerting without running Prometheus, Loki, or Jaeger yourself.</li>
<li><strong>Centralize secrets.</strong> Use AWS Secrets Manager, Google Secret Manager, Azure Key Vault, or your platform’s built-in secrets, and keep credentials out of environment files and ConfigMaps.</li>
<li><strong>Assign one person to own upgrades on a calendar.</strong> A monthly or quarterly review of version upgrades, add-on updates, and dependency patches covers routine maintenance, with critical security patches applied when they are released. Any engineer with a checklist and a maintenance window can own this.</li>
</ol>
<p><a href="https://controlplane.com/blog/post/platform-engineering-without-a-platform-team?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Platform engineering without a platform team</a> covers this stack in practice.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, Azure, and Oracle Cloud Infrastructure (OCI), VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. On Control Plane-provided compute, there is no Kubernetes cluster you have to operate.</p>
<p>You deploy a workload, a container image with CPU, memory, and ports, to Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds. The workload runs in every location of that GVC from one definition.</p>
<p><strong>Day 2 operations.</strong> Control Plane handles Day 2 operations for you, including autoscaling, built-in observability, and security. Autoscaling works on requests per second, CPU, or memory for serverless, standard, and stateful workloads, on concurrency for serverless workloads, and on latency or KEDA event sources for standard and stateful workloads. Capacity AI, Control Plane’s right-sizing feature, adjusts a workload’s reserved CPU and memory between set minimums and maximums based on historical usage, where enabled. Capacity AI is not available with CPU-based or multi-metric autoscaling, or for GPU workloads.</p>
<p><strong>Networking and security.</strong> Internal traffic between workloads uses mTLS with a unique client certificate per workload, rotated hourly, and a new workload has inbound, outbound, and internal traffic closed until you allow it. Each workload’s built-in global endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes, and traffic moves automatically when a location fails. TLS certificates for your domains are created and renewed automatically.</p>
<p><strong>Secrets and cloud identity.</strong> Built-in secrets are available to every workload. Universal Cloud Identity gives workloads access to 600+ AWS, GCP, and Azure services through an IAM role or service-account grant instead of long-lived keys in your code, with short-lived, least-privilege credentials at runtime.</p>
<p><strong>Observability.</strong> Built-in logs and metrics run in every location. Tracing is built in and turned on per GVC or org.</p>
<p><strong>When you need the Kubernetes API.</strong> Control Plane’s Managed Kubernetes (MK8s) creates clusters as Control Plane locations, with Control Plane operating the Kubernetes control plane while worker nodes run in your AWS account, your GCP project, another supported provider’s account, or on servers you provide. Control Plane’s Bring Your Own Kubernetes (BYOK) connects clusters you already run. The Control Plane CLI command cpln helm install installs Helm charts whose templates define Control Plane resources, and the Template Catalog, Control Plane’s library of ready-to-install apps, packages common applications that way.</p>
<p><strong>Availability and compliance.</strong> The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be on different providers. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p><strong>Pricing.</strong> You pay for the CPU and memory a workload reserves, with no contracts or minimums. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure.</p>
<p><a href="https://controlplane.com/blog/post/best-kubernetes-management-platforms?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Best Kubernetes management platforms</a> compares management platforms. <a href="https://controlplane.com/blog/post/kubernetes-production-architecture-upgrades-autoscaling-postgres?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Kubernetes production architecture</a> covers upgrades, autoscaling, and databases.</p>
<h2>FAQ</h2>
<p>Teams without platform engineers usually ask about automated managed tiers, serverless containers, Helm, multi-region failover, cost, and compliance.</p>
<h3>How do I get Kubernetes benefits without hiring a platform team?</h3>
<p>Buy the layers a platform team would build. Choose an automated managed Kubernetes tier that runs nodes for you, or a platform such as Control Plane that delivers declarative deployments, autoscaling, self-healing, service discovery, mTLS, and multi-region failover with no cluster you have to operate. Add managed databases, managed observability, and a secrets manager, and give one engineer ownership of upgrades on a calendar.</p>
<h3>Do I need a platform team to run Kubernetes?</h3>
<p>No. Automated managed tiers and platforms that remove cluster operations let small teams run production workloads. You need one engineer accountable for upgrades, security patches, and cost reviews, working from a checklist.</p>
<h3>Is GKE Autopilot or EKS Auto Mode enough without a platform team?</h3>
<p>For a single-region deployment with modest requirements, yes. They provision, patch, and scale nodes, and GKE Autopilot also upgrades the cluster and turns on managed logs and metrics. You still own version compatibility testing, ingress routes and DNS, third-party add-ons, pod autoscaling, secrets, tracing and alerting, multi-region failover, resource requests, and workload on-call. A platform such as Control Plane takes those Day 2 operations off your team in a single region too, and adds multi-region failover when you need it.</p>
<h3>What parts of Kubernetes still need operating on managed Kubernetes?</h3>
<p>Even on the most automated tiers, you own third-party add-ons such as cert-manager and external-dns, workload autoscaling configuration, secrets and identity bindings, tracing and alerting, multi-region failover, resource requests that drive cost, Kubernetes version compatibility testing, and on-call for workload configuration and add-ons.</p>
<h3>Should a small team use Kubernetes or serverless containers?</h3>
<p>Serverless containers, if you run stateless services on one cloud and need no operators, CRDs, or Helm-based third-party software. Cloud Run, ECS with Fargate, Azure Container Apps, and Control Plane serverless workloads are simpler to operate than a cluster. Choose Kubernetes when you need its API, scheduling controls, or ecosystem.</p>
<h3>Can I use Helm charts without operating a cluster?</h3>
<p>Yes, for charts built from Control Plane resources. The Control Plane CLI command cpln helm install deploys charts whose templates define Control Plane workloads, GVCs, identities, and volume sets, with no cluster for you to run, and the Template Catalog packages common applications that way. Standard Kubernetes charts need the Kubernetes API. For software that needs a full Kubernetes cluster, Control Plane’s Managed Kubernetes (MK8s) gives you the Kubernetes API with Control Plane operating the Kubernetes control plane, and Bring Your Own Kubernetes (BYOK) connects a cluster you already run so Control Plane can deploy and manage workloads on it.</p>
<h3>How does Control Plane give Kubernetes benefits without a cluster to operate?</h3>
<p>You deploy a workload to a Control Plane Global Virtual Cloud (GVC), and it runs in every location of that GVC from one definition on Control Plane-provided compute, with no Kubernetes cluster you have to operate. Autoscaling, self-healing, internal service discovery, mTLS, built-in observability, secrets, and global traffic routing come with the platform. For the Kubernetes API itself, MK8s and BYOK provide it.</p>
<h3>What is the cheapest way to run containers in production without a platform team?</h3>
<p>Run on a platform that bills for what workloads reserve and includes the layers you would otherwise pay engineers to build. On Control Plane, you pay for the CPU and memory a workload reserves, with no contracts or minimums, and Capacity AI, where enabled, adjusts reserved CPU and memory between set minimums and maximums based on historical usage. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Autoscaling, observability, secrets, and global failover are built in, in one region or many. Keep state in a managed database or a multi-location database from the Template Catalog.</p>
<h3>How do I handle multi-region failover without a platform team?</h3>
<p>Use a platform with built-in multi-region routing. On managed Kubernetes, failover takes multiple clusters, a global load balancer, data replication, and custom health checks. On Control Plane, each workload’s endpoint uses DNS to route clients to the nearest location where the workload passes its readiness probes, so traffic fails over automatically, and workloads with at least two replicas in at least two locations are covered by the 99.999% SLA.</p>
<h3>What security and compliance standards matter for a team without platform engineers?</h3>
<p>The ones your customers and regulators require, such as PCI DSS, SOC 2, and HIPAA. Control Plane’s platform is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. On managed Kubernetes, the provider secures the infrastructure, and you own RBAC, network policies, secrets, and application security.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/kubernetes-benefits-without-platform-team?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-benefits-without-platform-team">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Roll Back a Bad Change and Build Self-Healing Infrastructure: Safe Deploys, Smaller Blast Radius, Faster Recovery]]></title><description><![CDATA[How to roll back a bad change and build self-healing infrastructure: safe deploys, a smaller blast radius, and faster recovery.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-roll-back-a-bad-change-and-build-self-healing-infrastructure-safe-deploys-smaller-blast-radius-faster-recovery</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-roll-back-a-bad-change-and-build-self-healing-infrastructure-safe-deploys-smaller-blast-radius-faster-recovery</guid><category><![CDATA[Devops]]></category><category><![CDATA[SRE]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 22:57:22 GMT</pubDate><content:encoded><![CDATA[<p>Roll back a bad change by redeploying the last known-good version through the same pipeline that shipped the broken one, which only works if every deploy is versioned, health-gated, and reversible, and if schema and data changes were made backward compatible first. Reduce how often you need to roll back by shipping in small health-checked stages and running workloads across more than one failure domain, which is how Control Plane runs workloads: rolling updates where the previous version keeps serving, and active-active across every location in Control Plane’s Global Virtual Cloud (GVC), a set of locations a workload runs across.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>Versioned, reversible deploys come first.</strong> Store every release as an immutable artifact. Rollback should take minutes.</li>
<li><strong>Roll back data last, and carefully.</strong> Destructive schema migrations and data changes cannot be undone with a traffic switch. Use expand-and-contract migrations so the old code still works while the new schema is live.</li>
<li><strong>Health-gated progressive delivery limits damage.</strong> Rolling updates, canary releases, blue/green switches, and feature flags each trade cost and complexity for faster rollback and smaller blast radius.</li>
<li><strong>Self-healing handles routine failures automatically.</strong> Health checks, automatic restarts, autoscaling, circuit breakers, and automatic traffic failover handle the failures that do not need a person.</li>
<li><strong>Blast radius shrinks with failure domains.</strong> Running across multiple availability zones, regions, or providers removes the single points of failure that turn a provider incident into your outage.</li>
<li><strong>Control Plane ties these together.</strong> Readiness-gated rolling updates, rollback through its MCP server, blue/green on domain routes, a tamper-proof audit trail, and active-active across every location in a GVC.</li>
</ul>
<h2>How do I roll back a bad AI-generated change in production?</h2>
<p>Many outages start with a change: a bad deploy, a config push, a migration, or an AI-generated edit nobody fully reviewed. These steps apply whether a human or an AI agent wrote the change.</p>
<h3>Step 1: Detect</h3>
<p>Tie alerts to the signals that matter: error rate, request latency, CPU or memory saturation, and failed health checks. Synthetic monitors and real-user metrics catch what log-based alerts miss. The goal is to know something is wrong within one to two minutes of the change reaching production.</p>
<h3>Step 2: Decide whether to roll back or fix forward</h3>
<p>If the root cause is obvious and the fix is a one-line, well-tested change, fix forward. In every other case, roll back first, then investigate.</p>
<h3>Step 3: Roll back</h3>
<p>The mechanism depends on the change type:</p>
<ul>
<li><strong>Application image:</strong> Redeploy the last known-good image digest through the same CI/CD pipeline or GitOps reconciliation loop.</li>
<li><strong>Config or environment variable:</strong> Revert the commit in the config repo or redeploy the previous config version.</li>
<li><strong>Feature flag:</strong> Toggle the flag off. This is the fastest rollback path because it requires no deploy.</li>
<li><strong>Infrastructure as code:</strong> Revert the commit and let the reconciliation loop or pipeline apply the previous state.</li>
<li><strong>Domain route (blue/green):</strong> Point the route back to the previous workload.</li>
</ul>
<p>On Control Plane, an AI assistant can roll a workload back to its previous image (environment and config stay as they are) in one call through Control Plane’s MCP server, which makes the change, waits for the workload to report ready, and reports the result.</p>
<h3>Step 4: Verify</h3>
<p>Rollback is not complete until error rates, latency, and health probes return to baseline. Check business-critical user journeys, not just infrastructure metrics.</p>
<h3>Step 5: Follow up</h3>
<p>Preserve logs and traces. Run a blameless postmortem. Add a test that would have caught the failure before production.</p>
<h3>Change types and how each is undone</h3>
<table>
<thead>
<tr>
<th>Change type</th>
<th>Rollback method</th>
<th>Speed</th>
<th>Hard part</th>
</tr>
</thead>
<tbody><tr>
<td>Application image</td>
<td>Redeploy previous image digest</td>
<td>Minutes</td>
<td>Data or schema written by the new version must still work with the old version</td>
</tr>
<tr>
<td>Config / env vars</td>
<td>Revert config commit, redeploy</td>
<td>Minutes</td>
<td>Finding which variable caused it</td>
</tr>
<tr>
<td>Feature flags</td>
<td>Toggle off</td>
<td>Instant</td>
<td>Flag dependencies and stale flags</td>
</tr>
<tr>
<td>Infrastructure as code</td>
<td>Revert commit, apply</td>
<td>Minutes</td>
<td>Stateful resources like databases</td>
</tr>
<tr>
<td>Database schema migration</td>
<td>Reverse migration or expand-and-contract</td>
<td>Minutes to hours</td>
<td>Destructive changes cannot be simply reversed</td>
</tr>
<tr>
<td>Data changes</td>
<td>Restore from backup or replay corrective writes</td>
<td>Hours</td>
<td>May require point-in-time recovery</td>
</tr>
<tr>
<td>Secrets rotation</td>
<td>Rotate back to previous secret version</td>
<td>Minutes</td>
<td>Old secret may already be revoked</td>
</tr>
</tbody></table>
<h3>The hard part: destructive schema and data changes</h3>
<p>A column drop, a table rename, or a data backfill that overwrites values cannot be undone by redeploying an image. The solution is expand-and-contract (parallel change) migrations:</p>
<ol>
<li><strong>Expand:</strong> Add the new column or table alongside the old one. Deploy code that writes to both and still reads the old one.</li>
<li><strong>Migrate:</strong> Backfill existing data into the new structure.</li>
<li><strong>Switch reads:</strong> Deploy code that reads the new structure.</li>
<li><strong>Contract:</strong> Drop the old column only after rollback to the old version is no longer needed.</li>
</ol>
<p>This pattern keeps the previous application version compatible with the current schema at every step.</p>
<h3>Guardrails for AI-generated changes</h3>
<p>AI coding assistants and infrastructure agents accelerate development, but they also produce changes that humans may not fully read before merging. Add these guardrails:</p>
<ul>
<li>Require human review for any change that touches a production path.</li>
<li>Keep diffs small. A 2,000-line AI-generated PR is effectively unreviewed.</li>
<li>Run the full test suite in CI before merge.</li>
<li>Keep an audit trail that shows whether a person or an agent made a change, and who approved it.</li>
</ul>
<p>On Control Plane, a tamper-proof audit trail records who changed which workload and when, including service accounts and AI agents using the MCP server (<code>cpln workload audit</code>), and the MCP server offers a read-only profile for agents that should observe without changing anything. For more on agent permissions, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">how to let AI agents touch production infrastructure safely</a>.</p>
<h2>Deploy patterns that limit damage</h2>
<p>The right pattern depends on how fast you need to roll back, your infrastructure budget, and how mature your observability is.</p>
<h3>Rolling updates</h3>
<p>Replace instances of the old version with the new version incrementally. If new replicas fail their readiness checks, the rollout stalls while old replicas keep serving. Kubernetes does not roll back automatically (you run <code>kubectl rollout undo</code>), and tools like Argo Rollouts add automated rollback. Rolling updates are also the default on Control Plane, where rollout options such as <code>minReadySeconds</code>, <code>maxUnavailableReplicas</code>, and <code>maxSurgeReplicas</code> control how many replicas turn over at once.</p>
<h3>Blue/green deployments</h3>
<p>Run two full environments. Route traffic to one while deploying to the other, cut over when the new environment is healthy, and roll back by switching the route back. On Control Plane, blue/green uses domain routes, and traffic returns to the previous workload within seconds of pointing the route back.</p>
<h3>Canary releases</h3>
<p>Send a small share of traffic to the new version, watch error rates and latency, and promote or roll back based on the results. <a href="https://argoproj.github.io/rollouts/">Argo Rollouts</a> and <a href="https://flagger.app/">Flagger</a> automate canary analysis in Kubernetes.</p>
<h3>Feature flags</h3>
<p>Decouple deployment from release. Ship code dark, then enable it for specific users or percentages, and roll back by toggling the flag. <a href="https://openfeature.dev/">OpenFeature</a> provides a vendor-neutral API for flag evaluation.</p>
<table>
<thead>
<tr>
<th>Pattern</th>
<th>How it works</th>
<th>Rollback speed</th>
<th>Extra infrastructure cost</th>
<th>Best for</th>
</tr>
</thead>
<tbody><tr>
<td>Rolling update</td>
<td>Replace replicas incrementally</td>
<td>Minutes</td>
<td>Minimal (temporary surge replicas)</td>
<td>Most stateless workloads</td>
</tr>
<tr>
<td>Blue/green</td>
<td>Two full environments, traffic switch</td>
<td>Seconds</td>
<td>Up to 2x compute while both run</td>
<td>Workloads needing instant rollback</td>
</tr>
<tr>
<td>Canary</td>
<td>Small traffic slice to new version</td>
<td>Seconds (shift traffic back)</td>
<td>Minimal</td>
<td>High-traffic services needing validation</td>
</tr>
<tr>
<td>Feature flags</td>
<td>Toggle functionality at runtime</td>
<td>Instant</td>
<td>Flag service only</td>
<td>Decoupling deploy from release</td>
</tr>
<tr>
<td>Progressive delivery</td>
<td>Canary plus flags plus automated gates</td>
<td>Seconds to minutes</td>
<td>Varies</td>
<td>Teams with mature observability</td>
</tr>
</tbody></table>
<p>The hyperscalers offer managed versions of these patterns. <a href="https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html">AWS CodeDeploy</a> supports in-place (rolling) deployments for EC2 and on-premises servers, blue/green deployments for EC2, and canary, linear, or all-at-once traffic shifting for Lambda and ECS. <a href="https://cloud.google.com/deploy/docs/overview">Google Cloud Deploy</a> provides managed continuous delivery to GKE, Cloud Run, and GKE attached clusters, with approvals, canary deployments, and rollback. <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs">Azure Pipelines</a> supports multi-stage pipelines with approvals and checks, and deployment strategies whose on-failure hooks can run rollback steps.</p>
<h2>Which CI/CD and IaC solutions offer the best disaster recovery and self-healing patterns for cloud native applications?</h2>
<p>The patterns matter more than the vendor. Together, they recover from failed deploys, infrastructure drift, and the loss of an environment.</p>
<h3>GitOps reconciliation</h3>
<p><a href="https://argo-cd.readthedocs.io/">Argo CD</a> and <a href="https://fluxcd.io/">Flux</a> continuously compare a cluster with the desired state declared in Git. When someone edits a resource by hand or a deploy goes wrong, reconciliation restores the declared state (Flux does this by default; Argo CD requires automated sync with self-heal enabled). Rolling back means reverting a commit.</p>
<h3>Immutable images and infrastructure as code</h3>
<p>Reference every release by its content-addressable digest, not a mutable tag like <code>latest</code>, so a rollback redeploys exactly the same binary. <a href="https://www.terraform.io/">Terraform</a>, <a href="https://opentofu.org/">OpenTofu</a>, and <a href="https://www.pulumi.com/">Pulumi</a> support remote state backends, most with state locking, to prevent concurrent changes. Back up state files, because without valid state these tools cannot tell what exists. Control Plane ships its own Terraform and Pulumi providers, so workload definitions can go through the same review process as the rest of your infrastructure, and workloads can be promoted from a staging GVC to a production GVC.</p>
<table>
<thead>
<tr>
<th>Pattern</th>
<th>What it recovers from</th>
<th>Tool examples</th>
<th>Gaps</th>
</tr>
</thead>
<tbody><tr>
<td>GitOps reconciliation</td>
<td>Manual edits, failed deploys, config drift</td>
<td>Argo CD, Flux</td>
<td>Does not recover data or external dependencies</td>
</tr>
<tr>
<td>Immutable images</td>
<td>Overwritten tags</td>
<td>Any container registry with digest pinning</td>
<td>Requires disciplined references</td>
</tr>
<tr>
<td>IaC with remote state</td>
<td>Infrastructure drift, accidental deletion</td>
<td>Terraform, OpenTofu, Pulumi</td>
<td>State loss if backups are missing</td>
</tr>
<tr>
<td>Drift detection</td>
<td>Silent manual changes</td>
<td><code>terraform plan -refresh-only</code>, <code>pulumi refresh --preview-only</code></td>
<td>Detection only; remediation is separate</td>
</tr>
<tr>
<td>Environment promotion</td>
<td>Staging and production mismatch</td>
<td>CI/CD pipelines, GitOps promotion</td>
<td>Does not cover data differences</td>
</tr>
<tr>
<td>Artifact retention</td>
<td>Need to roll back to an old version</td>
<td>Registry retention policies</td>
<td>Storage cost grows over time</td>
</tr>
</tbody></table>
<p>GitOps restores compute and configuration. It does not restore databases, third-party API state, or DNS records managed outside the reconciliation loop. Those need their own backup and recovery plan.</p>
<h2>Self-healing infrastructure</h2>
<p>Self-healing means the system detects an unhealthy condition and takes a bounded corrective action without waiting for a human. Each mechanism handles a specific failure mode.</p>
<h3>Health checks</h3>
<ul>
<li><strong>Liveness probes</strong> answer “is this process stuck?” If a liveness check fails repeatedly, the kubelet or platform restarts the container.</li>
<li><strong>Readiness probes</strong> answer “can this replica handle traffic?” A replica that fails readiness stops receiving traffic but is not restarted.</li>
<li><strong>Startup probes</strong> give slow-starting applications time to initialize before liveness and readiness checks begin.</li>
</ul>
<p>On Control Plane, readiness and liveness probes can be HTTP, gRPC, TCP, or a command, and they decide when a replica takes traffic and when it is restarted.</p>
<h3>Restarts, rescheduling, and autoscaling</h3>
<p>When a container crashes or a node fails, the orchestrator restarts the container or reschedules it onto a healthy node. Horizontal autoscaling adds replicas as demand rises, and right-sizing adjusts CPU and memory to actual usage. On Control Plane, built-in autoscaling and Capacity AI, Control Plane’s right-sizing of CPU and memory based on historical usage, handle both.</p>
<h3>Circuit breakers, timeouts, and retries with backoff</h3>
<p>When a downstream dependency fails, circuit breakers stop sending it traffic, which prevents cascading failures. Timeouts bound how long a request waits. Retries with exponential backoff and jitter recover from transient errors without overwhelming the failing service. Retry only idempotent operations, or use idempotency keys, to avoid duplicate side effects.</p>
<h3>Automatic traffic failover between locations</h3>
<p>Restarting a container fixes a process-level failure on one node. Failing traffic over to another location fixes a zone-level or region-level failure, and that requires workloads already running in more than one location plus a global load balancer that detects location health. On Control Plane, a workload deployed to a GVC runs active-active in every location of that GVC, and a global endpoint routes clients to the nearest healthy location. Priority routing tiers (a lower-priority tier receives traffic only when every location in the higher-priority tier is unavailable) and latency offsets let you shape where traffic goes.</p>
<h2>How do I reduce the blast radius of a cloud provider outage?</h2>
<p>Blast radius applies to your own changes and to your provider’s failures.</p>
<h3>Staged rollouts by location</h3>
<p>Deploy to one location first, watch it, then promote to the rest. A bad change then reaches only a fraction of your traffic.</p>
<h3>Cell-based architecture</h3>
<p>Partition users or tenants into independent cells, each with its own compute, data, and dependencies, so a failure in one cell does not reach the others.</p>
<h3>Availability zones, regions, and providers</h3>
<ul>
<li><strong>Multiple availability zones</strong> protect against single-datacenter failures. Many regional managed services, such as S3 and DynamoDB, replicate across zones automatically, but EC2 instances, EBS volumes, and single-AZ RDS databases are zonal unless you configure Multi-AZ.</li>
<li><strong>Multiple regions</strong> protect against region-wide outages, which are rarer but have much higher impact.</li>
<li><strong>Multiple providers</strong> protect against provider-wide failures and reduce dependence on any single vendor.</li>
</ul>
<p>Each step adds complexity and cost; see <a href="https://controlplane.com/blog/post/active-active-vs-active-passive-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">active-active vs active-passive cost</a> for the numbers.</p>
<h3>Hidden single-region dependencies</h3>
<p>Your compute may be multi-region, but if your DNS provider, identity provider, CI/CD system, secrets manager, container registry, or a provider management API is pinned to one region, that region is still a single point of failure. Audit every dependency in the request path.</p>
<h3>Rate limiting, load shedding, and kill switches</h3>
<p>When a failure reduces capacity, rate limiting and load shedding protect the remaining healthy capacity; shed low-priority traffic first. A kill switch is a pre-built way to disable a feature, a dependency call, or a traffic path instantly, and it should be tested regularly.</p>
<p>For the region-failure playbook, see <a href="https://controlplane.com/blog/post/keep-app-online-aws-region-outage?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">how to keep your app online when an AWS region goes down</a>. Control Plane’s <a href="https://controlplane.com/blog/post/cloud-outage-tracker?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">cloud outage tracker</a> records how often these events happen.</p>
<h2>What is the best cloud architecture model that delivers the highest level of resilience and availability?</h2>
<p>The answer depends on how much downtime and data loss your business can tolerate, so start from your recovery targets.</p>
<h3>How do I design cloud resilience and failover to meet a specific RTO and RPO?</h3>
<p>Recovery time objective (RTO) is how fast you need to be back. Recovery point objective (RPO) is how much data you can afford to lose. Your data replication strategy sets RPO; compute architecture does not.</p>
<table>
<thead>
<tr>
<th>RTO target</th>
<th>RPO target</th>
<th>Architecture</th>
<th>Relative cost</th>
</tr>
</thead>
<tbody><tr>
<td>Hours</td>
<td>Hours</td>
<td>Backup and restore</td>
<td>Lowest</td>
</tr>
<tr>
<td>Tens of minutes</td>
<td>Minutes</td>
<td>Pilot light (minimal standby)</td>
<td>Low</td>
</tr>
<tr>
<td>Minutes</td>
<td>Seconds to minutes</td>
<td>Warm standby (scaled-down running copy)</td>
<td>Moderate</td>
</tr>
<tr>
<td>Seconds</td>
<td>Near-zero</td>
<td>Multi-region active-active</td>
<td>High</td>
</tr>
<tr>
<td>Seconds</td>
<td>Near-zero</td>
<td>Multi-provider active-active</td>
<td>Highest</td>
</tr>
</tbody></table>
<p>Near-zero RPO requires synchronous or near-synchronous data replication. Active-active gives the lowest RTO because failover takes only as long as health checks need to mark a location unhealthy and reroute traffic, typically seconds, with no standby to start or scale up. A multi-region compute layer paired with a single-region database does not give you multi-region resilience, so databases need their own replication and rollback design.</p>
<h2>How Control Plane approaches change safety and recovery</h2>
<p>Control Plane is the platform for running unbreakable apps and agents. It runs serverless, standard, stateful, and cron workloads on AWS, GCP, and Azure, on Kubernetes clusters you already run, and on your own machines turned into managed locations, including on premises. Many teams run it in one cloud as well.</p>
<p>Every workload update is a rolling update. The previous version keeps serving while the new one starts, and the update completes only when the new version reports ready. If the new version never becomes ready, the rollout stops and the previous version keeps handling traffic until you fix the workload or roll it back.</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be two regions of one cloud or locations on different providers.</p>
<p>During the October 20, 2025 AWS us-east-1 outage, which lasted about 15 hours, Control Plane customers with us-east-1 in their GVC had no downtime, and their workloads were “active and running in healthy locations within 10 seconds,” according to <a href="https://controlplane.com/blog/post/beyond-backups-designing-systems-that-survive-the-inevitable?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">Control Plane internal incident telemetry</a>.</p>
<p>Control Plane handles Day 2 operations for you, including autoscaling, Capacity AI right-sizing, built-in observability, and security, with no Kubernetes cluster you have to operate. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p>For the broader checklist, see <a href="https://controlplane.com/blog/post/prevent-website-downtime?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">how to prevent website downtime</a>.</p>
<h2>FAQ</h2>
<p>These answers cover the questions teams ask most about rollback, self-healing, and blast radius.</p>
<h3>How do I roll back a bad deployment quickly?</h3>
<p>Redeploy the last known-good image or config through the same pipeline that shipped the broken version. That requires every release to be an immutable, versioned artifact and a pipeline that can deploy a specific version, not just the latest.</p>
<h3>What is the difference between rolling back and fixing forward?</h3>
<p>Rolling back restores the previous version. Fixing forward ships a new version that corrects the problem. Roll back when the root cause is unclear or the fix is not trivial, and fix forward only when the fix is small, tested, and faster than a rollback.</p>
<h3>How do I roll back a database migration?</h3>
<p>Use expand-and-contract migrations. Add the new columns or tables alongside the old ones, deploy code that writes to both and reads the old one, backfill, switch reads to the new structure, then drop the old structure once rollback is no longer needed. Destructive changes like column drops or renames cannot be reversed by redeploying application code.</p>
<h3>Which deploy pattern has the fastest rollback?</h3>
<p>Feature flags are the fastest because toggling a flag is instant and needs no deploy. Blue/green and canary rollbacks take seconds because only traffic moves. Rolling updates take longer because replicas must be replaced.</p>
<h3>What is self-healing infrastructure?</h3>
<p>Self-healing infrastructure detects unhealthy conditions and takes bounded corrective actions: restarting a failed container, removing an unhealthy replica from traffic, scaling up to meet demand, or failing traffic over to a healthy location. It does not replace human judgment for complex or ambiguous failures.</p>
<h3>How do I reduce the blast radius of a cloud provider outage?</h3>
<p>Run workloads across more than one availability zone, region, or provider, and remove hidden single-region dependencies like DNS, identity, CI/CD, secrets, and container registries. On Control Plane, workloads run active-active across every location in a GVC, and traffic fails over to healthy locations automatically.</p>
<h3>What RTO and RPO can I achieve with multi-region active-active?</h3>
<p>Multi-region active-active delivers an RTO measured in seconds. RPO near zero requires synchronous replication, which adds cross-region write latency; asynchronous replication gives an RPO equal to the replication lag, usually seconds.</p>
<h3>How do I make AI-generated changes safer in production?</h3>
<p>Require human review on production paths, keep diffs small, run tests before merge, deploy in health-gated stages, and keep an audit trail of what each agent changed. On Control Plane, agents using the MCP server act through the same API as everyone else, so every change lands in the audit trail, and a read-only profile is available for agents that should only observe.</p>
<p>To run workloads active-active with readiness-gated rollouts, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/roll-back-bad-change-self-healing-infrastructure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=roll-back-bad-change-self-healing-infrastructure">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Run Regulated Apps in the Cloud: SOC 2, HIPAA, and PCI DSS Platforms, Data Residency With Failover, and a Compliance Checklist]]></title><description><![CDATA[How to run regulated apps in the cloud: SOC 2, HIPAA, and PCI DSS platforms, data residency with failover, and a compliance checklist.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-run-regulated-apps-in-the-cloud-soc-2-hipaa-and-pci-dss-platforms-data-residency-with-failover-and-a-compliance-checklist</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-run-regulated-apps-in-the-cloud-soc-2-hipaa-and-pci-dss-platforms-data-residency-with-failover-and-a-compliance-checklist</guid><category><![CDATA[compliance ]]></category><category><![CDATA[Security]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 22:50:29 GMT</pubDate><content:encoded><![CDATA[<p>A compliant application platform gives you audited infrastructure controls, but compliance is shared: you still need your own controls for data classification, identity, secrets management, and logging. To keep data in one country with failover, run in at least two locations inside that country and ensure every replica, backup, and log stays there. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant, and it runs a workload only in the locations you choose across AWS, GCP, Azure, and your own servers.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<p>This is general guidance, not legal or audit advice.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>What platform compliance covers.</strong> SOC 2 Type II, HIPAA eligibility, and PCI DSS attestations apply to the platform’s services, not your application logic or data handling.</li>
<li><strong>How to verify a platform ’s claims.</strong> Request the SOC 2 Type II report under NDA, the PCI DSS Attestation of Compliance, and a signed BAA. Check which services and regions are in scope.</li>
<li><strong>Data residency with failover.</strong> Choose two or more locations inside the same country, run active-active or active-passive between them, and pin replicas, backups, logs, and keys to those locations.</li>
<li><strong>The compliance checklist.</strong> Classify data, enforce region allow-lists with policy as code, manage secrets outside your codebase, isolate tenants, log everything immutably, and document AI data flows.</li>
<li><strong>How Control Plane fits.</strong> On Control Plane, a workload runs only in the locations of Control Plane’s Global Virtual Cloud (GVC), a set of locations a workload runs across, so you control data residency by choosing locations. Workloads deploy active-active across every location in a GVC, and a global endpoint routes clients to the nearest healthy location.</li>
</ul>
<h2>Which application platforms are SOC 2 Type II, HIPAA, and PCI DSS compliant?</h2>
<p>AWS, Google Cloud, and Azure each hold SOC 2 Type II reports and PCI DSS Level 1 service provider attestations, and each signs a BAA covering a published list of HIPAA-eligible services. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. Its SOC 2 Type II audit was completed by Prescient Assurance, and its SOC 2 Type II report and PCI DSS Attestation of Compliance are available from <a href="mailto:support@controlplane.com">support@controlplane.com</a>, and its docs publish a PCI Responsibility Matrix.</p>
<h3>What each framework means for a platform buyer</h3>
<p><strong>SOC 2 Type II</strong> is an attestation report from an independent CPA firm. The auditor tests whether a platform’s controls operated effectively over a review period, commonly three to twelve months. A Type I report covers only control design at a single point in time. Platforms renew the report each year, so check the period end date and ask for a bridge letter if it ended months ago. A badge on a marketing page shows none of the scope or exceptions, so ask for the report itself.</p>
<p><strong>HIPAA</strong> has no official certification program. The U.S. Department of Health and Human Services does not certify software or cloud platforms as “HIPAA compliant.” Instead, look for two things: a signed Business Associate Agreement (BAA), which sets out how the platform must protect electronic protected health information (ePHI), and a clear list of HIPAA-eligible services. Under the HITECH Act, a platform that handles ePHI as a business associate is also directly liable for complying with the HIPAA Security Rule. Any service not on that list should not touch ePHI.</p>
<p><strong>PCI DSS</strong> compliance is documented in an Attestation of Compliance (AoC), the official PCI Security Standards Council form summarizing the results of an assessment. Platforms that process, store, or transmit cardholder data are assessed as service providers. Card brands such as Visa and Mastercard classify a service provider as Level 1 when it handles more than 300,000 card transactions a year, and Level 1 requires an annual assessment by a Qualified Security Assessor (QSA) and a Report on Compliance. The AoC states which services and environments are in scope.</p>
<h3>How to verify a platform’s compliance</h3>
<ol>
<li>Request the <strong>SOC 2 Type II report</strong> under NDA. Read the auditor’s opinion, the description of the system boundary, and any exceptions noted.</li>
<li>Request the <strong>PCI DSS Attestation of Compliance</strong>. Confirm the service provider level and check which services and data center regions are covered.</li>
<li>Request a signed <strong>BAA</strong> before any ePHI touches the platform. Confirm the list of HIPAA-eligible services.</li>
<li>Check <strong>scope</strong> : which regions, which services, and which deployment models are included. A platform may be compliant in some regions but not others.</li>
</ol>
<p>AWS, Google Cloud, and Azure each publish compliance programs with lists of in-scope services. AWS maintains its <a href="https://aws.amazon.com/compliance/programs/">compliance programs page</a>, Google Cloud publishes its <a href="https://cloud.google.com/security/compliance/offerings">compliance offerings</a>, and Azure documents its <a href="https://learn.microsoft.com/en-us/azure/compliance/offerings/">compliance offerings</a>.</p>
<h2>Who owns which compliance controls, the platform or the customer?</h2>
<p>The table below maps common control areas to who typically owns them.</p>
<table>
<thead>
<tr>
<th>Control Area</th>
<th>Typically Responsible</th>
<th>Evidence to Collect</th>
</tr>
</thead>
<tbody><tr>
<td>Infrastructure security (host OS, hypervisor, physical)</td>
<td>Platform</td>
<td>SOC 2 Type II report, penetration test summaries</td>
</tr>
<tr>
<td>Network segmentation and firewalls</td>
<td>Shared</td>
<td>Network architecture diagrams, firewall rule exports</td>
</tr>
<tr>
<td>Identity and access management</td>
<td>Customer</td>
<td>SSO configuration, MFA enforcement logs, RBAC policies, access reviews</td>
</tr>
<tr>
<td>Secrets management</td>
<td>Customer</td>
<td>Secrets manager configuration, rotation logs, proof secrets are not in code</td>
</tr>
<tr>
<td>Data encryption (at rest and in transit)</td>
<td>Shared</td>
<td>Encryption configuration, key custody documentation, TLS certificates</td>
</tr>
<tr>
<td>Logging and audit trails</td>
<td>Shared</td>
<td>Log retention policies, tamper-resistance proof, SIEM integration</td>
</tr>
<tr>
<td>Application code security</td>
<td>Customer</td>
<td>SAST/DAST scan results, dependency vulnerability reports, change approvals</td>
</tr>
<tr>
<td>Data classification</td>
<td>Customer</td>
<td>Data inventory, classification tags, handling procedures</td>
</tr>
<tr>
<td>Backups and disaster recovery</td>
<td>Shared</td>
<td>Backup location confirmation, restoration test results, RTO/RPO evidence</td>
</tr>
<tr>
<td>Incident response</td>
<td>Shared</td>
<td>Incident response plan, tabletop exercise records, notification procedures</td>
</tr>
</tbody></table>
<p>A platform’s audit reports cover the rows marked Platform and the platform’s part of the Shared rows. Rows marked Customer or Shared need your own controls and evidence.</p>
<h2>How do I keep customer data in a specific country while still having multi-region failover?</h2>
<p>Run the application in two or more locations inside the country, replicate data only between those locations, and keep every replica, backup, log, and key in-country. Traffic fails over between the in-country locations, never to a region abroad.</p>
<p><strong>Architecture options:</strong></p>
<ul>
<li><strong>Active-active</strong> between two in-country locations removes failover delay, because each location already serves traffic, and a global load balancer routes requests to the nearest healthy one.</li>
<li><strong>Active-passive</strong> keeps a standby location in-country that takes over during an outage. It costs less but introduces failover time.</li>
</ul>
<p><strong>Databases in active-active.</strong> The application tier can run active-active, but most relational databases accept writes on one primary. Put the primary in one in-country location and a replica in the other, and send writes from both locations to the primary. Synchronous replication gives a recovery point objective (RPO) of zero, meaning no committed write is lost, at the cost of added write latency. In-country locations are usually close enough to keep that cost low. Asynchronous replication adds no write latency but can lose writes not yet copied when the primary fails. On failure, promote the replica and repoint the application. Use a quorum or fencing so two primaries never accept writes at once. To accept writes in every location, use a distributed SQL database such as CockroachDB, YugabyteDB, or Google Cloud Spanner, and keep all of its nodes in-country.</p>
<p>For a deeper comparison of these patterns, see <a href="https://controlplane.com/blog/post/active-active-vs-active-passive-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">active-active vs. active-passive cost and architecture trade-offs</a>.</p>
<p><strong>What to pin in-country:</strong></p>
<ul>
<li>Primary database and all replicas</li>
<li>Backups and snapshots</li>
<li>Object storage buckets</li>
<li>Application logs and audit logs</li>
<li>Encryption keys</li>
<li>Cache layers</li>
</ul>
<p><strong>What to check:</strong></p>
<ul>
<li>Where does the platform’s support staff access data from?</li>
<li>Where do telemetry and monitoring data flow?</li>
<li>Where does TLS terminate? Global load balancers and CDNs can decrypt requests at edge sites outside the country.</li>
<li>Where do managed AI APIs send prompts and responses for processing?</li>
<li>Does the platform offer contractual commitments on data location?</li>
</ul>
<h3>Where can I find a cloud provider that keeps my data in one country to reduce risk?</h3>
<p>AWS, Google Cloud, and Azure each run two or more regions in the United States, Canada, Australia, Japan, and India, so one provider can cover in-country failover in those countries. Not every country has two cloud regions from a single provider. In those cases, combining regions from multiple providers, or adding your own data center, may be the only viable in-country option. A detailed breakdown of provider coverage by country is available in <a href="https://controlplane.com/blog/post/best-cloud-providers-data-sovereignty-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">best cloud providers for data sovereignty in 2026</a>. For architectural patterns, see <a href="https://controlplane.com/blog/post/sovereign-cloud-architecture-data-residency-compliance?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">sovereign cloud architecture for data residency compliance</a>.</p>
<h2>What practical controls ensure data residency and sovereignty in a multi-cloud infrastructure?</h2>
<ul>
<li><strong>Region allow-lists enforced by policy.</strong> Each major cloud has a native mechanism: AWS <a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html">Service Control Policies</a> with <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_deny-requested-region.html">aws:RequestedRegion conditions</a> (with exemptions for global services such as IAM), <a href="https://learn.microsoft.com/en-us/azure/governance/policy/samples/built-in-policies#general">Azure Policy’s built-in Allowed locations policy</a>, and the Google Cloud <a href="https://docs.cloud.google.com/organization-policy/restrict-locations">resource locations organization policy constraint</a>.</li>
<li><strong>Data classification and tagging.</strong> Tag every resource with its data classification (e.g., <code>data-class: phi</code>, <code>data-class: pci</code>). Use tags to trigger policy enforcement and to generate audit reports.</li>
<li><strong>Encryption with keys held in-region.</strong> Store encryption keys in the same jurisdiction as the data they protect. Cross-border key storage can undermine sovereignty even if the ciphertext stays in-country.</li>
<li><strong>Egress controls.</strong> Block or alert on data transfers to regions outside the approved list. Use VPC flow logs, firewall rules, and DLP inspection at egress points.</li>
<li><strong>Residency-aware backups.</strong> Explicitly configure backup destinations. Some services copy backups or geo-redundant replicas to a second region by default or with a single setting, and that region is not always in the same country. For example, Azure geo-redundant storage replicates to the paired region, and Brazil South is paired with South Central US. Multi-region storage locations such as Google Cloud’s EU or US buckets span several countries.</li>
<li><strong>Logging location.</strong> Route logs to a logging service or bucket pinned to an approved region. If you use a third-party logging provider, confirm where they store and process your data.</li>
<li><strong>Regular audits.</strong> Periodically scan for resources created outside approved regions. Automated compliance scanners can flag drift before it becomes an audit finding.</li>
</ul>
<h2>What cloud compliance checklist should I follow when migrating a regulated application to AI infrastructure?</h2>
<p>AI workloads introduce new compliance surfaces. Prompts, model outputs, training data, and vector store contents can all contain regulated data. Follow this checklist:</p>
<ol>
<li><strong>Classify data before it reaches a model.</strong> Determine whether inputs contain ePHI, cardholder data, PII, or other regulated categories. Apply classification before inference, not after.</li>
<li><strong>Decide what can go to third-party model APIs.</strong> If you use external APIs for inference, confirm the provider’s compliance posture, sign the appropriate agreements (BAA, DPA), and understand where prompts and responses are processed and stored. Confirm in writing that prompts are not used for training and how long the provider keeps them.</li>
<li><strong>Prefer self-hosted or in-region inference for regulated data.</strong> Running models on infrastructure you control, within approved regions, keeps regulated data off third-party networks.</li>
<li><strong>Log prompts and outputs with redaction.</strong> Maintain audit logs of what was sent to a model and what it returned. Redact or tokenize regulated fields before logging.</li>
<li><strong>Apply access control to models and vector stores.</strong> Treat model endpoints and vector databases as regulated data stores. Enforce RBAC, authentication, and network segmentation.</li>
<li><strong>Keep training and fine-tuning data in-region.</strong> If you fine-tune models on regulated data, the training data, checkpoints, and resulting model weights must stay within approved jurisdictions.</li>
<li><strong>Document data flows for auditors.</strong> Create a data flow diagram that shows how regulated data moves through your AI pipeline: ingestion, preprocessing, inference, post-processing, storage, and deletion. Auditors will ask for this.</li>
<li><strong>Plan for deletion.</strong> Embeddings and fine-tuned weights derived from personal data must be deletable when a data subject asks for erasure, so record which data each one came from.</li>
</ol>
<h2>What are the best practices for secrets management in IaC pipelines to meet cloud compliance requirements?</h2>
<p>Secrets in infrastructure-as-code pipelines are a frequent audit finding and a common attack vector.</p>
<ul>
<li><strong>No secrets in code, state files, or CI logs.</strong> Credentials leaked in repositories are a common way attackers get cloud access. Terraform writes values read through data sources into state; Terraform 1.10 added ephemeral resources and 1.11 added write-only arguments to keep secrets out of state and plan files.</li>
<li><strong>Use a secrets manager, referenced by name.</strong> Store secrets in a dedicated service such as <a href="https://aws.amazon.com/secrets-manager/">AWS Secrets Manager</a>, <a href="https://cloud.google.com/security/products/secret-manager">Google Cloud Secret Manager</a>, or <a href="https://azure.microsoft.com/en-us/products/key-vault/">Azure Key Vault</a>, or in <a href="https://developer.hashicorp.com/vault">HashiCorp Vault</a>. IaC templates should reference secret names, never values.</li>
<li><strong>Short-lived credentials through workload identity federation.</strong> Replace static API keys with short-lived federated tokens that expire automatically, typically within an hour. AWS, GCP, and Azure all support workload identity federation natively.</li>
<li><strong>Least-privilege pipeline roles.</strong> The CI/CD service account should have only the permissions needed for the current deployment. Separate roles for plan and apply stages.</li>
<li><strong>Rotation.</strong> Automate rotation on a defined schedule, and rotate immediately after a suspected exposure or when someone with access leaves. Log every rotation.</li>
<li><strong>Secret scanning in CI.</strong> Run tools like <a href="https://github.com/gitleaks/gitleaks">Gitleaks</a> or <a href="https://github.com/trufflesecurity/trufflehog">TruffleHog</a> in your CI pipeline to catch secrets before they merge.</li>
<li><strong>Encrypted and access-controlled IaC state.</strong> Terraform and Pulumi state files can contain sensitive values. Encrypt state at rest, restrict access to the state backend, and audit who reads it.</li>
</ul>
<h2>How should I structure governance and policy as code for compliant multi cloud infrastructure using IaC?</h2>
<p>Policy as code turns compliance rules into enforceable, version-controlled, auditable artifacts. Structure it in layers:</p>
<p><strong>Preventive guardrails at the account or organization level.</strong> These are the broadest controls. Service Control Policies in AWS, Organization Policies in Google Cloud, and Azure Policy assignments at the management group level prevent non-compliant resources from being created in the first place.</p>
<p><strong>Policy checks in CI before apply.</strong> Before any IaC change reaches production, validate it against your compliance rules. <a href="https://www.openpolicyagent.org/">Open Policy Agent (OPA)</a> is a widely adopted open-source engine for this purpose. Evaluate the JSON output of <code>terraform plan</code> with OPA through a tool such as Conftest, or use Pulumi CrossGuard policy packs with <code>pulumi preview</code>, and fail the pipeline on violations. In Kubernetes, OPA Gatekeeper or Kyverno applies the same rules at admission time.</p>
<p><strong>Runtime detection.</strong> Even with preventive controls, configuration drift happens. Use runtime scanners to detect resources that have drifted from their compliant state and alert or auto-remediate.</p>
<p><strong>Evidence collection for audits.</strong> Every policy evaluation, pass or fail, should produce a log entry. These logs become audit evidence showing that controls were in place and operating continuously.</p>
<p><strong>Examples of rules to codify:</strong></p>
<ul>
<li>Allowed deployment regions (for example, only the regions inside the country your data must stay in)</li>
<li>Required encryption on all storage resources</li>
<li>Required classification tags on every resource</li>
<li>No public access on storage buckets or object stores</li>
<li>MFA required for privileged roles</li>
</ul>
<h2>What cloud solutions offer multi tenant protection against cross tenant data breaches?</h2>
<p>Cloud platforms separate tenants at three layers: separate accounts or projects (AWS accounts, Google Cloud projects, Azure subscriptions), compute isolation (separate clusters or microVM sandboxes such as Kata Containers), and data isolation (separate databases and per-tenant encryption keys).</p>
<h3>Tenant isolation models</h3>
<table>
<thead>
<tr>
<th>Model</th>
<th>Layer</th>
<th>Isolation</th>
<th>What tenants still share</th>
</tr>
</thead>
<tbody><tr>
<td>Separate accounts or projects</td>
<td>All layers</td>
<td>Highest</td>
<td>Only organization-level billing and policy</td>
</tr>
<tr>
<td>Separate clusters in one account</td>
<td>Compute</td>
<td>High</td>
<td>Cloud IAM, network, and account quotas</td>
</tr>
<tr>
<td>Separate namespaces in one cluster</td>
<td>Compute</td>
<td>Low to moderate</td>
<td>Kernel, nodes, and cluster control plane; relies on network policies, RBAC, quotas, and pod security</td>
</tr>
<tr>
<td>Separate database instances</td>
<td>Data</td>
<td>High</td>
<td>Network and admin credentials</td>
</tr>
<tr>
<td>Separate databases or schemas on one instance</td>
<td>Data</td>
<td>Moderate</td>
<td>Database engine, memory, and admin accounts</td>
</tr>
<tr>
<td>Row-level security on shared tables</td>
<td>Data</td>
<td>Lowest</td>
<td>Everything; one missing tenant context or a role that bypasses RLS exposes other tenants</td>
</tr>
</tbody></table>
<p>Choose a compute model and a data model separately. A common pattern is separate accounts for the most sensitive tenants and shared clusters with separate databases for the rest.</p>
<h2>How do I design AI infrastructure for cloud compliance using BYOK and tenant data segregation?</h2>
<p>In this context, BYOK (bring your own key) means encrypting data with keys you control, generated or imported into a cloud key management service, instead of provider-managed keys. Tenant isolation and per-tenant encryption are the two pillars of preventing cross-tenant data exposure.</p>
<h3>Per-tenant encryption keys</h3>
<p>Store each tenant’s encryption key in a cloud KMS (such as <a href="https://aws.amazon.com/kms/">AWS KMS</a>, <a href="https://docs.cloud.google.com/kms/docs">Google Cloud KMS</a>, or <a href="https://azure.microsoft.com/en-us/products/key-vault/">Azure Key Vault</a>). The application references the tenant’s key ID when encrypting or decrypting that tenant’s data. If one tenant’s key is compromised, only that tenant’s data is exposed. Disabling or deleting a tenant’s key makes their data unreadable, which supports offboarding and deletion requests, and KMS logs show every use of each tenant’s key. Scope the application’s decrypt permission per tenant, or one compromised service can still use every key.</p>
<h3>Tenant separation in AI workloads</h3>
<p>Vector stores and model caches introduce new cross-tenant risks. If multiple tenants share a vector database, queries from one tenant could surface embeddings from another. Mitigations include:</p>
<ul>
<li>Namespace or collection-level separation within the vector store</li>
<li>Tenant-scoped query filters enforced at the application layer</li>
<li>Separate model inference endpoints per tenant for the most sensitive workloads</li>
<li>Scoping prompt caches and response caches to one tenant. Inference servers that reuse the KV cache for shared prompt prefixes, and semantic caches that return a stored answer for a similar prompt, can leak data or timing signals across tenants. Add the tenant ID to the cache key or disable cross-tenant cache sharing.</li>
</ul>
<h2>How Control Plane approaches regulated workloads</h2>
<p>Control Plane is the unbreakable platform for production workloads. It combines any cloud, neocloud, bare metal, and your own servers into what Control Plane calls a Global Virtual Cloud (GVC), and teams run it in a single region, a single cloud, or across clouds. Control Plane handles Day 2 operations for you, including autoscaling, right-sizing, built-in observability, and security, with no Kubernetes cluster you have to operate.</p>
<p><strong>Compliance posture.</strong> Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. These controls and the evidence they produce support your compliance, though they do not make you compliant on their own.</p>
<p><strong>Data residency through location selection.</strong> A workload runs only in the locations of its GVC, which can include AWS, GCP, and Azure regions, Kubernetes clusters you already run, and servers in your own data center or from bare-metal and GPU providers. Control Plane Managed Kubernetes (MK8s) joins those servers into a cluster that Control Plane runs for you as a location. You can keep two or more locations inside one country, including combinations of providers, so the GVC’s location list acts as the region allow-list for that workload. Two in-country locations can also meet the 99.999% SLA condition below. Platform data is handled separately: org secrets are encrypted with envelope encryption and held in cloud HSMs across multiple providers, and logs are aggregated by Control Plane (30-day default retention) and can also be shipped to destinations you control, such as an Amazon S3 bucket or CloudWatch in your chosen region.</p>
<p><strong>Active-active failover.</strong> A workload deployed to a GVC runs active-active in every location of that GVC, and a global endpoint routes clients to the nearest healthy location. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be two regions of one cloud or locations on different providers. For strategies on surviving a single-region outage, see <a href="https://controlplane.com/blog/post/keep-app-online-aws-region-outage?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">how to keep your app online during an AWS region outage</a>.</p>
<p><strong>Security defaults.</strong> Workloads are closed by default behind a deny-by-default internal firewall, and traffic between them uses mTLS, with each workload’s client certificate rotated every hour. All data is encrypted at rest and in transit. Each workload is isolated with cgroups, namespaces, and restricted syscalls and capabilities, and Control Plane Sandboxes, isolated environments for AI coding agents and untrusted code, run in dedicated Kata Containers microVMs.</p>
<p><strong>Secrets and identity.</strong> Control Plane’s built-in secrets management lets workloads reference a secret as cpln://secret/NAME once their identity is granted the reveal permission, so secret values stay out of code and images. Control Plane’s Universal Cloud Identity gives workloads short-lived, least-privilege access to 600+ AWS, GCP, and Azure services, with no long-lived cloud keys in your code.</p>
<p><strong>Audit trail.</strong> Every action, whether made through the console, CLI, Terraform, Pulumi, or AI agents using the Control Plane MCP server, is recorded in a tamper-proof audit trail. Your own workloads can write application events to the same audit trail through a custom audit context.</p>
<p><strong>Policy and IaC.</strong> Control Plane policies are org-scoped and grant fine-grained permissions on every resource type to users, groups, service accounts, and workload identities. Control Plane ships its own Terraform and Pulumi providers, so it complements the infrastructure as code you already run.</p>
<p><strong>Cost.</strong> Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. SAFE Health, a connected-diagnostics platform working with Mayo Clinic, <a href="https://controlplane.com/customers/safehealth?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">migrated 8 environments from AWS to Control Plane and cut its AWS spend 75 percent</a>.</p>
<p>For teams looking to simplify multi-cloud operations or consolidate existing infrastructure, see <a href="https://controlplane.com/blog/post/consolidate-multiple-clouds-one-platform?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">how to consolidate multiple clouds into one platform</a>. For a comparison of managed platform services versus building your own portability layer, see <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">managed services vs. portability and cloud lock-in</a>.</p>
<h2>FAQ</h2>
<h3>Does a SOC 2 Type II report mean a platform is secure?</h3>
<p>No. A SOC 2 Type II report shows that an independent auditor tested specific controls and found they operated effectively over a defined period. Read the report’s scope, exceptions, and complementary user entity controls to understand what the platform covers and what you must handle.</p>
<h3>Is there an official HIPAA certification for cloud platforms?</h3>
<p>No. The U.S. Department of Health and Human Services does not certify cloud platforms as HIPAA compliant. Look for a signed Business Associate Agreement and a published list of HIPAA-eligible services. The BAA sets the platform’s contractual obligations for safeguarding ePHI, and under HIPAA a business associate is also directly liable for certain requirements, including the Security Rule.</p>
<h3>What is the difference between PCI DSS Level 1 and other levels?</h3>
<p>Level 1 is the top tier for service providers. Visa and Mastercard assign it to service providers that handle more than 300,000 card transactions a year, and it requires an annual assessment by a Qualified Security Assessor, who issues a Report on Compliance (ROC) and an Attestation of Compliance (AoC). Level 2 service providers can self-assess with Self-Assessment Questionnaire D. Ask any provider for its responsibility matrix, which PCI DSS v4.0 requirement 12.9.2 obliges it to provide on request.</p>
<h3>Can I achieve multi-region failover while keeping all data in one country?</h3>
<p>Yes, if the country has two or more available cloud regions or data center locations. Run active-active or active-passive between them and pin all replicas, backups, logs, and encryption keys to those locations. If a single provider lacks two in-country regions, combine providers or add your own data center.</p>
<h3>How do I prevent secrets from leaking in IaC pipelines?</h3>
<p>Store secrets in a dedicated secrets manager and reference them by name in your IaC templates. Use short-lived credentials through workload identity federation, run secret-scanning tools in CI, encrypt your IaC state files, and restrict access to the state backend.</p>
<h3>What is the shared responsibility model in cloud compliance?</h3>
<p>The platform is responsible for infrastructure-level controls such as physical security, hypervisor patching, and network fabric. You are responsible for identity and access management, secrets, application code security, and data classification. Network segmentation, encryption, logging, backups, and incident response are shared.</p>
<h3>How should I handle regulated data in AI inference pipelines?</h3>
<p>Classify data before it reaches a model. Use self-hosted or in-region inference for regulated data. Log prompts and outputs with redaction of sensitive fields. Apply access control to model endpoints and vector stores. Document the full data flow for auditors.</p>
<h3>Does Control Plane make my application compliant?</h3>
<p>No. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant and provides audited controls and evidence that support your compliance, but your application still needs its own controls for data classification, identity, secrets, application security, and logging.</p>
<h3>Can Control Plane keep my workload in a single cloud?</h3>
<p>Yes. Many teams run Control Plane in a single cloud for its Day 2 operations and security defaults. A GVC can contain locations from a single provider, and two regions of one cloud qualify for the 99.999% SLA when a workload runs at least two replicas in those two locations.</p>
<h3>How does Control Plane handle workload isolation?</h3>
<p>Each workload is isolated with cgroups, namespaces, and restricted syscalls and capabilities, and Control Plane Sandboxes run in dedicated Kata Containers microVMs. Workloads are closed by default behind a deny-by-default internal firewall, and traffic between them uses mTLS.</p>
<p>See how Control Plane runs regulated workloads.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a></p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/run-regulated-apps-cloud-soc2-hipaa-pci-data-residency?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-regulated-apps-cloud-soc2-hipaa-pci-data-residency">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Policy as Code for Multi-Cloud Infrastructure: How to Structure IaC Governance, Pick the Tools, and Automate Enforcement and Patching]]></title><description><![CDATA[Policy as code for multi-cloud infrastructure: how to structure IaC governance, pick the tools, and automate enforcement and patching.]]></description><link>https://controlplane-eng.hashnode.dev/policy-as-code-for-multi-cloud-infrastructure-how-to-structure-iac-governance-pick-the-tools-and-automate-enforcement-and-patching</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/policy-as-code-for-multi-cloud-infrastructure-how-to-structure-iac-governance-pick-the-tools-and-automate-enforcement-and-patching</guid><category><![CDATA[Devops]]></category><category><![CDATA[Terraform]]></category><category><![CDATA[Security]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 20:54:33 GMT</pubDate><content:encoded><![CDATA[<p>Structure multi-cloud governance as layered policy as code, with the same written rules enforced at four points: in the editor and pull request, in the CI plan check, at deploy or admission time, and continuously at runtime through cloud-native controls. Version everything in Git with tests, a documented exception process, and automatic evidence for auditors. Control Plane ships its own Terraform and Pulumi providers and a Kubernetes operator for GitOps, applies one access policy model and audit trail across every cloud it runs on, and handles Day 2 operations, including autoscaling, right-sizing, observability, and security.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Policy as code expresses governance, security, and compliance rules as machine-readable code that runs automatically at every stage of your delivery pipeline. Keep policies versioned, tested, and enforced at several points.</p>
<ul>
<li><strong>Four enforcement points.</strong> Editor and pull request checks, CI plan validation, deploy-time admission control, and continuous runtime scanning. Each catches a different class of issue, and none is sufficient alone.</li>
<li><strong>Repository structure.</strong> Keep a dedicated policy library separate from infrastructure modules. Map policies to control IDs (CIS Benchmarks, SOC 2 criteria), test every policy, and publish versioned releases that pipelines pin.</li>
<li><strong>Tool categories.</strong> Use IaC provisioning tools, policy engines and static scanners, and cloud-native controls together.</li>
<li><strong>Patching and upgrades.</strong> Keep cluster versions within the supported window, automate node image patching through rolling node pool replacement, and use maintenance windows and pod disruption budgets.</li>
<li><strong>Evidence for audits.</strong> Store plan outputs, policy decisions, approvals, and exception records as immutable artifacts.</li>
<li><strong>Control Plane.</strong> One access model and a tamper-proof audit trail across every cloud and cluster Control Plane runs on, including AWS, GCP, Azure, and your own Kubernetes clusters, plus Terraform and Pulumi providers and a Kubernetes operator that fit into GitOps pipelines.</li>
</ul>
<h2>How should I structure governance and policy as code for compliant multi cloud infrastructure using IaC?</h2>
<p>The reference structure covers policy tiers, enforcement points, repository layout, severity levels, drift detection, state security, and audit evidence.</p>
<h3>Policy tiers</h3>
<p>Organize policies into three tiers that mirror organizational responsibility.</p>
<p><strong>Organization guardrails</strong> are the broadest controls. AWS Service Control Policies, Azure Policy assignments at management group scope, and Google Cloud Organization Policy constraints set boundaries that no team can override. They block whole categories of risk, such as deploying resources in unapproved regions or enabling public access to storage. SCPs do not restrict the AWS management account, so keep workloads out of it, and AWS resource control policies (RCPs) add org-wide limits on resource access.</p>
<p><strong>Platform policies</strong> apply to IaC plans and Kubernetes admission. They are written in a policy engine language (Rego, Sentinel, or Kyverno YAML) and evaluated in CI pipelines and at admission time. Examples include requiring encryption at rest, enforcing tagging standards, and restricting instance types.</p>
<p><strong>Team-level rules</strong> are scoped to a single service or namespace. A machine learning team might limit its namespace to two GPU instance types from the platform-approved list. Team rules never widen what the tiers above allow; widening needs a platform-level exception.</p>
<h3>The four enforcement points</h3>
<p>Each enforcement point catches a different class of problem.</p>
<table>
<thead>
<tr>
<th>Enforcement point</th>
<th>Example tools</th>
<th>Catches</th>
<th>Misses</th>
</tr>
</thead>
<tbody><tr>
<td>Editor and pull request</td>
<td>Checkov, Trivy, IDE plugins, OPA with Conftest</td>
<td>Misconfigurations in source before merge; fast feedback</td>
<td>Dynamic values, runtime state, and cross-resource dependencies</td>
</tr>
<tr>
<td>CI plan check</td>
<td>Sentinel, OPA with Conftest on plan JSON, Checkov</td>
<td>Violations in the computed plan, including dynamic references and module outputs</td>
<td>Out-of-band changes and runtime drift</td>
</tr>
<tr>
<td>Deploy-time admission</td>
<td>OPA Gatekeeper, Kyverno, Kubernetes ValidatingAdmissionPolicy, AWS CloudFormation Hooks, Azure Policy deny effect, HCP Terraform run tasks</td>
<td>Resources that violate policy at creation or update time</td>
<td>Changes made through paths that bypass the hook, such as direct API calls that SCPs and Azure Policy do not cover</td>
</tr>
<tr>
<td>Continuous runtime</td>
<td>AWS Config, Azure Policy (audit effect), scheduled policy scans</td>
<td>Drift, out-of-band changes, newly found vulnerabilities (through scanners such as Amazon Inspector or Microsoft Defender for Cloud), expiring certificates</td>
<td>Prevention; it reports after the fact, and remediation may lag detection</td>
</tr>
</tbody></table>
<p>Admission controllers can validate (reject) or mutate (rewrite) a request. Kyverno, Gatekeeper, and Azure Policy <code>modify</code> and <code>deployIfNotExists</code> effects can mutate. Mutation changes resources silently, so the live object differs from Git. Prefer validation for security controls, and keep mutation to defaults such as labels and resource requests.</p>
<h3>Repository layout</h3>
<p>A clean layout separates concerns and makes policies consumable by any pipeline.</p>
<ul>
<li><strong>policy-library/</strong> holds all policy source files organized by control family (identity, encryption, networking, tagging, compute). Each policy references one or more control IDs, such as a CIS AWS Foundations Benchmark recommendation or SOC 2 CC6.1.</li>
<li><strong>policy-library/tests/</strong> holds unit tests for every policy, run with <code>opa test</code>, <code>conftest verify</code>, <code>kyverno test</code>, or <code>sentinel test</code>. Fixtures include a passing and a failing input for each rule, and CI runs the tests on every change to the library.</li>
<li><strong>infrastructure-modules/</strong> holds reusable Terraform, OpenTofu, or Pulumi modules.</li>
<li><strong>environments/</strong> holds environment-specific variable files and backend configuration.</li>
</ul>
<p>Tag the policy library with semantic versions. Pipelines pin a version and upgrade deliberately, like any other dependency.</p>
<p>Protect the policy library with CODEOWNERS and branch protection so policy changes need security or platform approval. Make the policy step a required status check that infrastructure repositories cannot disable. Split CI identities so the plan role is read-only and only the apply role can change resources.</p>
<h3>Severity levels and exceptions</h3>
<p>Give every policy a severity level.</p>
<ul>
<li><strong>Advisory.</strong> Logs a warning and does not block deployment. Useful for new policies under evaluation.</li>
<li><strong>Soft-mandatory.</strong> Blocks deployment unless an authorized approver overrides it. The override is recorded in the run log or in Git with a justification, an owner, and an expiration date.</li>
<li><strong>Hard-mandatory.</strong> Cannot be overridden. Reserved for critical controls, such as blocking public databases or wildcard IAM permissions.</li>
</ul>
<p>Exceptions follow a time-boxed approval process. The request is a pull request in the policy repository with the business justification, compensating controls, the approver’s identity, and an expiration date. An automated job revokes expired exceptions and opens a ticket if the underlying issue remains.</p>
<p>Keep a break-glass path for incidents. An emergency role bypasses pipeline gates, requires two-person approval, alerts the security team on use, expires automatically within hours, and triggers a post-incident review. Every break-glass session is logged and later reconciled back into code.</p>
<p>Roll out new admission policies in audit mode first (Gatekeeper <code>enforcementAction: dryrun</code> or <code>warn</code>, Kyverno <code>Audit</code>), review the violations, then switch to enforcement.</p>
<h3>Drift detection and remediation</h3>
<p>Drift happens when someone changes a resource outside the IaC pipeline, through a console click or an ad hoc API call. Detect it by running <code>terraform plan -refresh-only -detailed-exitcode</code> or <code>tofu plan -refresh-only -detailed-exitcode</code> on a schedule; exit code 2 means the plan found drift. HCP Terraform health assessments run drift detection automatically. GitOps controllers such as Argo CD and Flux reconcile continuously and can self-heal Kubernetes resources, and Crossplane reconciles cloud resources the same way. AWS Config rules and Azure Policy with the audit effect give continuous drift signals.</p>
<p>Automate remediation for low-risk corrections (re-enabling logging, reapplying a tag) and require human approval for higher-impact changes (modifying network rules, resizing databases). Before reverting, decide whether to revert the change or import it into code; blindly reverting an emergency fix can reopen an incident.</p>
<h3>State file security</h3>
<p>State files and saved plans hold resource attributes and secrets in plaintext. Store state in an encrypted backend with versioning, restrict read access to the pipeline identity and a small admin group, and log every access. OpenTofu 1.7 and later supports client-side state encryption. Never commit state or plan files to Git, and apply the saved plan file (for example <code>terraform apply tfplan</code>) so the plan that passed policy is the plan that runs.</p>
<h3>Evidence for audits</h3>
<p>Auditors need proof that each control ran. Store these artifacts automatically:</p>
<ul>
<li>Plan output for every deployment, with sensitive values redacted before storage, because plan JSON and state files contain secrets in plaintext.</li>
<li>Policy evaluation results with pass, fail, and advisory outcomes.</li>
<li>Approval records from pull request reviews and exception overrides.</li>
<li>Drift detection reports with timestamps and remediation actions.</li>
<li>Each artifact tagged with the commit SHA, the policy library version, and the approver identity.</li>
</ul>
<p>Keep artifacts in a write-once store, such as S3 Object Lock in compliance mode or Azure immutable blob storage, with retention set by your compliance framework. PCI DSS requires at least 12 months of audit log history, with the most recent 3 months immediately available, and SOC 2 Type II observation periods usually run 3 to 12 months. Export the Azure Activity Log, which keeps only 90 days by default.</p>
<h2>What are the best infrastructure-as-code tools?</h2>
<p>The IaC landscape includes cross-cloud provisioning tools, cloud-specific frameworks, Kubernetes-native resource managers, and configuration management systems. For a broader list, see <a href="https://controlplane.com/blog/post/top-10-infrastructure-as-code-tools?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">top 10 infrastructure as code tools</a>.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Type</th>
<th>Language</th>
<th>Multi-cloud support</th>
<th>State handling</th>
<th>License</th>
<th>Best fit</th>
</tr>
</thead>
<tbody><tr>
<td>Terraform</td>
<td>Provisioning</td>
<td>HCL</td>
<td>Yes, through providers</td>
<td>Remote or local state file</td>
<td><a href="https://www.hashicorp.com/en/blog/hashicorp-adopts-business-source-license">Business Source License since August 2023</a></td>
<td>Teams standardized on HCL with broad provider coverage</td>
</tr>
<tr>
<td><a href="https://opentofu.org/">OpenTofu</a></td>
<td>Provisioning</td>
<td>HCL</td>
<td>Yes, through providers</td>
<td>Remote or local state file</td>
<td>MPL 2.0 (CNCF Sandbox project)</td>
<td>Teams that require an open source, Terraform-compatible tool</td>
</tr>
<tr>
<td>Pulumi</td>
<td>Provisioning</td>
<td>TypeScript, JavaScript, Python, Go, C#, Java, YAML, HCL</td>
<td>Yes, through providers</td>
<td>Pulumi Cloud or self-managed backend</td>
<td>Apache 2.0 (engine)</td>
<td>Teams that prefer general-purpose languages over a DSL</td>
</tr>
<tr>
<td>AWS CloudFormation and AWS CDK</td>
<td>Provisioning</td>
<td>JSON or YAML (CloudFormation); TypeScript, Python, Java, C#, Go (CDK)</td>
<td>AWS only</td>
<td>Managed by AWS</td>
<td>Managed service (CloudFormation); Apache 2.0 (CDK)</td>
<td>AWS-only workloads with deep service integration</td>
</tr>
<tr>
<td>Azure Bicep</td>
<td>Provisioning</td>
<td>Bicep DSL</td>
<td>Azure only</td>
<td>No state file; Azure Resource Manager compares templates with live resources</td>
<td>MIT</td>
<td>Azure-only workloads that want simpler syntax than ARM templates</td>
</tr>
<tr>
<td>Crossplane</td>
<td>Provisioning with continuous reconciliation</td>
<td>YAML (Kubernetes custom resources)</td>
<td>Yes, through providers</td>
<td>Kubernetes API</td>
<td>Apache 2.0 (CNCF graduated)</td>
<td>Teams that manage cloud resources through the Kubernetes API</td>
</tr>
<tr>
<td>Ansible</td>
<td>Configuration management and orchestration</td>
<td>YAML</td>
<td>Yes, through modules</td>
<td>Agentless; no state file by default</td>
<td>GPL 3.0</td>
<td>Configuration management, application deployment, and orchestration tasks</td>
</tr>
</tbody></table>
<p>Standardize on one cross-cloud tool for most of your infrastructure. Use a cloud-specific tool only where a single cloud owns the workload end to end and the native tool offers a clear advantage, such as faster support for new services.</p>
<h2>Which tools automate AI infrastructure provisioning and policy enforcement for multi cloud environments?</h2>
<p>Policy engines and static scanners complement IaC tools by evaluating what those tools produce.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Where it runs</th>
<th>Policy language</th>
<th>Scope</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://www.openpolicyagent.org/">Open Policy Agent</a></td>
<td>Admission controllers (Gatekeeper), services, HCP Terraform policy sets</td>
<td>Rego</td>
<td>Any JSON or YAML input</td>
</tr>
<tr>
<td>Conftest</td>
<td>CI pipelines, local CLI</td>
<td>Rego</td>
<td>IaC plan files, Kubernetes manifests, Dockerfiles, other config files</td>
</tr>
<tr>
<td>HashiCorp Sentinel</td>
<td>HCP Terraform and Terraform Enterprise (which also run OPA policy sets)</td>
<td>Sentinel</td>
<td>Terraform plans, configuration, and state</td>
</tr>
<tr>
<td><a href="https://www.checkov.io/">Checkov</a></td>
<td>CI pipelines, IDE plugins</td>
<td>Python or YAML for custom checks</td>
<td>Terraform, CloudFormation, Kubernetes, Helm, Dockerfiles, and more</td>
</tr>
<tr>
<td>Kyverno</td>
<td>Kubernetes admission controller</td>
<td>YAML, with CEL expressions</td>
<td>Kubernetes resources</td>
</tr>
<tr>
<td>OPA Gatekeeper</td>
<td>Kubernetes admission controller</td>
<td>Rego or CEL (through ConstraintTemplates)</td>
<td>Kubernetes resources</td>
</tr>
<tr>
<td>Kubernetes ValidatingAdmissionPolicy</td>
<td>Kubernetes API server (built in, GA in 1.30)</td>
<td>CEL</td>
<td>Kubernetes resources</td>
</tr>
<tr>
<td>Pulumi Policy as Code (CrossGuard)</td>
<td>Pulumi CLI and Pulumi Cloud</td>
<td>TypeScript, Python, or OPA Rego</td>
<td>Pulumi stacks</td>
</tr>
<tr>
<td>Cloud-native controls (AWS SCPs and AWS Config, Azure Policy, Google Cloud Organization Policy)</td>
<td>Cloud provider control plane</td>
<td>Provider-specific JSON; custom AWS Config rules use Lambda or Guard, and Google Cloud custom constraints use CEL</td>
<td>Resources in the respective accounts, subscriptions, or projects</td>
</tr>
</tbody></table>
<h3>AI-specific guardrails</h3>
<p>AI and ML workloads add resource and data governance requirements that fit the policy as code model. Write them as ordinary policies in whichever engine you use.</p>
<ul>
<li><strong>GPU instance types and quotas.</strong> Allow only approved GPU types per team and cap concurrent GPU instances through cloud quotas such as AWS Service Quotas and Azure quotas, because plan-time policy cannot count across deployments.</li>
<li><strong>Approved regions for model and data residency.</strong> Restrict training jobs and model storage to regions that meet data residency requirements.</li>
<li><strong>Required tags for cost attribution.</strong> Enforce tags such as <code>project</code>, <code>cost-center</code>, and <code>model-name</code> on every GPU instance and storage bucket.</li>
<li><strong>Encryption for model artifacts and training data.</strong> Require encryption at rest and in transit for buckets and Azure Blob containers holding datasets or model weights.</li>
<li><strong>Network egress limits for inference services.</strong> Restrict outbound traffic from inference endpoints to known destinations.</li>
<li><strong>Approval gates for large GPU reservations.</strong> Require human approval when a deployment requests GPU capacity above a set threshold.</li>
</ul>
<h2>How can AI operable infrastructure automate patching, upgrades, and policy enforcement for clusters?</h2>
<p>Keeping clusters current is continuous work. The Kubernetes project maintains release branches for the three most recent minor versions, and the <a href="https://kubernetes.io/releases/version-skew-policy/">Kubernetes version skew policy</a> defines how far control plane and node components can drift apart. Falling outside the supported window means losing security patches and risking incompatibility.</p>
<h3>Patching and upgrade practices</h3>
<p>Automate node image patching through rolling node pool replacement instead of in-place updates. Create a node pool with the patched image, cordon and drain old nodes while respecting pod disruption budgets, and remove the old pool once workloads have moved. Schedule upgrades in maintenance windows that match your lowest-traffic periods.</p>
<p>Upgrade the control plane first, one minor version at a time, then the nodes. Scan manifests for removed APIs before each upgrade with tools such as kubent or Pluto. Managed services add their own windows: Amazon EKS gives 14 months of standard support per version plus paid extended support, AKS and GKE offer auto-upgrade or release channels, and Karpenter can replace nodes automatically when their image changes. Set surge and max-unavailable values, and check that no pod disruption budget allows zero disruptions, because that blocks drains.</p>
<p>Run policy checks at admission time and continuously. A cluster that was compliant at deploy time can drift as resources are created, images change, or configurations are edited.</p>
<h3>AI assistants and infrastructure changes</h3>
<p>AI assistants can propose infrastructure changes as pull requests or run read-only diagnostics against live clusters. Agent-initiated changes must pass the same policy checks, approval gates, and audit trail as human changes, and a read-only profile must not be able to modify resources. For agent guardrails in depth, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">how to let AI agents operate production infrastructure safely</a>.</p>
<h2>Which tools provide an easy installation and setup process for cloud infrastructure orchestration across AWS and Azure?</h2>
<p>Judge setup effort against these criteria before committing to a tool or platform.</p>
<h3>Setup checklist for a first cross-cloud pipeline</h3>
<ul>
<li><strong>One CLI.</strong> A single CLI that works against both AWS and Azure without manual context switching.</li>
<li><strong>One state backend.</strong> A managed backend (HCP Terraform, Pulumi Cloud, or an S3 or Azure Blob backend with locking) to avoid state corruption. A managed backend reduces the work of locking, encryption, and access control; a self-hosted backend gives more control but needs maintenance.</li>
<li><strong>Workload identity federation for provider authentication.</strong> Configure OIDC trust between your CI system and each cloud, so CI variables hold no static access keys. An AWS IAM OIDC identity provider with a role trust policy and Azure federated credentials both support this pattern.</li>
<li><strong>Reusable modules.</strong> Publish shared modules to an internal registry so teams consume versioned modules instead of copying code.</li>
<li><strong>Policy checks from day one.</strong> Wire Checkov or Conftest into the pipeline before the first production deployment. Retrofitting policy checks is harder than starting with them.</li>
</ul>
<p>On Control Plane, the Terraform and Pulumi providers and the Kubernetes operator plug into this kind of pipeline; details are in the How Control Plane fits section below.</p>
<h2>A starter policy set for multi-cloud IaC</h2>
<p>These policies cover the most common compliance and security gaps. Adapt severity and enforcement points to your risk tolerance.</p>
<table>
<thead>
<tr>
<th>Policy</th>
<th>Why</th>
<th>Enforce at</th>
</tr>
</thead>
<tbody><tr>
<td>No public object storage buckets</td>
<td>Prevents accidental data exposure</td>
<td>CI plan check, runtime</td>
</tr>
<tr>
<td>Encryption at rest on all storage and databases</td>
<td>Baseline expectation for SOC 2, PCI DSS, and HIPAA programs</td>
<td>CI plan check, admission</td>
</tr>
<tr>
<td>Required tags: owner, cost-center, environment, data-classification</td>
<td>Cost attribution, incident routing, and data governance</td>
<td>CI plan check, admission</td>
</tr>
<tr>
<td>Approved regions only</td>
<td>Data residency and sovereignty requirements</td>
<td>Organization guardrail, CI plan check</td>
</tr>
<tr>
<td>No wildcard IAM permissions</td>
<td>Limits the blast radius of compromised credentials</td>
<td>CI plan check, admission</td>
</tr>
<tr>
<td>No long-lived access keys for service accounts</td>
<td>Reduces credential theft risk</td>
<td>Organization guardrail, CI plan check, runtime</td>
</tr>
<tr>
<td>TLS 1.2 or higher on load balancers and endpoints</td>
<td>Transport encryption standards</td>
<td>CI plan check, runtime</td>
</tr>
<tr>
<td>Logging enabled on audit-relevant resources</td>
<td>Evidence for incident investigation</td>
<td>CI plan check, runtime</td>
</tr>
<tr>
<td>Approved instance and GPU types only</td>
<td>Controls cost and blocks unsupported hardware</td>
<td>CI plan check, admission</td>
</tr>
<tr>
<td>Deletion protection on production databases</td>
<td>Prevents accidental data loss</td>
<td>CI plan check, runtime</td>
</tr>
<tr>
<td>Container images from approved registries only</td>
<td>Blocks untrusted or unscanned images</td>
<td>Admission</td>
</tr>
<tr>
<td>No 0.0.0.0/0 ingress on SSH, RDP, or database ports</td>
<td>Blocks direct internet exposure</td>
<td>CI plan check, runtime</td>
</tr>
<tr>
<td>No privileged containers</td>
<td>Limits container escape risk</td>
<td>Admission, runtime</td>
</tr>
</tbody></table>
<p>Admission for cloud resources means deploy-time hooks such as the Azure Policy deny effect or AWS CloudFormation Hooks.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes (MK8s), a CNCF-certified Kubernetes service, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds.</p>
<h3>IaC integration</h3>
<p>Control Plane ships its own Terraform and Pulumi providers, so it complements the infrastructure as code you already run. The Terraform provider is published at <a href="https://registry.terraform.io/providers/controlplane-com/cpln">registry.terraform.io/providers/controlplane-com/cpln</a>. The Control Plane Kubernetes Operator manages Control Plane resources from Kubernetes manifests and supports Argo CD and GitOps workflows. On Control Plane, workloads run in a Global Virtual Cloud (GVC), Control Plane’s term for a set of locations a workload runs across. The CLI exports existing resources as Terraform HCL, for example <code>cpln gvc get my-gvc --output tf</code>, and as Kubernetes manifests for the operator with <code>--output crd</code>. The CLI, console, Terraform and Pulumi providers, and the Control Plane MCP server all work through the same Control Plane API.</p>
<h3>Access control and guardrails</h3>
<p>Beyond the built-in superusers and viewers policies, nothing is permitted inside a Control Plane org until a policy grants it. Policies can target resources by name or by a query on tags, properties, or relations, so resources created later that match are covered automatically. Every resource has an Access Report showing who holds each permission and which policy granted it. Control Plane prevents deletion of any resource tagged <code>cpln/protected=true</code>. Org quotas cap resource counts, such as workloads per GVC, and only an approved increase request raises one. Built-in metrics report quota_utilization_percent once a quota passes half its max, so you can alert before creates fail.</p>
<p>Several defaults line up with the starter policy set. Workload-to-workload traffic is denied by default, and external inbound and outbound traffic stay closed until a firewall rule opens them. Default workload endpoints accept TLS 1.2 or higher. Control Plane’s Universal Cloud Identity (UCI) covers the no-long-lived-keys control for cloud access, because workloads receive credentials at runtime with no long-lived cloud keys in your code.</p>
<p>Control Plane works alongside OPA, Sentinel, Checkov, Kyverno, and cloud-native policy services. It narrows what those tools must govern by applying one access model across every cloud it runs on.</p>
<h3>Audit trail and compliance</h3>
<p>A tamper-proof audit trail records platform actions from every interface; it does not collect logs from downstream services. Workloads can write their own events to the same audit trail through an audit context, and org logs can ship to external providers such as Amazon S3, CloudWatch, and Datadog for off-site retention. Control Plane publishes a PCI responsibility matrix showing which controls it covers and which stay with the customer. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant, and the customer’s own controls remain the customer’s responsibility.</p>
<h3>Day 2 operations</h3>
<p>Control Plane handles Day 2 operations for you: autoscaling, built-in observability, security, and right-sizing with Control Plane’s Capacity AI, which adjusts reserved CPU and memory based on historical usage, with no Kubernetes cluster you have to operate. On MK8s locations, Control Plane maintains the clusters for you, including upgrades to the Kubernetes version you select and node autoscaling. Capacity AI does not apply to GPU workloads or to workloads that autoscale on CPU utilization or on multiple metrics. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations.</p>
<h3>AI assistants</h3>
<p>AI assistants connect to Control Plane’s MCP server through OAuth with per-org consent, reach only the orgs the user selects, and call the same API as every other interface, so their actions land in the same audit trail. A readonly profile exposes no tool that creates, updates, deletes, or executes, so an assistant on it cannot change a live resource.</p>
<p>For running one app across clouds, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">how to run the same app on AWS, GCP, and Azure at the same time</a>. For teams without a dedicated platform team, see <a href="https://controlplane.com/blog/post/production-grade-infrastructure-without-platform-team?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">production-grade infrastructure without a platform team</a>.</p>
<h2>FAQ</h2>
<p>Common questions from teams adopting policy as code for multi-cloud infrastructure.</p>
<h3>What is the difference between policy as code and infrastructure as code?</h3>
<p>Infrastructure as code defines what resources to create, such as a virtual machine, a database, or a network. Policy as code defines the rules those resources must satisfy, such as “encryption at rest is required” or “only approved regions are allowed.” IaC provisions and policy as code governs, and both run in the same pipeline.</p>
<h3>Should I use OPA or Sentinel?</h3>
<p>Use OPA if your governance scope extends beyond Terraform, because it is a general-purpose, CNCF-graduated engine that works across IaC, Kubernetes, and APIs. Sentinel fits teams standardized on HCP Terraform or Terraform Enterprise that want its built-in integration. Many organizations use both: Sentinel for Terraform plan checks and OPA for Kubernetes admission and other policy decisions.</p>
<h3>Is Terraform still open source?</h3>
<p>No. HashiCorp moved Terraform from MPL 2.0 to the Business Source License in August 2023, which makes it source-available but not open source under the Open Source Initiative’s definition. OpenTofu is a community fork, now a CNCF Sandbox project, that keeps the MPL 2.0 license.</p>
<h3>How do I handle exceptions to a policy?</h3>
<p>Open a pull request in the policy repository that names the rule, the reason, a compensating control, an approver, and an expiry date. Expired exceptions are revoked automatically, and each approval and revocation is kept as evidence.</p>
<h3>How do I structure governance and policy as code for compliant multi-cloud infrastructure using IaC?</h3>
<p>Use three policy tiers: organization guardrails in cloud-native controls, platform policies evaluated in CI and at admission, and team-level rules scoped to specific services. Keep all policies in a versioned, tested library repository, enforce them at four points from editor to runtime, run a documented exception process, and store evidence automatically.</p>
<h3>Which tools automate AI infrastructure provisioning and policy enforcement for multi-cloud environments?</h3>
<p>Combine a cross-cloud IaC tool (Terraform, OpenTofu, or Pulumi) with a policy engine (OPA, Sentinel, or Kyverno) and a static scanner such as Checkov, and layer cloud-native controls (AWS SCPs, Azure Policy, Google Cloud Organization Policy) underneath. For AI workloads, add policies for GPU types and quotas, approved regions, required tags, and encryption of model artifacts.</p>
<h3>What is drift detection and why does it matter?</h3>
<p>Drift detection compares a resource’s live state with what your code declares and flags differences, which usually come from console or API changes made outside the pipeline. Without it, your IaC stops being a reliable record of what exists, and compliance evidence loses its value.</p>
<h3>How can AI operable infrastructure automate patching, upgrades, and policy enforcement for clusters?</h3>
<p>Replace node pools with patched images on a schedule, keep cluster versions inside the supported Kubernetes release window, and run admission and runtime policy checks continuously. Let AI assistants propose changes as pull requests with human approval for production, and route agent changes through the same policy pipeline and audit trail as human changes.</p>
<h3>Which tools provide an easy installation and setup process for cloud infrastructure orchestration across AWS and Azure?</h3>
<p>Look for a single CLI, a managed state backend, OIDC-based workload identity federation for provider authentication, a module registry, and built-in policy checks. Terraform, OpenTofu, and Pulumi all support these patterns. Policy checks come from HCP Terraform (Sentinel or OPA), Pulumi CrossGuard, or an external scanner such as Checkov or Conftest. Control Plane adds its own Terraform and Pulumi providers and a Kubernetes operator that fit into the same pipeline.</p>
<h3>Do I need a separate policy repository or can policies live with my infrastructure code?</h3>
<p>Use a separate policy library repository. It lets a security or platform team review policies centrally, version them independently, and serve many infrastructure repositories, each pinned to a policy version so policy releases do not couple to infrastructure changes.</p>
<p>Ready to run workloads across clouds with one access model and one audit trail? <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/policy-as-code-multi-cloud-iac-governance?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=policy-as-code-multi-cloud-iac-governance">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Self-Host OpenClaw on Control Plane: A Private, Always-On AI Agent in One Install]]></title><description><![CDATA[Self-host OpenClaw on Control Plane: a private, always-on AI agent with chat apps, tools, and memory, deployed in one install.]]></description><link>https://controlplane-eng.hashnode.dev/self-host-openclaw-on-control-plane-a-private-always-on-ai-agent-in-one-install</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/self-host-openclaw-on-control-plane-a-private-always-on-ai-agent-in-one-install</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 20:48:21 GMT</pubDate><content:encoded><![CDATA[<p><em>By Jacob Cox</em></p>
<p><a href="https://github.com/openclaw/openclaw">OpenClaw</a> calls itself “The AI that really does things”, and the project has more than 390,000 GitHub stars. One Gateway connects the model of your choice to chat apps such as Telegram, Slack, Discord and WhatsApp, and gives it a shell, files, a headless browser, scheduled jobs, memory and MCP servers. The hard part is running an agent with a shell safely: long-lived state, bot tokens that must stay secret, and an endpoint you do not want on the internet by accident. On Control Plane, OpenClaw is one install from the Template Catalog, Control Plane’s library of ready-to-install apps, from the Console, CLI, Terraform or Pulumi. It has no public endpoint by default, reads its keys from a secret you create, and comes with the Control Plane MCP server registered, so after you sign in the agent can manage your Control Plane resources from chat.</p>
<h2>Why self-host OpenClaw on Control Plane</h2>
<ul>
<li><strong>One install.</strong> No manifests and no wiring. The Gateway, its storage, its identity and its browser come up together with secure defaults.</li>
<li><strong>Secrets kept out of config.</strong> Your gateway token, model key and bot tokens live in one Control Plane secret you create. The workload reads them by reference, so none of them appear in Helm values or your install command.</li>
<li><strong>Least privilege, created for you.</strong> The workload’s Control Plane identity can read your secret and its own first-boot config (the Gateway’s initial settings file), and nothing else. Signing in to the Control Plane MCP server is a separate, explicit step.</li>
<li><strong>Private by default.</strong> No public endpoint until you ask for one. Telegram, Slack, Discord and WhatsApp all connect outbound, so they work on a private install.</li>
<li><strong>Control Plane from chat.</strong> The Control Plane MCP server exposes the Control Plane API as tools an AI agent can call. It is pre-registered and does nothing until someone signs in, and after sign-in the agent can do what that account can do.</li>
<li><strong>Snapshots included.</strong> State sits on a volume with daily snapshots, with no bucket or backup job to set up.</li>
</ul>
<h2>Included out of the box</h2>
<ul>
<li>Any model you bring: Anthropic, OpenAI, or any OpenAI-compatible endpoint such as OpenRouter or a LiteLLM gateway</li>
<li>Headless Chromium for the agent’s browser tool (can be turned off)</li>
<li>The built-in Control UI for configuring and watching the agent</li>
<li>A 10 GiB volume for config, sessions, plugins, workspace and memory, which can grow automatically (off by default)</li>
<li>Daily snapshots at 03:00 UTC, kept for 7 days (schedule and retention are configurable)</li>
<li>An optional OpenAI-compatible HTTP API</li>
<li>Built-in Control Plane logs and metrics, plus Control Plane’s tamper-proof audit trail of platform actions</li>
</ul>
<h2>How to run OpenClaw securely without a public URL</h2>
<p>The Gateway accepts no traffic from the internet until you turn it on, and by default only workloads in the same Global Virtual Cloud (GVC), Control Plane’s term for a set of locations a workload runs across, can reach it. Traffic between workloads uses mTLS. For setup you reach the Control UI with <code>cpln port-forward</code> from the Control Plane CLI, and you turn on public access, optionally on a custom domain, only when you want it. Apps in the same GVC reach the optional HTTP API over internal DNS by sending the gateway token, which is a full-admin credential, as a bearer token, plus an X-Forwarded-For header with a non-loopback address. Because the chat channels dial out, you can run a Slack or Telegram assistant with no public URL at all.</p>
<p>If you turn on public access, the gateway token guards the agent from the internet. Each new browser also needs a one-time approval from the CLI, but the HTTP API, if you enable it, accepts the token alone, so keep the token long and random.</p>
<p>Control Plane isolates each workload with cgroups, namespaces, and restricted syscalls and capabilities. The agent’s shell runs inside the Gateway’s own container, with the Gateway’s access: its volume, its keys and the workload’s Control Plane token, which can only reveal the two secrets the template grants. Outbound traffic is open so the Gateway can reach your model and chat apps. Like any agent with a shell, OpenClaw can be steered by an approved contact, a web page it reads or a third-party skill, so give it only the access you would give those sources.</p>
<h2>Where OpenClaw’s API keys and bot tokens live</h2>
<p>You create one Control Plane dictionary secret, a secret that holds named key-value pairs, with a <code>gateway-token</code> (your Control UI login, at least 24 characters), an <code>llm-api-key</code>, and the bot tokens for each channel you enable (WhatsApp needs none). The template creates a policy that lets the workload’s identity reveal exactly that secret and the first-boot config, which holds no credentials. The Gateway, and so the agent’s shell, can read these values at runtime, so use a model key with a spend limit and bot tokens you can revoke. OpenClaw also runs a heartbeat turn every 30 minutes by default, so it spends some model tokens even when nobody messages it.</p>
<p>To rotate a key, export the secret with <code>cpln secret reveal SECRET_NAME -o yaml</code>, edit it, re-apply it with <code>cpln apply -f</code>, and delete the exported file, which holds your keys in plain text. Then run <code>cpln workload force-redeployment</code> to load the new values. Because OpenClaw runs a single Gateway, the redeployment takes the assistant offline for about 4 minutes, so rotate during a quiet window. If a token leaks, revoke it with the provider too, because changing the secret does not invalidate the old token.</p>
<h2>Manage Control Plane from your chat apps</h2>
<p>With <code>cplnMcp.enabled</code> (the default), the Control Plane MCP server is registered as <code>cpln</code>. In the default shared mode, you sign in once from a terminal and approved chat contacts act through that account, so sign in with a dedicated Control Plane user whose policies grant only what the assistant needs, or set <code>cplnMcp.enabled</code> to false. Control Plane actions taken through the MCP server are recorded in the audit trail under that user. In per-requester mode, which needs public access, each person signs in with their own Control Plane account from a chat link. Once signed in, you can ask the assistant to list your GVCs, inspect a workload or check a deployment.</p>
<h2>State that survives</h2>
<p>Pairings, the WhatsApp link, MCP sign-ins, sessions and memory live on the volume, and the platform snapshots it on a schedule. The Gateway runs as one replica by design, because OpenClaw supports one Gateway per state directory and each bot token holds only one connection. For a separate assistant per person or team, install the template again under a different release name, with its own secret and bot tokens. Control Plane encrypts volumes by default; snapshots still hold channel sessions and tokens, so limit who can restore them. Uninstalling deletes the volume and all state, so copy out anything you need first.</p>
<h2>How to deploy OpenClaw on Control Plane</h2>
<p><a href="https://console.cpln.io/signup">Sign up for Control Plane</a>, then work in this order. First, create the dictionary secret described above, in the Console or with <code>cpln secret create-dictionary</code>, using <code>openssl rand -hex 32</code> for the gateway token. It must exist before you install: an install that points at a missing secret reports success but never starts. Second, pick an existing GVC with a single location, because the template does not create one and each extra location would run its own assistant competing for the same bot tokens. Third, install OpenClaw from the Template Catalog in the Console, or with <code>cpln helm install</code>, setting <code>secret.name</code> to your secret’s name. Open the Control UI with <code>cpln port-forward</code> and sign in with the <code>gateway-token</code> value.</p>
<p>To connect a chat app, add its bot token to the secret first (WhatsApp needs none), then enable the channel with <code>cpln helm upgrade</code>, repeating every value you installed with, including <code>secret.name</code>, because an upgrade does not keep values you leave out. DM your bot, approve the pairing code it replies with using <code>cpln workload exec</code>, then DM it again, and the reply comes from your model. Approve only contacts you would trust as admins, because an approved contact can have the agent run shell commands in the Gateway’s container. To hold each command for your approval, set <code>tools.exec.ask</code> to <code>always</code>.</p>
<p>The <a href="https://docs.controlplane.com/template-catalog/templates/openclaw?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=openclaw-on-control-plane">OpenClaw template documentation</a> has the exact commands, bot setup for each channel, the custom domain, the HTTP API and troubleshooting. Running agents for a team or across your company? <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=openclaw-on-control-plane">Request a demo</a>.</p>
<h2>FAQ</h2>
<p>These answers cover running OpenClaw with the Control Plane template.</p>
<h3>What is OpenClaw?</h3>
<p>OpenClaw is an open source, self-hosted AI assistant you chat with in apps such as WhatsApp, Telegram, Slack, Discord, iMessage and Teams. It can run shell commands, browse the web, edit files and run scheduled jobs with the model you choose. The Control Plane template connects Telegram, Slack, Discord and WhatsApp.</p>
<h3>How do I self-host OpenClaw?</h3>
<p>Create a dictionary secret with a gateway token and your model key, then install OpenClaw from the Control Plane Template Catalog into an existing single-location GVC, from the Console or with <code>cpln helm install</code>, setting <code>secret.name</code> to that secret. The template creates the Gateway workload, its volume, identity and access policy, and keeps it private by default.</p>
<h3>What resources does OpenClaw need on Control Plane?</h3>
<p>The template reserves 500 millicores of CPU and 1 GiB of memory by default, with limits of 2 cores and 3 GiB, plus a 10 GiB volume. With the browser tool turned off, a 2 GiB memory limit is enough. You pay for the CPU and memory a workload reserves, with no contracts or minimums.</p>
<h3>How do I run OpenClaw securely?</h3>
<p>Keep the Gateway off the public internet and keep its keys in a secret the workload reads by reference, which the Control Plane template does by default. Then approve pairings only for trusted contacts, vet third-party skills before installing them, and sign in the Control Plane MCP server with a limited-permission user or disable it. To approve each shell command yourself, set <code>tools.exec.ask</code> to <code>always</code>. Like any agent with a shell, OpenClaw can be steered by an approved contact or by a page it reads, so these limits matter.</p>
<h3>Does OpenClaw on Control Plane need a public URL?</h3>
<p>No. The install is private by default, you reach the Control UI with <code>cpln port-forward</code>, and all four chat channels in the template, including WhatsApp, connect outbound. Turn on public access, optionally on a custom domain, when you want the Control UI on the web for daily use, the HTTP API for callers outside Control Plane, or each chat user signed in to Control Plane with their own account.</p>
<h3>Where are OpenClaw’s API keys and bot tokens stored?</h3>
<p>In one Control Plane dictionary secret that you create before installing. The workload reads the values by reference at startup, through a policy created by the template that grants its identity access to that secret and the first-boot config only.</p>
<h3>Can I run OpenClaw in more than one location?</h3>
<p>Run it in one location. A workload runs in every location of its GVC, so each extra location would start its own assistant, and they would compete for the same bot tokens. Pick a GVC with a single location, and install the template again under a different release name, with its own secret and bot tokens, for more assistants.</p>
<h3>How is OpenClaw’s state backed up?</h3>
<p>All state, including pairings, the WhatsApp link, MCP sign-ins, sessions and memory, lives on a volume (10 GiB to start) that the platform snapshots daily at 03:00 UTC and keeps for 7 days by default. No bucket or cloud account is needed. Restoring a snapshot reverts the volume in place, so anything written after it, including newer pairings, is lost, and uninstalling deletes the volume.</p>
<h3>Which models can OpenClaw use on Control Plane?</h3>
<p>Any model you bring a key for: Anthropic, OpenAI, or any OpenAI-compatible endpoint such as OpenRouter or a LiteLLM gateway. You set the provider and bare model ID as template values, plus a base URL for an OpenAI-compatible endpoint. The default is Anthropic’s Claude Opus 5.5.</p>
<h3>What can someone who messages my OpenClaw bot do?</h3>
<p>Nothing until you approve them: a new contact gets a pairing code, and the agent does not process their messages until you approve it. An approved contact can use everything the agent can, including shell commands in its container, the browser, the keys it can read, and, if the Control Plane MCP server is signed in, that account’s permissions. Approve only people you would trust as admins.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/openclaw-on-control-plane?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=openclaw-on-control-plane">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Run an App Across Multiple Regions: Routing, Databases, and Failover for Stateful Workloads]]></title><description><![CDATA[How to run an app across multiple regions: routing, databases, and failover for stateful workloads, with the trade-offs for each pattern.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-run-an-app-across-multiple-regions-routing-databases-and-failover-for-stateful-workloads</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-run-an-app-across-multiple-regions-routing-databases-and-failover-for-stateful-workloads</guid><category><![CDATA[Cloud]]></category><category><![CDATA[Devops]]></category><category><![CDATA[database]]></category><category><![CDATA[architecture]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 18:57:18 GMT</pubDate><content:encoded><![CDATA[<p>Run an app across regions by deploying the same stateless services from one definition to every region, putting a health-checked global routing layer in front that sends each user to the nearest healthy region, and choosing a data topology per database (single primary with replicas, multi-primary, or distributed SQL) based on how much write latency and data loss you can accept. Failover for stateless services is a routing change, while failover for databases is a promotion that must be designed and tested. Control Plane runs one workload definition active-active in every location of Control Plane’s Global Virtual Cloud (GVC) behind a global endpoint that routes to the nearest healthy location, and its template catalog includes multi-location PostgreSQL, multi-master PostgreSQL, Redis, and CockroachDB.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>One definition everywhere.</strong> Deploy the same workload definition to every region so regions cannot drift apart.</li>
<li><strong>Global routing with health checks.</strong> DNS routing, anycast load balancers, or both send users to the nearest healthy region and away from failures.</li>
<li><strong>A data topology per service.</strong> Single primary with replicas, multi-primary, or distributed SQL, each with its own trade-off between write latency, data loss on failover, and complexity.</li>
<li><strong>Failover differs by layer.</strong> Stateless services fail over through routing. Databases need fencing, promotion, and repointed connections, automated and rehearsed.</li>
<li><strong>Quorum sets the location count.</strong> Automatic failover needs a majority, so two locations survive no location loss, three survive one, and five survive two.</li>
<li><strong>On Control Plane,</strong> one definition runs active-active in every location of a GVC behind a global endpoint, with database templates for the data layer.</li>
</ul>
<h2>How do I run my app across multiple regions?</h2>
<p>The goal is to deploy the same application to every region without hand-built per-region setup, so adding or removing a region is an operational change.</p>
<h3>How do I deploy one application to multiple regions with a single configuration?</h3>
<ol>
<li><strong>Make services stateless.</strong> Move sessions, caches, and mutable state into external stores so any instance can be replaced or moved.</li>
<li><strong>Externalize configuration and secrets.</strong> Connection strings, keys, and feature flags come from a secrets manager or configuration service, so one container image runs in any region.</li>
<li><strong>Use infrastructure as code or a platform with multi-region placement.</strong> Terraform or Pulumi can target many regions from one module, and some platforms place a workload in several regions from a single definition.</li>
<li><strong>Override per region only where you must.</strong> Limit overrides to region-specific needs such as instance types or data residency labels; keep the image, resources, and health checks identical.</li>
<li><strong>Choose a rollout order.</strong> Region-by-region rollouts catch problems before they spread; all-at-once rollouts are faster but risk a bad release hitting every region together.</li>
<li><strong>Check regional dependencies first.</strong> Quotas, instance availability, and data residency rules differ by region, so request capacity before you need it.</li>
</ol>
<p>For one application on AWS, GCP, and Azure at once, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">running the same app across AWS, GCP, and Azure</a>.</p>
<h2>How do I route users to the nearest healthy region automatically?</h2>
<p>Two routing mechanisms, both driven by health checks, cover most designs.</p>
<ul>
<li><strong>DNS latency and geo routing.</strong> <a href="https://aws.amazon.com/route53/">Amazon Route 53</a> offers latency, geolocation, and failover routing with health checks. <a href="https://learn.microsoft.com/en-us/azure/traffic-manager/traffic-manager-overview">Azure Traffic Manager</a> routes at the DNS level with endpoint monitoring. <a href="https://cloud.google.com/dns/docs/routing-policies-overview">Google Cloud DNS routing policies</a> support geolocation, weighted round robin, and failover policies with health checks. DNS routing is simple, but TTLs and client caching slow the switch.</li>
<li><strong>Anycast global load balancers.</strong> <a href="https://cloud.google.com/load-balancing/docs/https">Google Cloud’s global external Application Load Balancer</a> uses anycast IPs for HTTP(S) traffic. <a href="https://aws.amazon.com/global-accelerator/">AWS Global Accelerator</a> gives static anycast IPs that route TCP and UDP to the nearest healthy endpoint. <a href="https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview">Azure Front Door</a> combines global routing with WAF and caching. These route each connection without waiting for DNS caches to expire.</li>
<li><strong>Health checks.</strong> Check application health endpoints in addition to TCP ports, and require several failures before removing a region so traffic does not flap.</li>
</ul>
<table>
<thead>
<tr>
<th>Mechanism</th>
<th>Failover speed</th>
<th>Granularity</th>
<th>Caveats</th>
</tr>
</thead>
<tbody><tr>
<td>DNS latency or geo routing</td>
<td>Depends on TTLs and client caching</td>
<td>Per DNS lookup</td>
<td>Some resolvers and clients hold records past the TTL</td>
</tr>
<tr>
<td>Anycast global load balancer</td>
<td>Faster, independent of DNS caching</td>
<td>Per connection or request</td>
<td>Protocol support varies by service</td>
</tr>
<tr>
<td>DNS plus anycast</td>
<td>Fast for new connections; open connections may need retries</td>
<td>Per connection</td>
<td>More moving parts</td>
</tr>
</tbody></table>
<h2>How do I run stateful workloads like databases across multiple regions?</h2>
<p>Every multi-region database design trades write latency, data loss on failure, consistency, and operational effort against each other.</p>
<h3>Replication modes</h3>
<ul>
<li><strong>Synchronous replication</strong> makes the primary wait for at least one remote replica to confirm each write. Committed data survives a failover to that replica, but every write pays a cross-region round trip, which grows with distance. Writes stall if no synchronous replica is reachable, so fail over only to a replica confirmed in sync.</li>
<li><strong>Asynchronous replication</strong> confirms writes locally and ships changes in the background. Writes stay fast, but anything not yet replicated when the primary fails is lost, so the data at risk equals the replication lag at that moment.</li>
</ul>
<h3>Database topologies</h3>
<ul>
<li><strong>Single primary with read replicas.</strong> One region takes writes; others serve reads and can promote a replica. <a href="https://aws.amazon.com/rds/aurora/global-database/">Amazon Aurora Global Database</a> works this way, and PostgreSQL with <a href="https://github.com/patroni/patroni">Patroni</a> provides the same pattern in open source with automatic leader election.</li>
<li><strong>Multi-primary (active-active writes).</strong> Every region accepts writes, which removes the write-latency penalty for remote users but requires conflict resolution. Last-writer-wins is simple and can silently discard concurrent updates; ownership rules or conflict-free data types reduce that risk. <a href="https://learn.microsoft.com/en-us/azure/cosmos-db/distribute-data-globally">Azure Cosmos DB</a> supports multi-region writes.</li>
<li><strong>Distributed SQL with consensus.</strong> Each write commits once a majority of replicas agree, giving strong consistency without a single primary at the cost of cross-region write latency. <a href="https://cloud.google.com/spanner">Google Cloud Spanner</a>, <a href="https://www.cockroachlabs.com/docs/">CockroachDB</a>, and <a href="https://docs.yugabyte.com/">YugabyteDB</a> take this approach.</li>
<li><strong>Partitioning by tenant or region.</strong> Each tenant or partition has a home region that takes its writes, which avoids conflicts and helps with data residency.</li>
</ul>
<table>
<thead>
<tr>
<th>Topology</th>
<th>Write latency</th>
<th>Data loss on regional failover</th>
<th>Consistency</th>
<th>Operational effort</th>
<th>Fits</th>
</tr>
</thead>
<tbody><tr>
<td>Single primary, async replicas</td>
<td>Low in the primary region</td>
<td>Recent writes can be lost</td>
<td>Strong in the primary region</td>
<td>Low to moderate</td>
<td>Most applications</td>
</tr>
<tr>
<td>Multi-primary</td>
<td>Low everywhere</td>
<td>Unreplicated writes in the failed region are lost or delayed until it recovers</td>
<td>Eventual or causal</td>
<td>High</td>
<td>Global write-heavy apps that tolerate conflicts</td>
</tr>
<tr>
<td>Distributed SQL (quorum)</td>
<td>Higher (cross-region round trip)</td>
<td>Committed writes survive while a quorum remains</td>
<td>Strong</td>
<td>Moderate to high</td>
<td>Strong consistency across regions</td>
</tr>
<tr>
<td>Partitioned by tenant or region</td>
<td>Low within a partition</td>
<td>A partition’s recent writes can be lost if its home region fails</td>
<td>Strong within a partition</td>
<td>Moderate</td>
<td>Multi-tenant SaaS, data residency</td>
</tr>
</tbody></table>
<h3>Quorum math and location count</h3>
<p>Consensus systems need a majority to agree, so a cluster across N locations survives the loss of floor((N-1)/2) locations.</p>
<ul>
<li><strong>Two locations</strong> survive no location loss for automatic failover, because the survivor cannot form a majority alone.</li>
<li><strong>Three locations</strong> survive the loss of one, the minimum for safe automatic promotion.</li>
<li><strong>Five locations</strong> survive the loss of two.</li>
</ul>
<p>With two locations and no witness, a system cannot tell a network partition from a failure, so automatic promotion risks split brain. Run consensus-based databases in at least three locations, or add a witness or arbiter in an independent third location.</p>
<h3>Caches, queues, and object storage</h3>
<ul>
<li><strong>Caches.</strong> Redis replication with Sentinel or Redis Cluster spans regions, and Sentinel needs a majority across three locations to fail over automatically. Redis replication is asynchronous, so treat caches as rebuildable, and expect a cold cache in the surviving region to shift load onto the database.</li>
<li><strong>Queues and streams.</strong> RabbitMQ supports federation and shovels between clusters, and Kafka uses MirrorMaker 2 for cross-cluster replication, which translates consumer offsets approximately, so consumers must tolerate duplicates. Most designs keep ordering per partition within a region and accept eventual consistency across regions.</li>
<li><strong>Object storage.</strong> S3 Cross-Region Replication, Cloud Storage dual-region and multi-region buckets, and Azure geo-redundant storage replicate asynchronously, so the newest objects may be missing or unreadable in the surviving region right after a failure. Cloud Storage’s default replication targets a 12-hour RPO, and turbo replication on dual-region buckets targets 15 minutes.</li>
</ul>
<h3>Consistency pitfalls</h3>
<ul>
<li><strong>Read-your-writes.</strong> Users moved to another region, or reading from asynchronous replicas, can see stale data; route reads to the primary right after a write, or use session tokens.</li>
<li><strong>Unique IDs.</strong> Multi-primary designs need globally unique IDs, such as UUIDv7, instead of per-node sequences.</li>
<li><strong>Schema changes.</strong> Use expand-and-contract migrations, because old and new code run side by side during region-by-region rollouts, and check whether your replication carries DDL.</li>
</ul>
<h2>How do I fail over a database-backed application between cloud regions?</h2>
<p>Run database failover as an ordered sequence.</p>
<ol>
<li><strong>Detect.</strong> Application-level health checks confirm the primary region is down rather than slow.</li>
<li><strong>Fence the old primary.</strong> It must lose its leader lease and demote itself; use STONITH or a fencing token where available, and revoke its write credentials if it is still reachable, so two primaries never write at once.</li>
<li><strong>Promote.</strong> Promote a replica in a surviving region. With asynchronous replication, writes not yet replicated are lost, so track replication lag continuously to know your real RPO.</li>
<li><strong>Repoint applications.</strong> A stable endpoint or proxy that follows the current leader makes this automatic; otherwise applications need new connection strings or DNS changes. Drain or kill pooled connections to the old primary.</li>
<li><strong>Verify.</strong> Confirm writes succeed, replicas stream from the new primary, and application health checks pass.</li>
<li><strong>Rebuild the old region as a replica.</strong> Export any writes it holds that never replicated, resync it with pg_rewind or a fresh base backup, and only then let it rejoin as a replica. Moving the primary back is a separate, planned operation.</li>
</ol>
<p>Clients should retry with idempotency keys, because in-flight transactions may have committed just before the failure.</p>
<p>Alert when replication lag exceeds your RPO, because lag grows under heavy writes and network trouble. Serving reads while blocking writes is a useful degraded mode when promotion is unsafe. Rehearse the whole sequence in regular game days to measure real RTO and expose hidden dependencies; for testing approaches and costs, see <a href="https://controlplane.com/blog/post/active-active-vs-active-passive-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">active-active vs. active-passive costs</a>.</p>
<h2>How can my company avoid being taken down by the next major cloud outage?</h2>
<p>Each item removes a common cause of regional downtime.</p>
<ul>
<li>Run in more than one region, or on more than one provider; availability zones alone share a region’s fate.</li>
<li>Audit hidden single-region dependencies: DNS, secrets, container registries, CI/CD, monitoring, and identity.</li>
<li>Choose a data topology per service instead of one pattern for everything.</li>
<li>Test failover regularly in production-like conditions and fix what breaks.</li>
<li>Keep one runbook for drills and real events, and update it after each drill.</li>
<li>Keep enough headroom or reserved capacity for surviving regions to absorb a failed region’s load; autoscaling can hit quota or capacity limits during a regional outage.</li>
<li>Plan who is paged, what the status page says, and how customers hear about it.</li>
</ul>
<p>For a step-by-step regional plan, see <a href="https://controlplane.com/blog/post/keep-app-online-aws-region-outage?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">keeping your app online during an AWS region outage</a>, and for incident history, the <a href="https://controlplane.com/blog/post/cloud-outage-tracker?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">cloud outage tracker</a>.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the platform for running unbreakable apps and agents. It combines any cloud, neocloud, and bare metal into a GVC, the set of locations a workload runs across, and runs serverless, standard, stateful, and cron workloads on AWS, GCP, and Azure, on Kubernetes clusters you already run, and on your own machines turned into managed locations, including on premises.</p>
<p><strong>One definition, every location.</strong> Each location of a GVC serves traffic at once, and the global endpoint sends each request to the nearest healthy one. Disabling a location removes its replicas and routes traffic to the locations that remain. Location routing options include latency offsets that make a location appear closer or farther, and priority routing tiers, where a lower-priority tier receives traffic only when every location in the higher-priority tier is unavailable. Domain route changes apply to every location of a GVC at once. Workload updates roll out behind readiness checks, each location keeps serving the last healthy version until the new one reports ready, and rolling back is an explicit action.</p>
<p><strong>Database templates.</strong> Postgres Multi-Location deploys one PostgreSQL cluster managed by Patroni whose members span several locations, with a single primary that takes all writes, asynchronous streaming replicas in the other locations, automatic promotion of a replica in a surviving location when the primary’s location is lost, and an HAProxy tier in every location that routes connections to the current leader, so applications connect to a stable name in their own region. Automatic promotion needs a quorum, so plan for at least three locations. Because replication is asynchronous, the most recent writes can be lost when a location fails. pgEdge deploys active-active PostgreSQL with Spock multi-master replication across the locations you list, with a per-location HAProxy failover tier and PgBouncer pooler. Redis multi-location runs one Sentinel per location, so two locations give no automatic failover and three survive the loss of one; etcd multi-location tolerates one loss with three locations and two with five. A CockroachDB template is also available. Template backups are optional and off by default, restore support varies by template (pgEdge’s backup job also restores, while others document manual procedures), and Control Plane does not make arbitrary databases multi-region automatically.</p>
<p><strong>Proof.</strong> During the October 20, 2025 AWS us-east-1 outage, which lasted about 15 hours, Control Plane customers with us-east-1 in their GVC had no downtime, and their workloads were “active and running in healthy locations within 10 seconds,” according to Control Plane internal incident telemetry (<a href="https://controlplane.com/blog/post/beyond-backups-designing-systems-that-survive-the-inevitable?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">details</a>).</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be two regions of one cloud or locations on different providers. The SLA covers workloads; database failover follows the quorum rules above. Control Plane handles Day 2 operations for you, including autoscaling, Capacity AI right-sizing, built-in observability, and security, with no Kubernetes cluster you have to operate, and it ships Terraform and Pulumi providers. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<h2>FAQ</h2>
<p>Short answers to common multi-region questions.</p>
<h3>How do I run my app across multiple regions?</h3>
<p>Deploy stateless services from one definition to every region, put health-checked global routing in front, and pick a replication topology for each database based on its write-latency and data-loss tolerance.</p>
<h3>How do I deploy one application to multiple regions with a single configuration?</h3>
<p>Make services stateless, externalize configuration and secrets, and use infrastructure as code or a platform with multi-region placement, keeping per-region overrides to the minimum.</p>
<h3>How do I route users to the nearest healthy region automatically?</h3>
<p>Use DNS latency or geo routing with health checks, an anycast global load balancer, or both. Anycast avoids waiting on DNS caches; DNS is simpler to adopt.</p>
<h3>How do I run stateful workloads like databases across multiple regions?</h3>
<p>Choose single primary with replicas, multi-primary with conflict handling, distributed SQL with quorum writes, or partitioning by tenant or region, and run consensus-based systems in at least three locations, or two plus a witness in a third.</p>
<h3>How do I fail over a database-backed application between cloud regions?</h3>
<p>Detect the failure, fence the old primary, promote a replica in a surviving region, repoint applications through a stable endpoint, verify, and rebuild the failed region as a replica.</p>
<h3>What happens to writes during a failover with asynchronous replication?</h3>
<p>Writes committed on the old primary but not yet replicated are lost; the amount equals the replication lag at the moment of failure.</p>
<h3>Why do I need three locations for automatic database failover?</h3>
<p>Automatic failover needs a majority. With two locations the survivor cannot form one, while three locations let the remaining two elect a new primary.</p>
<h3>What is the difference between active-active and active-passive?</h3>
<p>Active-active serves traffic from every region at once, though writes may still go to one primary; active-passive sends all traffic to one region and switches only on failure.</p>
<h3>How can my company avoid being taken down by the next major cloud outage?</h3>
<p>Run in more than one region or provider, remove single-region dependencies, choose data topologies per service, and rehearse failover until it is routine.</p>
<h3>Can Control Plane run my database across multiple regions?</h3>
<p>Yes, through templates: Postgres Multi-Location (single primary with automatic promotion), pgEdge (multi-master PostgreSQL), Redis with Sentinel, etcd, and CockroachDB, each spanning the GVC locations you choose.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to run one definition across every region you need.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/run-app-across-multiple-regions-routing-databases-failover?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=run-app-across-multiple-regions-routing-databases-failover">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Multi-Tenant Isolation for SaaS and AI: How to Prevent Cross-Tenant Data Breaches, Segregate Tenant Data, and Use Customer-Managed Keys]]></title><description><![CDATA[Multi-tenant isolation for SaaS and AI: how to prevent cross-tenant data breaches, segregate tenant data, and use customer-managed keys.]]></description><link>https://controlplane-eng.hashnode.dev/multi-tenant-isolation-for-saas-and-ai-how-to-prevent-cross-tenant-data-breaches-segregate-tenant-data-and-use-customer-managed-keys</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/multi-tenant-isolation-for-saas-and-ai-how-to-prevent-cross-tenant-data-breaches-segregate-tenant-data-and-use-customer-managed-keys</guid><category><![CDATA[Security]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 18:50:39 GMT</pubDate><content:encoded><![CDATA[<p>Cross-tenant breaches are prevented by enforcing the tenant boundary at every layer of the stack, including identity and authorization, network, compute, storage, encryption keys, and AI-specific data such as retrieval indexes, caches, and fine-tuning datasets, with application code as one layer among several. Choose the tenancy model (silo, pool, or bridge) per tier based on customer risk and compliance needs. On Control Plane, teams enforce these boundaries with deny-by-default workload firewalls, workload identities, policy-based access control, and separate environments per tenant on AWS, GCP, Azure, Kubernetes clusters you already run, or a tenant’s own infrastructure.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Preventing cross-tenant data breaches in multi-tenant SaaS and AI systems requires isolation at every architectural layer and the right tenancy model for each tier.</p>
<ul>
<li><strong>Tenancy models.</strong> Silo (dedicated stack per tenant), pool (shared infrastructure with tenant ID enforced everywhere), and bridge (shared tiers plus dedicated tiers for regulated or large tenants) each carry different cost, complexity, and isolation trade-offs.</li>
<li><strong>Isolation layers.</strong> Identity and authorization, network segmentation, compute boundaries, storage and databases, encryption keys, AI data (indexes, caches, memory, fine-tuning), logs and observability, and CI/CD each need their own tenant-aware controls.</li>
<li><strong>Customer-managed keys.</strong> BYOK (bring your own key), meaning customer-managed encryption keys held in the customer’s key management service, gives tenants a cryptographic kill switch over their data. Per-tenant data keys wrapped by each tenant’s own customer-managed key through envelope encryption limit blast radius.</li>
<li><strong>AI-specific risks.</strong> Shared retrieval indexes, prompt caches, conversation memory, and fine-tuning datasets can leak data across tenants if the tenant filter is missing or applied after retrieval.</li>
<li><strong>Evidence for auditors.</strong> Automated cross-tenant tests in CI, access reports, penetration tests, and immutable audit trails demonstrate isolation to compliance reviewers.</li>
<li><strong>How Control Plane fits.</strong> Control Plane provides deny-by-default internal firewalls, workload identities, policy-based access control, and a separate Global Virtual Cloud (GVC), Control Plane’s term for a set of locations a workload runs across, or a separate org per tenant, on AWS, GCP, Azure, Kubernetes clusters you already run, or on premises.</li>
</ul>
<h2>What causes cross-tenant data breaches?</h2>
<p>Cross-tenant breaches stem from a small set of recurring failure classes.</p>
<p><strong>Missing tenant filter in a query.</strong> A database query that omits the <code>WHERE tenant_id = ?</code> predicate returns rows belonging to other tenants.</p>
<p><strong>Broken object-level authorization.</strong> When an API endpoint checks authentication but does not verify that the caller may access the specific object requested, one tenant can read or modify another tenant’s resources. OWASP lists this as <a href="https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/">API1: Broken Object Level Authorization</a>.</p>
<p><strong>Shared caches keyed without tenant ID.</strong> A cache entry keyed only by object ID or query hash can serve one tenant’s data to another. Every cache key must include the tenant identifier.</p>
<p><strong>Shared credentials or service accounts across tenants.</strong> When several tenants share one service account or database credential, a compromise in one tenant’s context grants access to every tenant’s data.</p>
<p><strong>Overly broad network paths between services.</strong> If every service can reach every other service, a vulnerability in one can be used to reach tenant data held by another.</p>
<p><strong>Shared retrieval indexes or vector stores without tenant filtering.</strong> In AI systems using retrieval-augmented generation (RAG), a vector search that does not enforce a tenant metadata filter before returning documents can surface another tenant’s content to the model.</p>
<p><strong>Logs and support tooling exposing data across tenants.</strong> Centralized logging or support dashboards that do not filter by tenant let operators or attackers view data from tenants they should not see.</p>
<p><strong>Container escape on shared hosts.</strong> A kernel exploit or container runtime vulnerability on a shared host can expose the credentials, environment variables, and storage volumes of co-located tenants. Shared GPUs can leak data between co-located jobs when memory is not cleared between them.</p>
<p><strong>Tenant context lost in async paths.</strong> Queue messages, background jobs, and event handlers that drop the tenant ID run with no tenant scope or the wrong one.</p>
<p><strong>Server-side request forgery.</strong> Tenant-supplied URLs (webhooks, imports, agent browsing) can reach internal services or cloud metadata endpoints.</p>
<p><strong>Noisy neighbor and resource exhaustion.</strong> One tenant’s traffic, jobs, or GPU use can starve shared compute, connection pools, or model provider quotas, which degrades every other tenant.</p>
<h2>What cloud solutions offer multi tenant protection against cross tenant data breaches?</h2>
<h3>Silo, pool, and bridge tenancy models compared</h3>
<p>The <a href="https://docs.aws.amazon.com/wellarchitected/latest/saas-lens/silo-pool-and-bridge-models.html">AWS Well-Architected SaaS Lens</a> describes three tenancy models: silo, pool, and bridge. Each makes a different trade-off between isolation strength, cost, and operational effort.</p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Silo</th>
<th>Pool</th>
<th>Bridge (Hybrid)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>What is shared</strong></td>
<td>Little or nothing. Dedicated account, network, database, and compute per tenant.</td>
<td>Nearly everything. Shared compute, database, cache, and network with tenant ID enforced in every layer.</td>
<td>Shared tiers (compute, API gateway) plus dedicated tiers (database, encryption keys, or compute) for regulated or large tenants.</td>
</tr>
<tr>
<td><strong>Isolation strength</strong></td>
<td>Strongest. Infrastructure boundaries limit the blast radius to one tenant.</td>
<td>Depends on application and platform controls. A single missing tenant filter can expose every tenant.</td>
<td>Strong where dedicated, application-dependent where shared.</td>
</tr>
<tr>
<td><strong>Cost</strong></td>
<td>Highest. Infrastructure is duplicated per tenant.</td>
<td>Lowest. Amortized across all tenants.</td>
<td>Middle. Dedicated tiers add cost only for tenants that need them.</td>
</tr>
<tr>
<td><strong>Operational effort</strong></td>
<td>High. Every tenant is a separate deployment to patch, monitor, and scale.</td>
<td>Lower per tenant, but requires rigorous enforcement of tenant context across every service, cache, queue, and store.</td>
<td>Moderate. Operators run both shared and dedicated tiers.</td>
</tr>
<tr>
<td><strong>When to use</strong></td>
<td>Regulated industries, contractual requirements for physical separation, tenants with unique compliance needs.</td>
<td>High-volume SaaS with many small tenants, low per-tenant revenue, and acceptable shared-infrastructure risk.</td>
<td>Many enterprise SaaS platforms. Offer a shared tier by default and move tenants to dedicated tiers based on contract, regulation, or risk.</td>
</tr>
</tbody></table>
<h3>Capabilities to look for in a platform</h3>
<p>Whatever model you choose, the underlying platform should provide:</p>
<ul>
<li>Deny-by-default network policy between services, so workloads cannot communicate unless explicitly permitted.</li>
<li>Per-service identity, so each service authenticates on its own and no shared static keys exist.</li>
<li>Fine-grained access policy that can target resources by name, tag, or query, and that applies automatically to resources created later.</li>
<li>Separate environments per tenant, with the option to place a tenant’s workloads in a dedicated account or region.</li>
<li>A dedicated infrastructure option for tenants that need physical separation, including in a tenant’s own cloud account or on premises.</li>
<li>Encryption with customer-managed keys, so tenants keep control over their data’s cryptographic lifecycle.</li>
<li>A tamper-proof audit trail of platform actions, queryable for compliance evidence.</li>
</ul>
<p>On Control Plane, deny-by-default firewalls, workload identities, query-based policies, a separate GVC or org per tenant, dedicated clusters in a tenant’s own cloud account, and a tamper-proof audit trail are built in; the details are in How Control Plane fits.</p>
<h2>How do I design AI infrastructure for cloud compliance using BYOK and tenant data segregation?</h2>
<h3>Customer-managed keys, BYOK, and HYOK</h3>
<p>BYOK (bring your own key) means the tenant creates and manages an encryption key in its own cloud key management service (such as AWS KMS, Azure Key Vault, or Google Cloud KMS) and grants the SaaS provider limited permission to use that key to encrypt and decrypt the tenant’s data. The provider never holds the customer’s key material; it holds plaintext data keys in memory only while it processes that tenant’s data.</p>
<p>HYOK (hold your own key) is a stricter variant in which the key stays in an external key manager or hardware security module the tenant controls, often on premises. The provider calls the tenant’s key manager to wrap or unwrap each data key, which adds latency and availability risk.</p>
<h3>Envelope encryption with per-tenant keys</h3>
<p>A practical pattern is envelope encryption. Each tenant’s data is encrypted with a unique data encryption key (DEK). That DEK is wrapped by the tenant’s customer-managed key (the key encryption key, or KEK) in the cloud KMS, and the wrapped DEK is stored alongside the ciphertext. To decrypt, the provider calls the tenant’s KMS to unwrap the DEK, then uses the DEK locally.</p>
<p>Bind each wrap and unwrap call to the tenant with a KMS encryption context (additional authenticated data) such as <code>tenant_id</code>. A wrapped DEK then fails to unwrap under any other tenant’s context, and on AWS KMS each CloudTrail entry records the tenant. Rotating the KEK does not require re-encrypting data. The KMS keeps prior key versions for unwrapping, and you can rewrap DEKs under the new version.</p>
<p>Key revocation works as a kill switch for data encrypted under that tenant’s DEKs. It takes effect once cached plaintext DEKs expire, so keep the DEK cache short-lived. Vector embeddings, caches, logs, and copies held by third parties are covered only if they are also encrypted under the tenant’s keys. Revocation breaks reads, writes, backups, search, and AI inference for that tenant, so document the blast radius before launch.</p>
<h3>AI-specific data segregation</h3>
<p>AI workloads add data surfaces that need tenant isolation:</p>
<ul>
<li><strong>Retrieval indexes and vector namespaces.</strong> Use separate vector collections or namespaces per tenant when feasible. When a shared index is necessary, apply a mandatory server-side tenant metadata filter on every query. Never let the model choose or infer the tenant ID.</li>
<li><strong>Prompt and response caches.</strong> Key every cache entry by tenant ID, and add user ID when the response depends on the user’s permissions. A shared semantic cache without tenant scoping will serve one tenant’s cached answer to another.</li>
<li><strong>Conversation memory and logs.</strong> Scope conversation history, uploaded files, and agent state to tenant, user, and session. Purge or archive them per the tenant’s retention policy.</li>
<li><strong>Fine-tuning data.</strong> Train per-tenant models or adapters on that tenant’s data only, and route inference to the requesting tenant’s adapter. Pool data across tenants only with explicit contractual consent, because fine-tuned models can reproduce training data. Keep provenance records for every training dataset.</li>
<li><strong>Document-level permissions.</strong> Filter retrieval by the requesting user’s permissions as well as the tenant ID. Without this, a shared index leaks documents across roles inside one tenant.</li>
<li><strong>Agent tool calls.</strong> Tools and connectors an agent invokes must run with credentials scoped to the requesting tenant and user, never a shared service account.</li>
<li><strong>Model provider data retention.</strong> Configure data retention and training opt-out settings with every model provider that processes tenant data, and recheck them periodically.</li>
<li><strong>Per-tenant region pinning.</strong> For data residency, pin a tenant’s data, including AI indexes and caches, to locations in the required jurisdiction.</li>
</ul>
<p>Prompt injection can try to make the model retrieve or reveal another tenant’s data. Authorization must sit outside the model, enforced by the application or platform before any data reaches the model context. The <a href="https://genai.owasp.org/llm-top-10/">OWASP Top 10 for LLM Applications</a> catalogs these risks.</p>
<h2>What are the best identity and access management solutions for multi tenant environments with provenance in mind?</h2>
<p>Evaluate IAM options for a multi-tenant environment against these criteria.</p>
<p><strong>Tenant context in signed tokens.</strong> Every request should carry a tenant claim in a signed token (for example, a JWT) that is validated on every API call. Derive the tenant ID from the authentication system, never from user input or URL parameters. Reject requests without a valid tenant claim before business logic runs, and reject a request when a tenant ID in the URL or body differs from the token claim.</p>
<p><strong>Separate identities for each service and environment.</strong> Each service and each environment (development, staging, production) should have its own identity. A service account shared across services or environments turns a compromise in one context into access to all of them.</p>
<p><strong>Workload identity federation instead of shared static keys.</strong> Cloud providers support workload identity federation, where a workload presents a token from a trusted identity provider and exchanges it for short-lived cloud credentials. That removes long-lived API keys and service account files that could leak.</p>
<p><strong>Least privilege scoped to tenant resources.</strong> Scope permissions to the specific tenant’s resources rather than every resource of a type. A database role that can read every tenant’s rows is too broad even if it cannot write.</p>
<p><strong>Provenance.</strong> Every action, whether by a human operator or an automated workload, must be attributable to a specific identity in an immutable audit trail. Provenance also covers software artifacts: signed builds and a verifiable build process, as defined by the <a href="https://slsa.dev/">SLSA framework</a>, show that the code running in production is the code that was reviewed and approved.</p>
<h2>Tenant isolation checklist by layer</h2>
<p>Each layer below lists a control and a concrete way to verify it.</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Control</th>
<th>How to verify</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Identity and authorization</strong></td>
<td>Tenant ID derived from a signed token and validated on every request. Object-level authorization on every endpoint. Jobs and messages carry the tenant ID, and workers re-check it before acting.</td>
<td>Automated cross-tenant API tests in CI. Access reports showing which identities hold which permissions.</td>
</tr>
<tr>
<td><strong>Network</strong></td>
<td>Deny-by-default firewall between services. Explicit allow rules only for required paths. mTLS between services.</td>
<td>Network policy audit. Penetration test attempting lateral movement between tenant workloads.</td>
</tr>
<tr>
<td><strong>Compute</strong></td>
<td>Workload isolation through cgroups, namespaces, and restricted syscalls. Sandboxed or dedicated compute for higher-risk tenants.</td>
<td>Container escape penetration test. Review of runtime security configuration.</td>
</tr>
<tr>
<td><strong>Storage and databases</strong></td>
<td>Row-level security with tenant context set per transaction. Separate databases or schemas for siloed tenants. Tenant context reset in connection pools. RLS forced on table owners (<code>FORCE ROW LEVEL SECURITY</code>), and application roles lack <code>BYPASSRLS</code>.</td>
<td>Automated queries attempting to read another tenant’s rows. Database role privilege audit.</td>
</tr>
<tr>
<td><strong>Encryption keys</strong></td>
<td>Per-tenant data encryption keys. Tenant ID bound as KMS encryption context. Customer-managed KEK through envelope encryption where required. Documented rotation and revocation procedures.</td>
<td>KMS access policy review. Revocation test confirming data becomes unreadable. Key usage audit log.</td>
</tr>
<tr>
<td><strong>AI data (indexes, caches, memory, fine-tuning)</strong></td>
<td>Server-side tenant filter on every vector query. Tenant-scoped caches and conversation memory. Fine-tuning data provenance.</td>
<td>Cross-tenant retrieval test returning zero results. Cache key inspection. Fine-tuning dataset lineage audit.</td>
</tr>
<tr>
<td><strong>Resource limits and rate limiting</strong></td>
<td>Per-workload CPU and memory limits. Per-tenant API rate limits, queue quotas, and model token budgets.</td>
<td>Load test one tenant past its quota and confirm other tenants’ latency holds.</td>
</tr>
<tr>
<td><strong>Logs and observability</strong></td>
<td>Logs tagged with tenant ID. Log access restricted by tenant. No unfiltered tenant data in shared dashboards.</td>
<td>Log query attempting to retrieve another tenant’s entries. Dashboard access review.</td>
</tr>
<tr>
<td><strong>Support and operations access</strong></td>
<td>Operator access scoped to tenant. Break-glass access logged and alerted. No persistent admin credentials.</td>
<td>Access report for support roles. Audit trail query for break-glass events.</td>
</tr>
<tr>
<td><strong>CI/CD and secrets</strong></td>
<td>Secrets scoped to environment. Signed build artifacts. Pipelines cannot deploy to a tenant’s environment without authorization.</td>
<td>Secret access audit. SLSA provenance verification. Pipeline permission review.</td>
</tr>
<tr>
<td><strong>Backups, offboarding, and deletion</strong></td>
<td>Backups encrypted with the tenant’s key. Per-tenant restore tested. Tenant data export before deletion. Offboarding deletes or crypto-shreds the tenant’s keys, vector namespaces, caches, conversation memory, and fine-tuned models or adapters, and requests deletion from model providers.</td>
<td>Restore a backup and confirm only the target tenant’s data is present. Deletion verification script.</td>
</tr>
</tbody></table>
<h2>What cloud compliance checklist should I follow when migrating a regulated application to AI infrastructure?</h2>
<p>This checklist is not legal advice. Consult qualified counsel for your specific obligations.</p>
<ol>
<li><strong>Classify data and decide what may reach a model.</strong> Identify which data elements are regulated (PHI, personal data, cardholder data) and decide whether they may go to a third-party model or must stay within your own infrastructure.</li>
<li><strong>Confirm data residency and region pinning.</strong> Verify that processing, storage, and AI inference for regulated data happen in the required jurisdiction, and pin workloads and data stores to those regions.</li>
<li><strong>Sign a BAA or DPA with every provider that touches regulated data.</strong> HIPAA requires a <a href="https://www.hhs.gov/hipaa/for-professionals/covered-entities/sample-business-associate-agreement-provisions/index.html">business associate agreement</a> with each business associate that creates, receives, maintains, or transmits PHI on your behalf, and each business associate must sign one with its subcontractors. GDPR Article 28 requires a contract or other binding legal act, usually called a data processing agreement, with each processor, and each processor must bind its sub-processors to the same obligations. That includes model providers, infrastructure providers, and observability vendors.</li>
<li><strong>Set model provider data retention and training opt-outs.</strong> Confirm in writing how long the model provider retains prompts and completions and that it does not train on your data.</li>
<li><strong>Encrypt with customer-managed keys where required.</strong> Use envelope encryption with per-tenant keys, and grant the provider only the key permissions it needs.</li>
<li><strong>Isolate tenants per the checklist above.</strong> Apply every layer of the tenant isolation checklist, with particular attention to AI data surfaces.</li>
<li><strong>Log access to regulated data.</strong> Keep immutable logs of who accessed what data, when, and why, including model inference calls that process regulated data. Confirm breach notification timelines (under GDPR, 72 hours to the supervisory authority where feasible).</li>
<li><strong>Run a DPIA for AI processing of personal data.</strong> GDPR Article 35 requires a data protection impact assessment for high-risk processing; update the subprocessor list and customer notices too.</li>
<li><strong>Update the risk assessment and SOC 2 system description.</strong> Adding AI components changes the system boundary. Document new risks, controls, and third-party dependencies.</li>
<li><strong>Test incident response for AI-specific failures.</strong> Simulate a model returning another tenant’s data, a prompt injection attack, and a model provider outage, and verify detection, containment, and notification.</li>
<li><strong>Document human review where decisions affect people.</strong> If AI outputs influence decisions about individuals (credit, insurance, employment), document the human review process and the criteria for overriding model outputs.</li>
</ol>
<p>For a deeper walkthrough, see our guide to <a href="https://controlplane.com/blog/post/run-regulated-apps-cloud-soc2-hipaa-pci-data-residency?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">running regulated apps in the cloud</a>.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant; the customer’s own controls remain the customer’s responsibility.</p>
<h3>Resource model and tenant boundaries</h3>
<p>An org is Control Plane’s top-level isolation boundary. Secrets, policies, domains, and images are org-scoped. Workloads, identities, and volume sets are scoped to a GVC, and a workload can only use volume sets and identities from its own GVC. Teams use a separate GVC per tenant or per tier for siloed tenants, or a separate org where they want a harder boundary. For Kubernetes-specific pitfalls, see <a href="https://controlplane.com/blog/post/kubernetes-multi-tenancy?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">Kubernetes multi-tenancy: 5 things to avoid</a>.</p>
<h3>Network isolation</h3>
<p>The internal firewall between workloads is deny by default. Each workload’s inbound rule allows nothing, the same GVC, the same org, or a named list of workloads. External inbound and outbound traffic are disabled by default, and outbound rules can allow specific CIDRs or hostnames. All traffic between workloads uses mTLS with a unique client certificate per workload.</p>
<h3>Access control and audit</h3>
<p>Beyond the built-in superusers and viewers policies, nothing is permitted inside an org until a policy grants it. A policy targets one resource kind and covers every item, named items, or items matched by a query on tags, properties, or relations, so resources created later that match are covered automatically. It binds permissions to users, groups, service accounts, or workload identities. Every resource has an Access Report showing who holds each permission and which policy granted it. Edit on a secret also grants reveal, so grant use when a principal only needs to attach a secret. A tamper-proof audit trail records platform actions from every interface and is queryable for evidence. Workloads can also write their own events, such as tenant data access, to it through an audit context, though it does not collect logs from downstream services.</p>
<h3>Workload identity and key management</h3>
<p>Attach an identity to a workload and credentials arrive at runtime, stored nowhere in the container. Control Plane’s Universal Cloud Identity (UCI) lets a workload call AWS, GCP, and Azure services, including each cloud’s key management service, with no long-lived cloud keys in your code. Each identity connects to one cloud account per provider. Your application code can therefore call AWS KMS, Azure Key Vault, or Google Cloud KMS at runtime to unwrap per-tenant data encryption keys, with no cloud key stored in the workload.</p>
<h3>Compute isolation and secrets</h3>
<p>Each workload is isolated with cgroups, namespaces, and restricted syscalls and capabilities, and Control Plane’s Sandboxes, isolated environments for building and testing code and AI agents, run in dedicated Kata Containers microVMs. Org secrets are encrypted with envelope encryption and stored on multiple cloud providers using cloud HSMs, and a workload’s identity needs the reveal permission to read a secret. Control Plane encrypts all volumes by default, and on AWS locations a volume set can use your own AWS KMS key in each region instead, so a tenant’s dedicated volume set can be encrypted with a key you control in your own AWS KMS. Custom volume encryption is currently available only on AWS.</p>
<h3>Dedicated infrastructure and data residency</h3>
<p>A GVC can run on Control Plane-managed locations in AWS, GCP, and Azure regions, on Kubernetes clusters you already run, or on your own machines, including on premises. A regulated tenant can get dedicated infrastructure, including a Kubernetes cluster in its own cloud account joined as a location, either one it already runs or one created through Control Plane’s Managed Kubernetes, operated the same way as shared tiers. Pin a tenant’s GVC to locations in one country for data residency. For more, see <a href="https://controlplane.com/blog/post/sovereign-cloud-architecture-data-residency-compliance?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">data residency vs data sovereignty</a>.</p>
<h3>Endpoint authentication and AI assistants</h3>
<p>Control Plane can validate JWTs in a workload’s Envoy sidecar, configured per workload or once for every workload in a GVC, so a request that a rule requires to carry a valid token is rejected before it reaches application code. Claims such as a tenant ID can be passed to the application as request headers. AI assistants act through Control Plane’s MCP server with OAuth sign-in, only in the orgs the user authorizes, and with that user’s permissions; a readonly profile cannot change resources, and every action an assistant takes lands in the same audit trail as actions from the Console, CLI, and Terraform. For more on agent guardrails, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">how to let AI agents operate production infrastructure safely</a>.</p>
<h3>Availability, operations, and cost</h3>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Control Plane handles Day 2 operations for you, including autoscaling, right-sizing with Control Plane’s Capacity AI, which adjusts reserved CPU and memory based on historical usage, built-in observability, and security, with no Kubernetes cluster you have to operate. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure.</p>
<p>Control Plane enforces the boundary at the infrastructure and platform layers. The application must still enforce the tenant ID in its own queries, caches, and AI retrieval logic.</p>
<h2>FAQ</h2>
<p>Common questions about multi-tenant isolation for SaaS and AI platforms.</p>
<h3>What is the difference between silo, pool, and bridge tenancy?</h3>
<p>Silo gives each tenant a dedicated stack or cloud account. Pool runs all tenants on shared infrastructure with tenant ID enforced in every layer. Bridge shares some tiers (such as compute and the API gateway) and dedicates others (such as databases or encryption keys) for regulated or large tenants. Many enterprise SaaS platforms use a bridge model: a shared default tier, with dedicated tiers for tenants whose contract or compliance needs require them.</p>
<h3>How do I stop one tenant’s data appearing in another tenant’s AI answers?</h3>
<p>Enforce a server-side tenant metadata filter on every vector query and retrieval call before documents reach the model context. The tenant ID comes from the authenticated session, never from the model. Scope prompt caches by tenant, and by user where permissions differ; scope conversation memory and uploaded files by tenant, user, and session. Test with automated cross-tenant retrieval queries that must return zero results.</p>
<h3>Does a dedicated environment per tenant cost more?</h3>
<p>Yes. A silo model duplicates infrastructure per tenant, which raises cost and operational overhead. A bridge model dedicates only the tiers that need it, such as the database or encryption keys, while sharing compute and networking, so the extra cost falls only on tenants that require dedicated resources.</p>
<h3>What is BYOK and how does it help with tenant isolation?</h3>
<p>BYOK (bring your own key) means the tenant manages an encryption key in its own cloud KMS and grants the SaaS provider limited permission to use it. If the tenant revokes that permission, data encrypted under its keys becomes unreadable once cached data keys expire. BYOK does not replace authorization or access controls, but it gives the tenant a cryptographic kill switch and limits blast radius.</p>
<h3>How do I prove tenant isolation to auditors?</h3>
<p>Run automated cross-tenant access tests in CI covering reads, writes, deletes, exports, and AI retrieval. Use access reports to show which identities hold which permissions, query the platform’s audit trail for evidence, run periodic penetration tests that attempt lateral movement between tenant workloads, and document the isolation architecture and its limits.</p>
<h3>Can prompt injection bypass tenant isolation in AI systems?</h3>
<p>Yes, if authorization depends on the model. A malicious prompt can instruct a model to retrieve another tenant’s data or repeat data from its context window. Enforce authorization at the application or platform layer before any data enters the model context. The OWASP Top 10 for LLM Applications documents this and related risks.</p>
<h3>Should I use row-level security or separate databases for tenant data?</h3>
<p>It depends on the tenant’s risk profile and your compliance requirements. Row-level security in a shared database is cost-efficient for many tenants but needs rigorous configuration, testing, and per-transaction tenant context in connection pools. Separate databases give stronger isolation and suit regulated or high-value tenants. A bridge model lets you use both.</p>
<h3>How does workload identity federation reduce cross-tenant risk?</h3>
<p>Workload identity federation lets a service prove its identity to a cloud provider and receive short-lived, scoped credentials at runtime instead of storing long-lived API keys or service account files. Without stored keys, there is no static secret whose leak could open many tenants’ cloud resources.</p>
<h3>What happens if a tenant revokes its customer-managed encryption key?</h3>
<p>Data whose DEKs are wrapped by that key becomes unreadable once cached DEKs expire, and every service that decrypts that tenant’s data fails. Plan for this before offering customer-managed keys, including error handling, tenant notification, and documented recovery procedures.</p>
<h3>How does Control Plane enforce deny-by-default networking?</h3>
<p>Control Plane blocks workload-to-workload traffic until a rule opens it to the same GVC, the same org, or listed workloads. Inbound and outbound internet traffic also start blocked, and outbound access can be opened to listed CIDRs or hostnames. Traffic between workloads uses mTLS.</p>
<p>Ready to enforce tenant isolation at every layer? <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/multi-tenant-isolation-saas-ai-cross-tenant-breaches?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=multi-tenant-isolation-saas-ai-cross-tenant-breaches">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[The Best Multi-Region and Multi-Cloud Networking Platforms in 2026]]></title><description><![CDATA[The best multi-region and multi-cloud networking platforms in 2026, compared on routing, private connectivity, failover, and operations.]]></description><link>https://controlplane-eng.hashnode.dev/the-best-multi-region-and-multi-cloud-networking-platforms-in-2026</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/the-best-multi-region-and-multi-cloud-networking-platforms-in-2026</guid><category><![CDATA[networking]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Devops]]></category><category><![CDATA[SRE]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 16:52:02 GMT</pubDate><content:encoded><![CDATA[<p>For applications that must stay up, Control Plane runs workloads active-active across regions and clouds with networking built in: a global endpoint that routes each request to the nearest healthy location, mTLS between services, and Cloud Wormhole, Control Plane’s agent-based connectivity to private networks. To join whole networks, hyperscaler transit services, multicloud networking software, and interconnection fabrics each fit different situations.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ol>
<li><strong>Control Plane:</strong> best for applications that must stay available in one region or across regions and clouds, with no gateways, tunnels, or route tables to run.</li>
<li><strong>Google Cloud networking:</strong> best for global applications anchored in Google Cloud.</li>
<li><strong>AWS networking:</strong> best for large AWS estates spanning many regions and accounts.</li>
<li><strong>Azure networking:</strong> best for hub-and-spoke topologies in Azure-centric environments.</li>
<li><strong>Aviatrix:</strong> best for a multicloud transit layer with deep visibility and troubleshooting.</li>
<li><strong>Alkira:</strong> best for multicloud networking consumed as a service.</li>
<li><strong>Cisco Multicloud Defense:</strong> best for unified cloud firewall policy across clouds.</li>
<li><strong>Equinix Fabric:</strong> best for private, high-bandwidth links between clouds, data centers, and partners.</li>
<li><strong>Megaport:</strong> best for on-demand virtual cross-connects to multiple clouds.</li>
<li><strong>Cloudflare Load Balancing:</strong> best for traffic steering in front of existing deployments.</li>
</ol>
<h2>What makes multi-region networking flexible?</h2>
<p>Seven factors determine flexibility:</p>
<ul>
<li><strong>Regions and clouds covered.</strong> Can you reach every region you need today and add more without re-architecting, across AWS, GCP, Azure, and on premises?</li>
<li><strong>Network joins or application routing.</strong> Joining VPCs and VNets at layer 3 differs from routing requests at layer 4 or layer 7. Many applications need only the second.</li>
<li><strong>Overlapping IP ranges.</strong> Mergers and multi-cloud growth make CIDR conflicts common. Check how each option handles them.</li>
<li><strong>Failover and health-checked routing.</strong> Automatic failover needs health checks, a routing layer that shifts traffic, and capacity already running in the target location.</li>
<li><strong>Security model.</strong> Compare encryption in transit, identity-based access, segmentation, and firewall defaults.</li>
<li><strong>Operations staffing.</strong> Some options need a network engineering team. Others run the routing, upgrades, and monitoring for you.</li>
<li><strong>Cost model.</strong> Data transfer, gateway hours, attachments, ports, licenses, and staff time all add up.</li>
</ul>
<h2>The ranked list</h2>
<h3>1. Control Plane</h3>
<p><strong>What it is.</strong> Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds.</p>
<p><strong>Best for.</strong> Applications that must stay available, whether they run in one region today or across regions and clouds. Teams on a single cloud or region get the same built-in firewall, mTLS, and global endpoint, and add locations later as a configuration change.</p>
<p><strong>Key strengths.</strong> A workload deployed to Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds, runs active-active in every location of that GVC from one definition. A built-in global endpoint uses DNS geo-routing to send each request to the nearest healthy location. Adding a region or another cloud means adding a location to the GVC.</p>
<p>Every workload has a deny-by-default internal firewall. Internal traffic between workloads is encrypted with mTLS on a built-in service mesh, with certificates Control Plane manages. Workloads in different locations and clouds reach each other without VPC peering or VPN tunnels you manage.</p>
<p>Control Plane’s Cloud Wormhole connects workloads to any TCP endpoint in VPCs and other private networks, including on premises data centers. A Cloud Wormhole agent inside the private network holds a secure, persistent outbound connection to Control Plane, so no inbound ports open to the internet. Access is limited to the IP addresses or domain names and ports listed in the workload’s identity. Version 2 agents run active-active, so running two or more keeps the connection up if one fails. For a step-by-step walkthrough, see <a href="https://controlplane.com/blog/post/cross-cloud-private-networking-vpc-vnet?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">cross-cloud private networking</a>.</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be on different providers. During the October 20, 2025 AWS us-east-1 outage, Control Plane customers with us-east-1 in their GVC had workloads active and running in healthy locations within 10 seconds, according to Control Plane’s internal incident telemetry. See <a href="https://controlplane.com/blog/post/how-to-build-active-active-high-availability-across-regions-and-clouds?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">how to build active-active high availability across regions and clouds</a>.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p><strong>Limitations.</strong> Control Plane networks the workloads it runs and the private endpoints they reach through Cloud Wormhole. To join whole corporate networks or branch offices at layer 3, pair it with multicloud networking software or a transit service.</p>
<p><strong>Pricing model.</strong> You pay for the CPU and memory a workload reserves, with no contracts or minimums.</p>
<h3>2. Google Cloud networking</h3>
<p><strong>What it is.</strong> Google Cloud’s networking includes global VPC networks, Cloud Load Balancing with a single anycast IP, Cross-Cloud Interconnect (dedicated links to AWS, Azure, Oracle Cloud Infrastructure, and Alibaba Cloud), and Network Connectivity Center.</p>
<p><strong>Best for.</strong> Global applications anchored in Google Cloud.</p>
<p><strong>Key strengths.</strong> A VPC network is a global resource, so regions share one network without peering. Cloud Load Balancing serves health-checked backends in any region behind one IP. Network Connectivity Center connects VPC networks and hybrid spokes (HA VPN, Interconnect, and router appliances for SD-WAN) through a central hub.</p>
<p><strong>Limitations.</strong> Cross-Cloud Interconnect requires dedicated ports at locations where Google and the other provider are both present. Partner Cross-Cloud Interconnect for AWS removes the physical setup but covers AWS only.</p>
<p><strong>Pricing model.</strong> Per-hour forwarding-rule charges and per-GB data processing for load balancers, interconnect port fees, and data transfer charges.</p>
<h3>3. AWS networking</h3>
<p><strong>What it is.</strong> AWS offers Transit Gateway (a regional hub for VPCs and on premises networks), Cloud WAN (a managed global core network), Global Accelerator (anycast entry to AWS endpoints), Route 53 (DNS with health-checked routing), and AWS Interconnect – multicloud.</p>
<p><strong>Best for.</strong> Large AWS estates with many VPCs across regions and accounts.</p>
<p><strong>Key strengths.</strong> Transit Gateway connects VPCs and on premises networks in a region. Cloud WAN extends this globally with central policy and segments. Global Accelerator routes users over the AWS backbone to healthy endpoints. Route 53 supports latency-based, geolocation, geoproximity, weighted, and failover routing.</p>
<p><strong>Limitations.</strong> Transit Gateway peering between regions uses static routes, and each hop adds attachment and data processing charges. Managed cross-cloud links through AWS Interconnect – multicloud are generally available for Google Cloud and in preview for Azure. Other clouds need Site-to-Site VPN or Direct Connect through a colocation partner.</p>
<p><strong>Pricing model.</strong> Per-hour attachment and per-GB processing for Transit Gateway, core network edge and attachment hours for Cloud WAN, hourly and data transfer fees for Global Accelerator, and hosted zone, query, and health check pricing for Route 53.</p>
<h3>4. Azure networking</h3>
<p><strong>What it is.</strong> Azure provides Virtual WAN (a managed hub-and-spoke service), global VNet peering, Azure Front Door (global HTTP load balancing), and Traffic Manager (DNS-based routing).</p>
<p><strong>Best for.</strong> Hub-and-spoke topologies in Azure-centric environments with branch connectivity.</p>
<p><strong>Key strengths.</strong> Virtual WAN combines VPN, ExpressRoute, and SD-WAN connectivity in managed hubs with automated routing. Global VNet peering connects VNets in any region with no gateways. Front Door adds health-probed global load balancing with an integrated WAF.</p>
<p><strong>Limitations.</strong> VNet peering is non-transitive, so spoke-to-spoke traffic needs a hub (Virtual WAN or a network virtual appliance). Connecting to other clouds uses ExpressRoute through a colocation provider or VPN.</p>
<p><strong>Pricing model.</strong> Hub and connection unit hours for Virtual WAN, per-GB charges for VNet peering, and a monthly base fee plus request and data transfer pricing for Front Door.</p>
<h3>5. Aviatrix</h3>
<p><strong>What it is.</strong> Aviatrix builds encrypted transit networks across AWS, Azure, Google Cloud, and OCI, with central visibility and security. Gartner tracks this category as <a href="https://www.gartner.com/reviews/market/multicloud-networking-software">multicloud networking software</a>.</p>
<p><strong>Best for.</strong> Network teams that want one transit layer with deep operational visibility across clouds.</p>
<p><strong>Key strengths.</strong> Gateways in each cloud run in HA pairs and handle encrypted tunnels, BGP routing, segmentation, and NAT for overlapping CIDRs. CoPilot provides topology views, flow analytics, and latency monitoring. Distributed Cloud Firewall adds east-west and egress policy.</p>
<p><strong>Limitations.</strong> Gateway instances run in your cloud accounts and add compute cost. The controller and CoPilot are either self-hosted or operated by Aviatrix with Aviatrix PaaS. Designing the transit network takes networking expertise.</p>
<p><strong>Pricing model.</strong> Subscription through the AWS or Azure Marketplace or a direct contract, plus the cloud compute cost of gateway instances.</p>
<h3>6. Alkira</h3>
<p><strong>What it is.</strong> Alkira offers multicloud networking as a service, with cloud exchange points (CXPs) that act as virtual hubs in cloud regions.</p>
<p><strong>Best for.</strong> Organizations that want multicloud networking without deploying gateway appliances.</p>
<p><strong>Key strengths.</strong> Alkira runs the CXPs. It connects on premises sites over IPsec or SD-WAN, inserts third-party firewalls inline, applies NAT for overlapping ranges, and provides intent-based policy and end-to-end visibility.</p>
<p><strong>Limitations.</strong> Traffic passes through Alkira’s CXPs, which adds a hop and depends on CXP locations.</p>
<p><strong>Pricing model.</strong> Subscription; contact Alkira for pricing.</p>
<h3>7. Cisco Multicloud Defense</h3>
<p><strong>What it is.</strong> Cisco Multicloud Defense provides cloud firewall and security policy across AWS, Azure, Google Cloud, and OCI from a SaaS controller.</p>
<p><strong>Best for.</strong> Enterprises with Cisco security investments that need one cloud firewall policy across clouds.</p>
<p><strong>Key strengths.</strong> Gateways in each cloud inspect ingress, egress, and east-west traffic, with IDS/IPS, WAF, and FQDN filtering. Policy is managed centrally with tag-based rules, and gateways scale automatically.</p>
<p><strong>Limitations.</strong> It is a security and policy layer. Routing between clouds comes from cloud networking or a transit product.</p>
<p><strong>Pricing model.</strong> SaaS subscription (contact Cisco for pricing), plus cloud compute costs for gateway instances.</p>
<h3>8. Equinix Fabric</h3>
<p><strong>What it is.</strong> <a href="https://www.equinix.com/product-solutions/connectivity/fabric">Equinix Fabric</a> is a software-defined interconnection service for private connections between clouds, data centers, networks, and service providers at Equinix facilities.</p>
<p><strong>Best for.</strong> Private, high-bandwidth links between multiple clouds, on premises data centers, and partners.</p>
<p><strong>Key strengths.</strong> Private connections to AWS, Azure, Google Cloud, and many other providers, with redundant connections for high availability. Fabric Cloud Router adds layer 3 routing between clouds.</p>
<p><strong>Limitations.</strong> Requires presence at or connectivity to an Equinix facility. It provides links; application routing, health checks, and failover logic sit elsewhere.</p>
<p><strong>Pricing model.</strong> Port fees, bandwidth-based connection charges, and colocation costs.</p>
<h3>9. Megaport</h3>
<p><strong>What it is.</strong> <a href="https://www.megaport.com/">Megaport</a> is a network-as-a-service platform for on-demand virtual cross-connects to cloud providers, data centers, and internet exchanges.</p>
<p><strong>Best for.</strong> On-demand virtual cross-connects to several clouds.</p>
<p><strong>Key strengths.</strong> Quick provisioning of connections to AWS, Azure, Google Cloud, and others. Megaport Cloud Router routes between clouds, and Megaport Virtual Edge hosts SD-WAN, virtual routers, and virtual firewalls.</p>
<p><strong>Limitations.</strong> Megaport provides connectivity. Application routing and failover sit elsewhere.</p>
<p><strong>Pricing model.</strong> Port and virtual cross-connect fees based on bandwidth, with term options set at order time.</p>
<h3>10. Cloudflare Load Balancing</h3>
<p><strong>What it is.</strong> <a href="https://www.cloudflare.com/products/load-balancing/">Cloudflare Load Balancing</a> steers traffic across origins in any cloud or data center, with health checks, failover, and geographic routing.</p>
<p><strong>Best for.</strong> Traffic steering in front of existing deployments without changing the underlying network.</p>
<p><strong>Key strengths.</strong> Health-checked failover with geo and latency steering at Cloudflare’s edge, in DNS-only or proxied mode. Integrates with Cloudflare’s CDN, WAF, and DDoS protection, and reaches private origins through Cloudflare Tunnel.</p>
<p><strong>Limitations.</strong> Steers traffic at Cloudflare’s edge (DNS, HTTP, and layer 4 through Spectrum). Backend-to-backend traffic between clouds needs separate networking.</p>
<p><strong>Pricing model.</strong> Paid add-on. Cost rises with the number of endpoints, health-check regions, and steering options.</p>
<h2>Comparison table</h2>
<table>
<thead>
<tr>
<th>Option</th>
<th>Category</th>
<th>Layer</th>
<th>Across clouds</th>
<th>On premises</th>
<th>Health-checked failover routing</th>
<th>What you operate</th>
</tr>
</thead>
<tbody><tr>
<td>Control Plane</td>
<td>Platform with networking built in</td>
<td>Application (L7) and TCP (L4)</td>
<td>Yes (AWS, GCP, Azure, plus your own clusters and machines)</td>
<td>Yes (Cloud Wormhole, your own machines)</td>
<td>Yes (global endpoint, DNS geo-routing to nearest healthy location)</td>
<td>Your workloads and their locations; Cloud Wormhole agents where you reach private networks</td>
</tr>
<tr>
<td>Google Cloud networking</td>
<td>Hyperscaler</td>
<td>L3 to L7</td>
<td>Via Cross-Cloud Interconnect or HA VPN</td>
<td>Via Cloud Interconnect or VPN</td>
<td>Yes (Cloud Load Balancing)</td>
<td>VPCs, load balancers, interconnects</td>
</tr>
<tr>
<td>AWS networking</td>
<td>Hyperscaler</td>
<td>L3 to L7</td>
<td>Via AWS Interconnect – multicloud, VPN, or Direct Connect</td>
<td>Via Direct Connect or VPN</td>
<td>Yes (Route 53, Global Accelerator)</td>
<td>Transit Gateways, Cloud WAN, VPCs</td>
</tr>
<tr>
<td>Azure networking</td>
<td>Hyperscaler</td>
<td>L3 to L7</td>
<td>Via ExpressRoute or VPN</td>
<td>Via ExpressRoute or VPN</td>
<td>Yes (Front Door, Traffic Manager)</td>
<td>Virtual WAN hubs, VNets, peerings</td>
</tr>
<tr>
<td>Aviatrix</td>
<td>Multicloud networking software</td>
<td>L3/4</td>
<td>Yes</td>
<td>Yes (IPsec, BGP)</td>
<td>Gateway HA and route failover</td>
<td>Gateways in each cloud; controller self-hosted or Aviatrix-managed</td>
</tr>
<tr>
<td>Alkira</td>
<td>Multicloud networking as a service</td>
<td>L3/4</td>
<td>Yes</td>
<td>Yes (IPsec, SD-WAN)</td>
<td>Network-level failover run by Alkira; no app health checks</td>
<td>Policy; Alkira runs the CXPs</td>
</tr>
<tr>
<td>Cisco Multicloud Defense</td>
<td>Multicloud network security</td>
<td>L3 to L7 inspection</td>
<td>Security policy across clouds</td>
<td>Cloud only</td>
<td>Gateway autoscaling only; no app health checks</td>
<td>Gateways and policy</td>
</tr>
<tr>
<td>Equinix Fabric</td>
<td>Interconnection fabric</td>
<td>L2 circuits; L3 via Fabric Cloud Router</td>
<td>Yes</td>
<td>Yes</td>
<td>BGP failover across redundant links; no app health checks</td>
<td>Ports, connections, colocation</td>
</tr>
<tr>
<td>Megaport</td>
<td>Interconnection fabric</td>
<td>L2 circuits; L3 via Megaport Cloud Router</td>
<td>Yes</td>
<td>Yes</td>
<td>BGP failover across redundant links; no app health checks</td>
<td>Ports, virtual cross-connects</td>
</tr>
<tr>
<td>Cloudflare Load Balancing</td>
<td>Edge traffic layer</td>
<td>DNS, L7, and L4 (Spectrum)</td>
<td>Yes (any origin)</td>
<td>Yes (any origin)</td>
<td>Yes</td>
<td>DNS records, steering rules</td>
</tr>
</tbody></table>
<h2>Pick by situation</h2>
<table>
<thead>
<tr>
<th>If you need</th>
<th>Start with</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td>An application that must stay up in one region or across regions and clouds</td>
<td>Control Plane</td>
<td>Active-active workloads, global endpoint, mTLS, Cloud Wormhole, and a 99.999% SLA for workloads with at least two replicas in at least two locations. You run no gateways, tunnels, or route tables. See <a href="https://controlplane.com/blog/post/add-second-cloud-provider-failover-without-doubling-ops?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">how to add a second cloud provider for failover</a>.</td>
</tr>
<tr>
<td>Many VPCs connected within one cloud</td>
<td>That cloud’s transit service (Transit Gateway or Cloud WAN, Network Connectivity Center, Virtual WAN)</td>
<td>Built for in-cloud connectivity with managed routing.</td>
</tr>
<tr>
<td>A global network spanning several clouds and branches</td>
<td>Multicloud networking software (Aviatrix or Alkira)</td>
<td>One transit layer, segmentation, and visibility across clouds and on premises.</td>
</tr>
<tr>
<td>Private, high-bandwidth links between clouds and data centers</td>
<td>Equinix Fabric or Megaport</td>
<td>Dedicated or virtual cross-connects off the public internet with predictable latency.</td>
</tr>
<tr>
<td>Traffic steering in front of existing deployments</td>
<td>Cloudflare Load Balancing or a cloud DNS service such as Route 53</td>
<td>Health-checked failover and geographic routing without changing the network.</td>
</tr>
</tbody></table>
<h2>What does multi-region networking cost?</h2>
<ul>
<li><strong>Data transfer between regions and clouds.</strong> Egress applies when traffic leaves a region or provider. Direct Connect, ExpressRoute, and Cloud Interconnect carry lower per-GB rates than internet egress.</li>
<li><strong>Gateway and attachment hours.</strong> Transit Gateway attachments, Cloud WAN core network edges, Virtual WAN hubs, and multicloud gateways charge hourly, plus per-GB processing.</li>
<li><strong>NAT and load balancer processing.</strong> NAT gateways and load balancers charge per GB processed. AWS and Google Cloud also bill traffic between zones in the same region.</li>
<li><strong>Interconnect ports and cross-connects.</strong> Fabrics and dedicated interconnects charge for port capacity and bandwidth.</li>
<li><strong>Licenses.</strong> Multicloud networking software adds subscriptions on top of gateway compute.</li>
<li><strong>Staff time.</strong> Operating transit networks, BGP sessions, firewall rules, and routing incidents takes specialized engineers. A platform that runs these for you moves that cost into its fee.</li>
</ul>
<h2>Also plan for</h2>
<ul>
<li><strong>Inter-region latency.</strong> Distance limits synchronous calls and synchronous database replication between continents.</li>
<li><strong>Data replication.</strong> Networking moves requests. Replicating state is a separate database decision.</li>
<li><strong>Private DNS across clouds.</strong> Use Route 53 Resolver endpoints, Azure DNS Private Resolver, and Cloud DNS forwarding.</li>
<li><strong>BGP design.</strong> Plan ASNs, route table limits, and BFD for fast link failover.</li>
<li><strong>IPv6 and MTU.</strong> Dual-stack support varies by service, and IPsec tunnels lower the effective MTU.</li>
</ul>
<h2>FAQ</h2>
<p>Answers to common questions about multi-region networking.</p>
<h3>Where can I get the most flexible multi-region networking for my cloud platform?</h3>
<p>For applications, Control Plane is the most flexible option. Workloads run active-active in a Global Virtual Cloud that can be a single cloud region or span AWS, GCP, Azure, on premises, and your own clusters. A global endpoint, mTLS, and Cloud Wormhole are built in. To join entire networks across clouds, use multicloud networking software such as Aviatrix or Alkira. Within one cloud, that cloud’s transit service is the most integrated choice. For private physical links, use Equinix Fabric or Megaport.</p>
<h3>Is Google Cloud’s network better for multi-region than AWS or Azure?</h3>
<p>For private networking inside one cloud, Google Cloud is simpler: a VPC network is global, so regions share one network. Google Cloud Load Balancing, AWS Global Accelerator, and Azure Front Door each offer a single anycast entry point. The difference is the private network: AWS and Azure connect regions with inter-region peering, Transit Gateway or Cloud WAN, or Virtual WAN hubs. Across clouds, you need cross-cloud connectivity either way.</p>
<h3>Do I need a transit hub or a service mesh?</h3>
<p>A transit hub (Transit Gateway, Virtual WAN, Aviatrix, Alkira) routes between networks at layer 3. A service mesh (Istio, Linkerd) secures and controls service-to-service traffic at layer 7. Join VPCs, VNets, and on premises networks with a transit hub; control traffic between services with a mesh. On Control Plane, every workload runs on a built-in service mesh with mTLS, a deny-by-default internal firewall, and global routing, so you do not deploy or operate a separate mesh.</p>
<h3>How do I fail over traffic between regions automatically?</h3>
<p>Automatic failover needs health checks, a routing layer that shifts traffic, and capacity already running in the target region. DNS-based failover (Route 53, Cloudflare in DNS-only mode) updates records when health checks fail, and how fast clients move depends on record TTLs and resolver caching. Failover time is roughly the health-check interval times the failure threshold, plus TTL. Anycast load balancers (Google Cloud Load Balancing, AWS Global Accelerator, Azure Front Door) and Cloudflare in proxied mode keep one entry point and stop sending traffic to unhealthy backends, so client DNS caching has no effect. Control Plane’s global endpoint uses DNS geo-routing to the nearest healthy location, and because the workload already runs in every location, there is no standby to start. The target region needs spare capacity and replicated data. See the <a href="https://controlplane.com/blog/post/best-multi-cloud-failover-solutions-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">best multi-cloud failover solutions</a>.</p>
<h3>How do I connect AWS and Azure privately?</h3>
<p>Use Equinix Fabric or Megaport to cross-connect AWS Direct Connect and Azure ExpressRoute at a shared facility, AWS Interconnect – multicloud to Azure (in preview), or multicloud networking software with encrypted tunnels between gateways in both clouds. For application traffic, Control Plane’s Cloud Wormhole connects workloads on Control Plane to private endpoints in AWS VPCs and Azure VNets with no VPN tunnels or peering to manage. See the <a href="https://controlplane.com/blog/post/cross-cloud-private-networking-vpc-vnet?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">cross-cloud private networking guide</a>.</p>
<h3>Can I use overlapping IP ranges across clouds?</h3>
<p>Yes, with NAT or endpoint-level connectivity. AWS Cloud WAN offers 1:1 NAT on attachments, AWS documents private NAT gateways with Transit Gateway for overlapping VPCs, and Azure Virtual WAN applies NAT rules on its site-to-site VPN gateway. Google Cloud Private NAT does not translate to overlapping subnets, so those need re-addressing or third-party NAT. Aviatrix and Alkira apply NAT in their transit networks. Endpoint-level connectivity, such as Control Plane’s Cloud Wormhole, avoids joining networks at the IP layer: a workload reaches a specific private endpoint through an agent inside that network, so the networks never exchange routes.</p>
<h3>How does Control Plane handle multi-region networking?</h3>
<p>On Control Plane, multi-region networking is part of the Global Virtual Cloud (GVC). Deploy a workload to a GVC with locations in, for example, AWS us-east-1, GCP europe-west1, and Azure eastus2, and it runs in all three from one definition behind one global endpoint. Traffic between locations stays on Control Plane’s internal mesh. Cloud Wormhole reaches private resources in your VPCs, VNets, and data centers. Adding a location, in the same cloud or a different one, is a change to the GVC.</p>
<h3>Which hyperscaler connects to other clouds most directly?</h3>
<p>Google Cloud’s Cross-Cloud Interconnect offers dedicated links to AWS, Azure, Oracle Cloud Infrastructure, and Alibaba Cloud, and AWS Interconnect – multicloud is generally available for Google Cloud and in preview for Azure. Azure reaches other clouds through ExpressRoute at colocation facilities or VPN.</p>
<p>To run workloads active-active across regions and clouds with networking built in, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/best-multi-region-multi-cloud-networking-platforms?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-multi-region-multi-cloud-networking-platforms">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Migrate to the Cloud (and Between Clouds): The 7 Rs, a Step-by-Step Plan, Tools, and Cost Drivers]]></title><description><![CDATA[How to migrate to the cloud and between clouds: the 7 Rs, a step-by-step plan, migration tools, and the cost drivers to budget for.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-migrate-to-the-cloud-and-between-clouds-the-7-rs-a-step-by-step-plan-tools-and-cost-drivers</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-migrate-to-the-cloud-and-between-clouds-the-7-rs-a-step-by-step-plan-tools-and-cost-drivers</guid><category><![CDATA[Cloud]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Devops]]></category><category><![CDATA[architecture]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 16:49:29 GMT</pubDate><content:encoded><![CDATA[<p>Migrate by assessing and grouping applications, choosing a strategy per application from the 7 Rs (retire, retain, rehost, relocate, replatform, repurchase, refactor), moving in waves with a tested rollback plan, and running old and new environments in parallel until cutover. Containerizing applications once makes later provider changes cheaper; Control Plane is a platform that runs containerized apps on AWS, GCP, Azure, and your own servers, so containerized apps do not have to be re-migrated when you change providers.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>A successful cloud migration picks the right strategy per application, executes in controlled waves, and uses tooling that matches each workload.</p>
<ul>
<li><strong>Pick a strategy per app.</strong> The 7 Rs give you seven options, from retire (turn it off) to refactor (rebuild for the cloud). Most portfolios mix several of them.</li>
<li><strong>Migrate in waves.</strong> Start with a pilot, prove the rollback plan, then move workloads in groups organized by dependency and business priority.</li>
<li><strong>Use the providers ’ tools.</strong> Every hyperscaler ships discovery, server migration, and database migration services. Terraform and OpenTofu make landing zones repeatable.</li>
<li><strong>Watch the hidden costs.</strong> Dual running, data egress, refactoring labor, and licensing are where budgets overrun. Retiring unused apps first shrinks every other cost line.</li>
<li><strong>Containerize once.</strong> On Control Plane, a workload is deployed to Control Plane’s Global Virtual Cloud (GVC), a set of locations a workload runs across, so a later provider change is a location change in the GVC plus moving any stateful data.</li>
</ul>
<h2>How do I move an app from on premises to the cloud?</h2>
<p>Cloud migration works best as a phased, wave-based process. Skipping discovery and landing-zone design is a common source of cost overruns and outages.</p>
<ol>
<li><strong>Discover and assess.</strong> Build an inventory of servers, applications, databases, and their dependencies. Map data gravity (where the largest data sets live and which services read them), licensing entitlements that may not transfer to the cloud, and compliance requirements such as data residency. Use automated discovery tools rather than spreadsheets.</li>
<li><strong>Choose a strategy per application.</strong> Apply the 7 Rs (next section) to every application in the portfolio.</li>
<li><strong>Design the landing zone.</strong> Prepare the target environment before any workload moves: account or project structure, network topology (VPCs, subnets, peering), identity and access management, encryption, logging, monitoring, and cost controls such as budgets and tagging.</li>
<li><strong>Build a pilot.</strong> Migrate one representative workload end to end. Compare performance with on-premises baselines, confirm security controls, test the rollback procedure, and write down what you learn.</li>
<li><strong>Migrate in waves.</strong> Group the remaining workloads by dependency and business priority. Watch for data integrity issues, latency changes, and authentication failures, and run old and new environments in parallel during each wave. Encrypt data in transit, rotate credentials after cutover, and re-validate compliance controls on the target.</li>
<li><strong>Cut over.</strong> Lower DNS TTLs days ahead, run the final data synchronization, switch DNS, and keep the rollback plan active for a defined acceptance period. Once writes land on the target, rolling back requires reverse replication to the source, so set it up before cutover.</li>
<li><strong>Optimize after the move.</strong> Rightsize instances, enable autoscaling, buy reserved capacity once usage is known, and set up cost governance. Decommission legacy systems only after the acceptance period closes.</li>
</ol>
<p><strong>Pick a data migration method per database.</strong> Offline migrations use dump and restore or bulk transfer during a downtime window. Online migrations do an initial load, then change data capture (CDC) or native replication keeps the target in sync until cutover. Validate row counts and checksums before switching writes. For very large datasets, transfer devices such as AWS Snowball, Azure Data Box, or Google Transfer Appliance can beat network transfer.</p>
<table>
<thead>
<tr>
<th>Phase</th>
<th>Key outputs</th>
<th>Common mistakes</th>
</tr>
</thead>
<tbody><tr>
<td>Discover and assess</td>
<td>Application inventory, dependency map, compliance matrix</td>
<td>Relying on tribal knowledge instead of automated discovery</td>
</tr>
<tr>
<td>Choose strategy</td>
<td>7 Rs classification per app</td>
<td>Applying one strategy to the whole portfolio</td>
</tr>
<tr>
<td>Design landing zone</td>
<td>Account structure, network, IAM, security baseline</td>
<td>Skipping guardrails and cost controls</td>
</tr>
<tr>
<td>Pilot</td>
<td>Migration runbook, tested rollback</td>
<td>Picking the easiest app instead of a representative one</td>
</tr>
<tr>
<td>Migrate in waves</td>
<td>Wave reports, parallel-run metrics</td>
<td>Splitting tightly coupled apps across waves</td>
</tr>
<tr>
<td>Cut over</td>
<td>DNS switch, final data sync</td>
<td>No tested rollback plan</td>
</tr>
<tr>
<td>Optimize</td>
<td>Rightsized resources, cost dashboards</td>
<td>Treating migration as finished and never revisiting spend</td>
</tr>
</tbody></table>
<h2>What are the 7 Rs of cloud migration?</h2>
<p>The 7 Rs, described in <a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/large-migration-guide/migration-strategies.html">AWS’s migration strategy guidance</a>, give you a decision model for every application in the portfolio.</p>
<table>
<thead>
<tr>
<th>Strategy</th>
<th>What it means</th>
<th>When to use it</th>
<th>Effort</th>
<th>Risk</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Retire</strong></td>
<td>Decommission the application</td>
<td>App is redundant, unused, or replaced</td>
<td>Minimal</td>
<td>Low</td>
</tr>
<tr>
<td><strong>Retain</strong></td>
<td>Keep it where it is for now</td>
<td>Compliance, latency, or sunk-cost constraints</td>
<td>None (deferred)</td>
<td>Low short-term</td>
</tr>
<tr>
<td><strong>Rehost</strong></td>
<td>Lift and shift to cloud VMs</td>
<td>Deadline-driven exits with no immediate optimization need</td>
<td>Low to moderate</td>
<td>Low to moderate</td>
</tr>
<tr>
<td><strong>Relocate</strong></td>
<td>Move servers to a cloud version of the same platform with no changes, or move instances to another VPC, Region, or account</td>
<td>Platform-to-platform moves at scale</td>
<td>Low</td>
<td>Low</td>
</tr>
<tr>
<td><strong>Replatform</strong></td>
<td>Targeted changes, such as swapping a self-managed database for a managed one</td>
<td>Quick wins without a redesign</td>
<td>Moderate</td>
<td>Moderate</td>
</tr>
<tr>
<td><strong>Repurchase</strong></td>
<td>Replace with a SaaS or commercial product</td>
<td>A modern commercial equivalent exists</td>
<td>Moderate (integration)</td>
<td>Moderate (change management)</td>
</tr>
<tr>
<td><strong>Refactor</strong></td>
<td>Re-architect for cloud-native patterns</td>
<td>Long-lived apps that need scalability, resilience, or portability</td>
<td>High</td>
<td>High</td>
</tr>
</tbody></table>
<p>Rehosting is the fastest path for applications that must leave a data center on a deadline. Refactoring costs the most engineering time and can pay back through lower operating cost and portability. A typical plan retires what it can, rehosts what must move quickly, and refactors the applications that justify the effort.</p>
<h2>How do I migrate from on-premises data centers to the cloud and modernize legacy IT infrastructure?</h2>
<p>Migration gets workloads off your hardware. Modernization reshapes them to use cloud capabilities. Most programs do both, in that order or in parallel.</p>
<p><strong>Containerize stateless services first.</strong> Stateless web servers, APIs, and microservices are the easiest candidates. Package them as container images, externalize configuration, and deploy them to a managed container platform. Early wins build skills for harder workloads.</p>
<p><strong>Move databases to managed services or replicated clusters.</strong> Managed database services handle patching, backups, and failover. For databases that cannot use a managed offering (unusual engines, strict version needs), run replicated clusters and use the provider’s database migration service for the initial load.</p>
<p><strong>Use the strangler-fig pattern for monoliths.</strong> Route new features and extracted components through a new service layer while the monolith handles the rest. The monolith shrinks until it can be retired.</p>
<p><strong>Keep some workloads on premises.</strong> Ultra-low-latency processing next to physical equipment, data sovereignty requirements no cloud region meets, and hardware with years of depreciation left can stay. A hybrid architecture lets them work with cloud-hosted services. For the cost comparison, see <a href="https://controlplane.com/blog/post/cloud-vs-on-premises-vs-hybrid-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">cloud vs on-premises vs hybrid cost</a>.</p>
<h2>How do I modernize a VM based application to Kubernetes on multi cloud infrastructure?</h2>
<p>Moving from VMs to Kubernetes on several clouds is an engineering project with six steps.</p>
<ol>
<li><strong>Package the app as a container image.</strong> Write a Dockerfile or use a buildpack to produce a reproducible image, and store it in a private registry.</li>
<li><strong>Externalize config and secrets.</strong> Environment variables, ConfigMaps, and a secrets manager replace baked-in configuration files.</li>
<li><strong>Separate state from compute.</strong> Databases, file stores, and caches run as external services, outside the application containers. This step matters most for portability.</li>
<li><strong>Add health checks.</strong> Liveness and readiness probes let Kubernetes restart unhealthy containers and stop routing traffic to them. Set CPU and memory requests and limits, log to stdout, and handle SIGTERM for graceful shutdown.</li>
<li><strong>Write manifests or Helm charts.</strong> Keep deployments, services, and routing in version-controlled YAML.</li>
<li><strong>Deploy to one cloud, then add a second.</strong> Validate on one cluster first. A second cloud exposes assumptions about DNS, identity, and storage that you then fix.</li>
</ol>
<p>For VMs that cannot be containerized yet, <a href="https://kubevirt.io/">KubeVirt</a> runs VM workloads inside a Kubernetes cluster, so you get one orchestration layer while you work toward containers.</p>
<p>Running Kubernetes yourself on several clouds means operating a cluster per provider and handling upgrades, networking, and security policy on each one. That operational load grows with every cluster you add.</p>
<h2>Best cloud migration services and platforms</h2>
<p>The hyperscalers each provide migration services built to bring workloads into their own cloud, and open-source tools cover infrastructure automation and Kubernetes portability.</p>
<p><strong>AWS</strong></p>
<ul>
<li><a href="https://aws.amazon.com/application-migration-service/">AWS Transform MGN</a> (formerly AWS Application Migration Service) replicates source servers to AWS continuously at the block level and orchestrates test and cutover launches.</li>
<li><a href="https://aws.amazon.com/dms/">AWS Database Migration Service</a> supports homogeneous and heterogeneous database migrations with continuous replication.</li>
<li><a href="https://aws.amazon.com/transform/">AWS Transform</a> handles discovery, migration planning, and tracking. It replaced AWS Migration Hub, which closed to new customers in November 2025.</li>
</ul>
<p><strong>Azure</strong></p>
<ul>
<li><a href="https://azure.microsoft.com/en-us/products/azure-migrate">Azure Migrate</a> discovers, assesses, and migrates servers, databases, and web apps.</li>
<li><a href="https://azure.microsoft.com/en-us/products/database-migration">Azure Database Migration Service</a> runs online and offline migrations to Azure database services.</li>
</ul>
<p><strong>Google Cloud</strong></p>
<ul>
<li><a href="https://docs.cloud.google.com/migration-center/docs">Migration Center</a> provides discovery, assessment, and planning.</li>
<li><a href="https://cloud.google.com/products/cloud-migration/virtual-machines">Migrate to Virtual Machines</a> moves VM workloads from on premises, AWS, or Azure into Google Cloud.</li>
<li><a href="https://cloud.google.com/database-migration">Database Migration Service</a> migrates databases to Cloud SQL and AlloyDB.</li>
</ul>
<p><strong>Open-source tooling</strong></p>
<ul>
<li><a href="https://developer.hashicorp.com/terraform">Terraform</a> and <a href="https://opentofu.org/">OpenTofu</a> define landing zones and infrastructure as code, so environments are repeatable across providers.</li>
<li><a href="https://velero.io/">Velero</a> backs up and restores Kubernetes resources and persistent volumes, which makes it useful for moving workloads between clusters or clouds.</li>
</ul>
<h3>What are the best cloud migration tools?</h3>
<p>The right tool depends on what you are moving and where it is going. Check each provider’s pricing page for current terms.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th>Source and target</th>
<th>Cost model</th>
</tr>
</thead>
<tbody><tr>
<td>AWS Transform MGN</td>
<td>Server replication to AWS</td>
<td>On premises or other clouds to AWS</td>
<td>Free for 2,160 hours (90 days) per server; pay for AWS resources</td>
</tr>
<tr>
<td>AWS Database Migration Service</td>
<td>Database migration</td>
<td>Supported databases to AWS</td>
<td>Pay per replication-instance hour or per Serverless capacity-unit hour</td>
</tr>
<tr>
<td>Azure Migrate</td>
<td>Discovery, assessment, server migration</td>
<td>On premises, AWS, or GCP to Azure</td>
<td>Free assessment; server migration free for 180 days per machine, then billed; pay for Azure resources</td>
</tr>
<tr>
<td>Azure Database Migration Service</td>
<td>Database migration to Azure</td>
<td>On-premises or cloud databases to Azure</td>
<td>Standard tier free; Premium tier free for 6 months, then hourly; pay for target resources</td>
</tr>
<tr>
<td>Migration Center</td>
<td>Discovery and assessment</td>
<td>On premises, AWS, or Azure</td>
<td>No separate charge listed; check current terms</td>
</tr>
<tr>
<td>Migrate to Virtual Machines</td>
<td>VM migration to Google Cloud</td>
<td>On-premises, AWS, or Azure VMs</td>
<td>Free tool; pay for Google Cloud resources</td>
</tr>
<tr>
<td>Google Database Migration Service</td>
<td>Database migration to Google Cloud</td>
<td>MySQL, PostgreSQL, SQL Server, Oracle sources</td>
<td>Homogeneous migrations free; heterogeneous billed per GiB processed; pay for target instances</td>
</tr>
<tr>
<td>Terraform or OpenTofu</td>
<td>Infrastructure as code</td>
<td>Any provider</td>
<td>Open source</td>
</tr>
<tr>
<td>Velero</td>
<td>Kubernetes backup and migration</td>
<td>Any Kubernetes cluster</td>
<td>Open source</td>
</tr>
</tbody></table>
<h2>How do I migrate workloads between clouds?</h2>
<p>Four things cause most of the difficulty in cloud-to-cloud migration: proprietary managed services with no direct equivalent on the target, egress charges on large transfers, identity systems that differ (IAM roles on AWS, service accounts on Google Cloud, managed identities on Azure), and networking constructs that do not translate one to one.</p>
<p>These patterns make cloud-to-cloud moves repeatable and reduce lock-in:</p>
<ul>
<li><strong>Containers</strong> as the deployment unit, so compute is portable.</li>
<li><strong>Infrastructure as code</strong> with provider-agnostic tools such as Terraform, OpenTofu, or Pulumi.</li>
<li><strong>Portable databases</strong> on open-source engines such as PostgreSQL, MySQL, and Redis.</li>
<li><strong>A platform layer</strong> that hides provider differences, so application teams do not learn every cloud’s APIs.</li>
</ul>
<p>For a walkthrough of one application on all three hyperscalers, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">run the same app on AWS, GCP, and Azure</a>. For the architecture that keeps future moves cheap, see <a href="https://controlplane.com/blog/post/how-to-avoid-cloud-vendor-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">how to avoid cloud vendor lock-in</a>.</p>
<h3>Which vendors have experience migrating from one cloud platform to another?</h3>
<p>Three kinds of vendor do this work: the cloud providers’ own professional services and partner programs, systems integrators with multi-cloud practices, and platforms built for multi-cloud deployment. Ask any of them:</p>
<ul>
<li>How do you handle services on the source cloud with no equivalent on the target?</li>
<li>How do you plan data migration and control egress cost?</li>
<li>Can you show a completed cloud-to-cloud migration of similar scale?</li>
<li>Do we end up with portable artifacts (containers, infrastructure as code) or your proprietary tooling?</li>
<li>What support do we get after cutover?</li>
</ul>
<h2>What are the most cost efficient cloud migration options for enterprises?</h2>
<p>Costs fall when you shrink scope first, leave paid facilities quickly, and optimize once usage data exists.</p>
<p><strong>Cost drivers:</strong></p>
<ul>
<li><strong>Dual running.</strong> You pay for both environments during each wave’s parallel run. Longer waves cost more.</li>
<li><strong>Data transfer and egress.</strong> Moving terabytes out of a cloud or across regions incurs egress charges, and moving data out of a data center needs bandwidth too.</li>
<li><strong>Refactoring labor.</strong> Engineering time is often the largest line item in a modernization-heavy migration.</li>
<li><strong>Licensing.</strong> Some on-premises licenses, especially Windows Server and SQL Server, need new cloud licenses or bring-your-own-license terms. Microsoft restricts bring-your-own-license on AWS and Google Cloud, and Oracle licensing varies by cloud.</li>
<li><strong>Training.</strong> Teams new to the target cloud need ramp-up time, which slows early waves.</li>
</ul>
<p><strong>Cost levers:</strong></p>
<ul>
<li><strong>Rehost first, then optimize.</strong> Leaving the data center quickly stops facility and hardware spend. Rightsizing comes after stabilization.</li>
<li><strong>Migration funding programs.</strong> AWS, Microsoft, and Google each run migration incentive programs; terms and eligibility vary, so ask each provider for current details.</li>
<li><strong>Reserved capacity after stabilization.</strong> Commit to one- or three-year terms only once you have production usage data.</li>
<li><strong>Retire unused apps.</strong> Every application you retire before migrating is labor, licensing, and cloud spend you never incur.</li>
</ul>
<p><strong>Worked example (illustrative numbers only, not real prices).</strong> An enterprise migrates 45 applications over six months: 30 rehosted, 12 replatformed, and 3 refactored, after retiring 5 more.</p>
<table>
<thead>
<tr>
<th>Cost category</th>
<th>Illustrative amount</th>
</tr>
</thead>
<tbody><tr>
<td>Discovery and assessment</td>
<td>$15,000</td>
</tr>
<tr>
<td>Landing-zone design and build</td>
<td>$40,000</td>
</tr>
<tr>
<td>Rehost labor (30 apps)</td>
<td>$120,000</td>
</tr>
<tr>
<td>Replatform labor (12 apps)</td>
<td>$180,000</td>
</tr>
<tr>
<td>Refactor labor (3 apps)</td>
<td>$150,000</td>
</tr>
<tr>
<td>Data transfer and egress</td>
<td>$25,000</td>
</tr>
<tr>
<td>Dual-running cloud costs (6 months)</td>
<td>$90,000</td>
</tr>
<tr>
<td>Licensing adjustments</td>
<td>$30,000</td>
</tr>
<tr>
<td>Training and testing</td>
<td>$35,000</td>
</tr>
<tr>
<td><strong>Total illustrative migration cost</strong></td>
<td><strong>$685,000</strong></td>
</tr>
</tbody></table>
<p>In this example, refactoring three apps costs more than rehosting thirty, which is why refactoring is reserved for the applications that justify it. The ongoing bill afterwards depends on rightsizing. For tactics, see <a href="https://controlplane.com/blog/post/cut-aws-bill-30-percent-without-re-architecting?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">cut your AWS bill 30 percent without re-architecting</a>.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the platform for running unbreakable apps and agents. It combines any cloud, neocloud, and bare metal into one GVC, and it runs serverless, standard, stateful, and cron workloads on AWS, GCP, and Azure; on your existing Kubernetes clusters, through Bring Your Own Kubernetes (BYOK), Control Plane’s option for connecting a cluster you already run; and on your own servers, including on premises, through Managed Kubernetes (MK8s), Control Plane’s way of turning your own servers into managed locations.</p>
<p><strong>Bring what you have.</strong> Workloads run from container images in each org’s free private registry or in Docker Hub, Amazon ECR, Google Artifact Registry, Azure Container Registry, GitHub Container Registry, or any registry you already use, and <code>cpln image build</code> builds and pushes an image. <code>cpln convert</code> converts existing Kubernetes manifests, including workloads, secrets, and persistent volume claims (which become Control Plane volume sets), so teams reuse their YAML instead of rewriting it. <code>cpln stack deploy</code> deploys a Docker Compose project directly. <code>cpln apply</code> and <code>cpln helm</code> manage Control Plane resources from YAML and Helm charts kept in Git, and Control Plane ships Terraform and Pulumi providers.</p>
<p><strong>Migrate once.</strong> A workload deployed to a GVC runs active-active in every location of that GVC, and a global endpoint routes each request to the nearest healthy location. For stateless workloads, moving to another provider later means adding its location to the GVC and removing the old one. Stateful workloads also need their data copied or replicated to the new location first.</p>
<p><strong>Skip the cluster work.</strong> Control Plane handles Day 2 operations for you, including autoscaling, right-sizing with Capacity AI (Control Plane’s automatic CPU and memory sizing based on historical usage), built-in observability, and security, with no Kubernetes cluster you have to operate. With MK8s, Control Plane operates the Kubernetes layer on servers you join; with BYOK, you keep running the cluster you connected.</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be two regions of one cloud or locations on different providers. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p>Control Plane does not migrate databases or data for you. Data moves with the providers’ database migration services, replication, or backup and restore.</p>
<h2>FAQ</h2>
<p>These answers cover the questions teams ask most when planning a cloud migration.</p>
<h3>What are the 7 Rs of cloud migration?</h3>
<p>Retire, retain, rehost, relocate, replatform, repurchase, and refactor. They are a framework for choosing a migration strategy per application, from decommissioning to a cloud-native redesign, described in <a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/large-migration-guide/migration-strategies.html">AWS’s prescriptive guidance</a>.</p>
<h3>How do I move an app from on premises to the cloud?</h3>
<p>Inventory the app and its dependencies, choose a strategy from the 7 Rs, prepare a landing zone, migrate a pilot, then move in waves with a tested rollback and a parallel run before the DNS cutover.</p>
<h3>How long does a cloud migration take?</h3>
<p>It depends on application count, dependencies, and strategy mix. Rehost-heavy programs finish fastest; refactor-heavy programs take longer and leave more portable, cheaper-to-run applications.</p>
<h3>What is the cheapest way to migrate to the cloud?</h3>
<p>Retire unused applications to shrink scope, rehost the rest to stop data-center costs quickly, and optimize after stabilization. Ask your target provider about its migration incentive programs.</p>
<h3>What are the best cloud migration tools?</h3>
<p>The providers’ own services: AWS Transform MGN and Database Migration Service; Azure Migrate and Azure Database Migration Service; Google Cloud’s Migration Center, Migrate to Virtual Machines, and Database Migration Service. Add Terraform or OpenTofu for infrastructure as code and Velero for Kubernetes workloads.</p>
<h3>Can I migrate from one cloud provider to another?</h3>
<p>Yes. Cloud-to-cloud migration follows the same phases, plus work on proprietary managed services, egress costs, identity differences, and networking. Containerized workloads defined in infrastructure as code move most easily.</p>
<h3>How do I modernize a VM-based application for Kubernetes?</h3>
<p>Package it as a container image, externalize configuration and secrets, separate state from compute, add health probes, write manifests or Helm charts, and deploy to one cluster before adding a second. KubeVirt runs VMs that cannot be containerized yet inside Kubernetes.</p>
<h3>Which vendors have experience migrating from one cloud platform to another?</h3>
<p>Cloud providers’ professional services and partners, systems integrators with multi-cloud practices, and multi-cloud platforms. Ask each for a completed cloud-to-cloud migration of similar scale and whether you keep portable artifacts afterwards.</p>
<h3>How does Control Plane help with cloud migration?</h3>
<p>Containerize an application once and deploy it to a GVC spanning AWS, GCP, Azure, or your own servers, so changing providers is mostly a location change in the GVC, plus moving any stateful data. Control Plane converts Kubernetes manifests, deploys Docker Compose projects, and handles Day 2 operations.</p>
<h3>Is it worth migrating if I have years left on my hardware?</h3>
<p>Not for every workload. Compare facility, staffing, and opportunity costs with the remaining depreciation, and keep workloads on hardware that still pays for itself in a hybrid setup. For the full comparison, see <a href="https://controlplane.com/blog/post/cloud-vs-on-premises-vs-hybrid-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">cloud vs on-premises vs hybrid cost</a>.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to containerize once and run on any cloud.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/how-to-migrate-to-the-cloud-7-rs-tools-costs?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=how-to-migrate-to-the-cloud-7-rs-tools-costs">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Use Services From Multiple Clouds in One Application: Identity, Networking, Data, and the Platforms That Make It Work]]></title><description><![CDATA[How to use services from multiple clouds in one application: identity, networking, and data across AWS, GCP, and Azure, and the platforms that help.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-use-services-from-multiple-clouds-in-one-application-identity-networking-data-and-the-platforms-that-make-it-work</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-use-services-from-multiple-clouds-in-one-application-identity-networking-data-and-the-platforms-that-make-it-work</guid><category><![CDATA[Cloud]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Azure]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 14:50:53 GMT</pubDate><content:encoded><![CDATA[<p>One application can use services from several clouds when it can authenticate to each provider without long-lived keys, reach each service over a secure network path, and keep data movement and egress cost under control. Infrastructure as code, Kubernetes, and governance tools each cover part of this. On Control Plane, a workload running in any Control Plane location, on AWS, GCP, Azure, or your own infrastructure, calls AWS, GCP, and Azure services through Control Plane’s Universal Cloud Identity (UCI), with short-lived credentials issued at runtime.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>One application can call services across AWS, GCP, and Azure once it solves four problems: identity, networking, data gravity and egress, and operations.</p>
<ul>
<li><strong>Identity.</strong> Your workload needs credentials each provider accepts. Options range from static access keys to workload identity federation to a platform-provided identity on all three clouds.</li>
<li><strong>Networking.</strong> Every cross-cloud call needs a secure path: public endpoints with TLS, private connectivity, or application-level tunnels to specific endpoints.</li>
<li><strong>Data gravity and egress.</strong> Providers charge for data leaving their network. Run compute close to the data it reads most, and send small requests and results across clouds.</li>
<li><strong>Operations.</strong> Each provider has its own SDKs, quotas, failure modes, and billing. Centralize observability, policy, and cost tracking.</li>
<li><strong>Platforms that help.</strong> Infrastructure as code provisions resources, Kubernetes distributions standardize deployment, management platforms govern policy, and secrets brokers issue credentials. Control Plane runs the application across clouds with identity on AWS, GCP, and Azure.</li>
</ul>
<h2>Can an application on one cloud use services from another?</h2>
<p>Yes. Common patterns:</p>
<ul>
<li>An application on AWS calls a model through Azure OpenAI in Microsoft Foundry because the model it needs is offered there.</li>
<li>A product analytics pipeline writes to BigQuery on GCP, while the application generating the events runs on AWS.</li>
<li>A managed PostgreSQL database lives on one provider, and services on other providers read from it.</li>
<li>An acquisition brings a team running on Azure into an organization standardized on AWS, and both systems call each other’s APIs.</li>
</ul>
<p>Teams do this for best-of-breed services, model availability, existing data, contracts, and regulation. Every cross-cloud call must solve authentication, traverse a network path, and possibly move data that incurs egress charges.</p>
<h2>How do I call AWS, GCP, and Azure services from one application without managing cloud keys?</h2>
<p>Use workload identity federation or a platform-provided identity, so each cloud issues short-lived credentials at runtime and no long-lived keys sit in code. Four approaches compare as follows.</p>
<table>
<thead>
<tr>
<th>Option</th>
<th>How it works</th>
<th>Strength</th>
<th>Trade-off</th>
</tr>
</thead>
<tbody><tr>
<td>Long-lived access keys or service account key files</td>
<td>You create a static key in each cloud and store it as an environment variable or in a secrets store.</td>
<td>Simple to set up. Works from any environment.</td>
<td>Static secrets to store, rotate, and audit. A leaked key grants access until revoked.</td>
</tr>
<tr>
<td>Workload identity federation</td>
<td>Your workload presents a short-lived token from a trusted issuer, and the target cloud exchanges it for temporary credentials. AWS supports this through <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html">IAM OIDC identity providers</a> and can issue tokens to other clouds through <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound.html">IAM outbound identity federation</a>. GCP supports it through <a href="https://cloud.google.com/iam/docs/workload-identity-federation">Workload Identity Federation</a>, which also accepts AWS credentials and SAML directly. Azure supports it through <a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation">Microsoft Entra workload identity federation</a>.</td>
<td>No long-lived secrets. Least-privilege, time-limited credentials.</td>
<td>You configure a trust relationship in each cloud, and each provider’s setup differs.</td>
</tr>
<tr>
<td>A secrets manager that issues short-lived credentials</td>
<td>A broker such as <a href="https://developer.hashicorp.com/vault/docs/secrets">HashiCorp Vault dynamic secrets</a> generates cloud credentials on demand with a lease. The workload authenticates to Vault, which creates credentials in the target cloud and revokes them or lets them expire at the end of the lease.</td>
<td>Centralized credential lifecycle across clouds.</td>
<td>You operate and secure the secrets manager, which becomes a critical dependency.</td>
</tr>
<tr>
<td>A platform-provided identity on AWS, GCP, and Azure</td>
<td>Control Plane’s Universal Cloud Identity issues short-lived, least-privilege credentials for 600+ AWS, GCP, and Azure services to workloads at runtime.</td>
<td>One identity model across all three clouds. Each cloud account is registered once.</td>
<td>Workloads run on Control Plane, in its managed AWS, GCP, and Azure regions or on your own Kubernetes clusters and servers.</td>
</tr>
</tbody></table>
<p>Federation removes static secrets, but its setup differs between AWS, GCP, and Azure: each has its own trust policy syntax, token audience rules, and role bindings. Teams running many services across two or three clouds maintain a matrix of trust configurations. For how federation works on each provider, see Control Plane’s guide to <a href="https://controlplane.com/blog/post/workload-identity-federation?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">workload identity federation</a>.</p>
<h2>How should the network path between clouds work?</h2>
<p><strong>Public endpoints with TLS and provider firewalls.</strong> Most cloud services expose HTTPS endpoints. You restrict access with IP allowlists and identity-based policies. This path suits low-volume, latency-tolerant calls; traffic crosses the public internet, and access control rests on provider-side rules. Many services, including Azure OpenAI and BigQuery, also offer private endpoints (Azure Private Link, Google Private Service Connect), which a workload on another cloud can reach only over private connectivity.</p>
<p><strong>Private connectivity.</strong> Site-to-site VPNs, dedicated interconnects such as AWS Direct Connect or Azure ExpressRoute (cross-connected at a colocation facility or through a network partner for cloud-to-cloud use), and cross-cloud products such as <a href="https://cloud.google.com/network-connectivity/docs/interconnect/concepts/cci-overview">Google Cloud Cross-Cloud Interconnect</a> provide private, dedicated paths that bypass the public internet. Dedicated links do not encrypt traffic by default, so add MACsec or IPsec where required. Costs include circuit fees, provisioning lead time for dedicated links, and link maintenance.</p>
<p><strong>Application-level tunnels to specific endpoints.</strong> You can tunnel traffic to individual TCP endpoints in a remote VPC or data center, which limits exposure and avoids full network peering. Control Plane’s Cloud Wormhole is one example.</p>
<p>For a comparison of private networking options across AWS, GCP, and Azure, see <a href="https://controlplane.com/blog/post/cross-cloud-private-networking-vpc-vnet?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">cross-cloud private networking for VPCs and VNets</a>.</p>
<h2>Data gravity and egress: where should each component run?</h2>
<p>Cloud providers charge for data leaving their network, with rates that vary by provider, region, and volume tier. Ingress from the internet is usually free. Egress also applies between regions inside one cloud, and private interconnects usually carry lower per-GB rates than internet egress.</p>
<p>Data attracts the compute that reads it. If an application reads large volumes from a database on GCP and sends small inference requests to Azure, run the database-reading workload on GCP and keep the Azure call cross-cloud.</p>
<ul>
<li><strong>Run compute close to the data it reads most.</strong> A service whose primary data source is BigQuery belongs on GCP.</li>
<li><strong>Send small requests and results across clouds.</strong> A model call sends a prompt and receives a response, both small.</li>
<li><strong>Keep large datasets in their home cloud.</strong> Analyze a large dataset where it lives and send the summary to the other cloud.</li>
</ul>
<p>Every cross-cloud call also adds network round-trip time, so component placement matters for latency as much as for cost.</p>
<h2>Can an application running on AWS use Google BigQuery or Azure OpenAI?</h2>
<p>Yes. The application authenticates to each provider through federated identity, calls their public or private endpoints, and keeps heavy data reads on AWS. Example: an e-commerce company runs order processing on AWS, generates product descriptions with Azure OpenAI in Microsoft Foundry, and writes analytics events to BigQuery.</p>
<ol>
<li><strong>Identity for Azure OpenAI.</strong> The application gets a short-lived token from AWS STS through IAM outbound identity federation. In Microsoft Entra, the team adds a federated identity credential to a user-assigned managed identity (or app registration) that trusts that issuer, subject, and audience. The application exchanges the token for a Microsoft Entra access token. The managed identity holds the Cognitive Services OpenAI User role on the Azure OpenAI resource, and no API key is stored in the application.</li>
<li><strong>Identity for BigQuery.</strong> The team creates a GCP Workload Identity Federation pool with an AWS provider for the AWS account. Google verifies the application’s IAM role credentials through a signed GetCallerIdentity request and exchanges them for a short-lived Google credential. The federated principal, or a service account it impersonates, holds a BigQuery role on the dataset. No service account key file is involved.</li>
<li><strong>Network path to Azure OpenAI.</strong> The team calls the public HTTPS endpoint over TLS, sends from fixed egress IPs on AWS (for example through a NAT gateway), and allowlists them in the Azure resource’s firewall rules. Prompts and responses are a few kilobytes of text.</li>
<li><strong>Network path to BigQuery.</strong> The application calls the BigQuery API over TLS, with access limited by the IAM grant from step 2.</li>
<li><strong>Data flow.</strong> The application reads order data from a PostgreSQL database on AWS. Analytics events are batched and compressed before each write to BigQuery. All heavy reads stay on AWS.</li>
<li><strong>Failure handling.</strong> Each Azure OpenAI call has a timeout sized to the user-facing latency budget and retries with exponential backoff and jitter, honoring Retry-After on rate-limit responses. If retries fail, the application serves a cached description or a template. Events go to a durable queue on AWS, such as Amazon SQS, and flush when BigQuery recovers; writes carry insert IDs so retries do not duplicate rows. The application caches federated credentials until shortly before expiry, so a token-exchange outage does not block every call.</li>
<li><strong>Observability.</strong> The team instruments the application with OpenTelemetry. Each request produces one trace with client spans for the Azure OpenAI call. Batched BigQuery writes get their own spans, linked to the requests that produced the events. Managed services do not continue your trace, so the application records provider request IDs, latency, and status codes as span attributes, and the team sees every cross-cloud dependency’s latency and errors in one backend.</li>
</ol>
<p>On Control Plane, steps 1 and 2 become one identity with Azure and GCP access rules, and the workload receives short-lived credentials for both at runtime.</p>
<h2>Which platforms let one application use services from multiple clouds?</h2>
<p>Five categories of platforms address this. Control Plane covers identity, networking, and deployment in one platform; the others each cover one layer.</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Examples</th>
<th>What it solves</th>
<th>What it leaves to you</th>
</tr>
</thead>
<tbody><tr>
<td>Platform that runs the application across clouds with identity on AWS, GCP, and Azure</td>
<td>Control Plane</td>
<td>Deployment across AWS, GCP, Azure, and your own infrastructure from one definition. Control Plane’s Universal Cloud Identity (UCI) for 600+ AWS, GCP, and Azure services. Built-in global endpoint, autoscaling, observability, mTLS between workloads, and Control Plane’s Cloud Wormhole for private TCP endpoints.</td>
<td>Your CI/CD pipeline and your application’s data architecture.</td>
</tr>
<tr>
<td>Infrastructure as code</td>
<td>Terraform or OpenTofu, Pulumi, Crossplane</td>
<td>Consistent provisioning across providers from declarative definitions, including federation trusts and interconnects.</td>
<td>Running the application: runtime identity at request time, operating cross-cloud networking, observability, scaling, and failure handling. IaC provisions these resources but does not run them.</td>
</tr>
<tr>
<td>Kubernetes distributions and fleet tools</td>
<td>Red Hat OpenShift, SUSE Rancher Prime, GKE fleet management</td>
<td>Standardized container orchestration and cluster management across clouds.</td>
<td>Identity to each other cloud’s managed services, egress-aware placement, and setting up and running cross-cloud service connectivity. You still run and pay for a cluster per cloud.</td>
</tr>
<tr>
<td>Cloud management and governance platforms</td>
<td>CloudBolt, HPE Morpheus Enterprise, Microsoft Azure Arc</td>
<td>Self-service provisioning, policy enforcement, cost governance, and visibility across cloud accounts.</td>
<td>Runtime identity from the application to every provider’s services, cross-cloud networking between workloads, and runtime scaling and failover of the application.</td>
</tr>
<tr>
<td>Secrets and identity brokers</td>
<td>HashiCorp Vault</td>
<td>Centralized secrets and dynamic credentials for several clouds.</td>
<td>Networking, compute orchestration, observability, and scaling.</td>
</tr>
</tbody></table>
<p>For a broader comparison, see <a href="https://controlplane.com/blog/post/10-best-multi-cloud-management-platforms-in-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">the best multi-cloud management platforms in 2026</a>.</p>
<h2>What are the challenges of using services from multiple cloud providers in one application?</h2>
<ul>
<li><strong>Identity sprawl.</strong> Each cloud has its own IAM model, role syntax, and trust policy format.</li>
<li><strong>Network path design.</strong> Public endpoints, private interconnects, and tunnels each carry different cost, latency, and security trade-offs.</li>
<li><strong>Egress cost.</strong> Charges for data leaving a provider’s network grow with high-volume traffic.</li>
<li><strong>Latency.</strong> Every cross-cloud call adds round-trip time, which constrains placement for latency-sensitive features.</li>
<li><strong>Different SDKs and quotas per provider.</strong> Client libraries, rate limits, error codes, and retry semantics differ.</li>
<li><strong>Compliance and data residency.</strong> Rules on where data is stored and processed apply to every provider in the path, and audits must trace data flows across all of them.</li>
<li><strong>Failure handling when one provider ’s service is down.</strong> Each cross-cloud call needs timeouts, retries, and a fallback.</li>
<li><strong>Observability across providers.</strong> Traces, metrics, and logs from different clouds must be correlated in one view.</li>
<li><strong>Cost attribution.</strong> Allocating spend to teams, features, or customers is harder across several billing systems.</li>
</ul>
<h2>Which platform unifies identity, networking, and deployment across AWS, GCP, and Azure?</h2>
<p>Control Plane covers all three in one platform. Control Plane’s Universal Cloud Identity handles identity, Cloud Wormhole and mTLS handle networking, and Control Plane’s Global Virtual Cloud (GVC) handles deployment.</p>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises. Workloads run active-active across regions and clouds.</p>
<p><strong>Identity.</strong> Control Plane’s Universal Cloud Identity lets a workload call 600+ AWS, GCP, and Azure services with no long-lived cloud keys in your code, from any location, including locations on a different cloud. You connect each cloud account once (an IAM role on AWS, a service-account grant on GCP, a connector function deployed to your Azure subscription), instead of maintaining a separate federation trust per cloud, and workloads receive short-lived, least-privilege credentials at runtime.</p>
<p><strong>Deployment.</strong> On Control Plane, a workload deployed to a Global Virtual Cloud (GVC), Control Plane’s named set of locations across one or more clouds, runs in every location of that GVC from one definition. Locations can be regions of one cloud or regions on AWS, GCP, and Azure together, and Control Plane’s built-in global endpoint routes each request to the nearest healthy location. For more, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">how to run the same app on AWS, GCP, and Azure</a>.</p>
<p><strong>Networking.</strong> Control Plane’s Cloud Wormhole connects workloads to specific TCP endpoints in VPCs, data centers, and other private networks through an agent you install in that network. Every workload has a deny-by-default internal firewall with mTLS between services.</p>
<p><strong>Operations.</strong> Control Plane handles Day 2 operations for you, including autoscaling, security, and built-in logs, metrics, and tracing for every workload. On Control Plane-managed locations there is no Kubernetes cluster to operate. The CLI, console, Terraform and Pulumi providers, and the Control Plane MCP server all work through the same Control Plane API, and Control Plane complements the infrastructure as code you already run. Teams can <a href="https://controlplane.com/blog/post/consolidate-multiple-clouds-one-platform?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">consolidate multiple clouds into one platform</a> incrementally and keep using provider-specific services where they help; see <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">managed services vs portability</a>.</p>
<p><strong>Reliability, compliance, and cost.</strong> The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. You pay for the CPU and memory a workload reserves, with no contracts or minimums.</p>
<h2>FAQ</h2>
<p>Short answers for teams combining services from AWS, GCP, and Azure in one application.</p>
<h3>Is it safe to use services from different clouds in one app?</h3>
<p>Yes, when identity and networking are handled correctly. Use short-lived, least-privilege credentials through workload identity federation or a platform-provided identity, encrypt all cross-cloud traffic with TLS, and apply deny-by-default rules between services. Control Plane provides mTLS between workloads and a deny-by-default internal firewall for every workload.</p>
<h3>How do I avoid egress fees when using multiple clouds?</h3>
<p>You can reduce them. Run compute close to the data it reads most, send small requests and results across clouds, keep large datasets in their home cloud, batch and compress payloads, and cache frequently used data locally.</p>
<h3>Do I need Kubernetes to use services from multiple clouds?</h3>
<p>No. Any compute environment can call another cloud’s services through its APIs. Control Plane-managed locations need no cluster of your own, and teams that want Kubernetes can run workloads on their own clusters or on Control Plane’s Managed Kubernetes.</p>
<h3>What is workload identity federation?</h3>
<p>Workload identity federation lets a workload authenticate to a cloud provider by presenting a token from a trusted identity issuer. The provider verifies the token and issues short-lived credentials. AWS, GCP, and Azure all support it. See Control Plane’s guide to <a href="https://controlplane.com/blog/post/workload-identity-federation?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">workload identity federation</a>.</p>
<h3>Can an application on AWS call Azure OpenAI without storing an API key?</h3>
<p>Yes. Microsoft Entra workload identity federation exchanges a trusted token, such as one from AWS IAM outbound identity federation, for a short-lived Microsoft Entra access token for an identity that holds the Cognitive Services OpenAI User role. On Control Plane, Universal Cloud Identity issues that access at runtime.</p>
<h3>How do I handle failures when one cloud provider’s service is down?</h3>
<p>Give every cross-cloud call a timeout, retries with exponential backoff and jitter, and a fallback. Buffer writes to external services in a durable queue so they flush when the service recovers, and for critical features keep a fallback on a different provider or a degraded mode.</p>
<h3>How do I get one view of calls across AWS, GCP, and Azure?</h3>
<p>Instrument the application with OpenTelemetry and propagate trace context between your own services. Record provider request IDs, latency, and status codes on the client spans for managed-service calls, and send traces, metrics, and logs to one backend. On Control Plane, workload telemetry is built in and can feed your existing observability stack.</p>
<h3>Can I start with one cloud and add another later?</h3>
<p>Yes. Most teams start on one cloud and add cross-cloud calls as they adopt services from other providers. Set up identity federation and networking patterns early so each new service follows the same pattern. On Control Plane, you add a location on another cloud to the workload’s GVC, and workloads in that GVC deploy to the new location from their existing definitions.</p>
<h3>What is the biggest hidden cost of using services from multiple clouds?</h3>
<p>Operational complexity. Egress fees get attention, but the ongoing work of managing different IAM models, SDKs, error handling, billing systems, and compliance requirements across providers can exceed them. Centralizing identity, observability, and policy reduces it.</p>
<p>To run one application across AWS, GCP, and Azure with identity on all three, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/use-services-from-multiple-clouds-one-application?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=use-services-from-multiple-clouds-one-application">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[The Best Tools for Deploying Applications Across AWS, GCP, and Azure in 2026]]></title><description><![CDATA[The best tools for deploying applications across AWS, GCP, and Azure in 2026, compared on how they deploy, fail over, and handle identity.]]></description><link>https://controlplane-eng.hashnode.dev/the-best-tools-for-deploying-applications-across-aws-gcp-and-azure-in-2026</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/the-best-tools-for-deploying-applications-across-aws-gcp-and-azure-in-2026</guid><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Kubernetes]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 14:49:09 GMT</pubDate><content:encoded><![CDATA[<p>Multi-cloud deployment needs three layers: provisioning infrastructure, build and delivery, and a runtime that runs your application on every cloud. Most teams combine Terraform or OpenTofu for provisioning, a CI system plus a GitOps or delivery tool, and either Kubernetes on each cloud or a platform that runs the app across clouds for them. Teams that do not want to operate a Kubernetes cluster per cloud get the most from a platform that deploys one workload definition to all three and runs it active-active, so an outage in one region or cloud does not take the application down.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Multi-cloud deployment is a three-layer problem, and a typical stack takes one tool from each layer.</p>
<ul>
<li><strong>Runtime (runs your app across clouds):</strong> 1. Control Plane, 2. Red Hat OpenShift, 3. Qovery, 4. Kubernetes on each cloud (EKS, GKE, AKS).</li>
<li><strong>Delivery and release (gets your code deployed):</strong> 1. Argo CD, 2. Flux, 3. Spinnaker, 4. Harness, 5. GitHub Actions and GitLab CI/CD.</li>
<li><strong>Infrastructure provisioning (creates the cloud resources):</strong> 1. Terraform and OpenTofu, 2. Pulumi, 3. Crossplane, 4. Spacelift.</li>
<li><strong>Main decision:</strong> operate a Kubernetes cluster on every cloud and engineer failover yourself, or let a platform run the app active-active across clouds.</li>
</ul>
<h2>What do you need to deploy one application to AWS, GCP, and Azure?</h2>
<p>Three layers must be in place before a request reaches your application on all three clouds.</p>
<p><strong>Provisioning</strong> creates the cloud resources your application depends on, such as networks, databases, object storage, IAM roles, and DNS zones. These differ in API, naming, and behavior across AWS, GCP, and Azure, so you need a tool that expresses all of them declaratively.</p>
<p><strong>Build and delivery</strong> compiles code, runs tests, builds container images, and triggers the deployment. This layer is largely cloud-agnostic, apart from CI authentication to each cloud (usually OIDC federation) and image pulls, where cross-cloud egress and pull credentials push teams to replicate images into Amazon ECR, Google Artifact Registry, and Azure Container Registry.</p>
<p><strong>Runtime</strong> is where the application runs and serves traffic. You can run Kubernetes on each cloud, use each cloud’s serverless container service, or use a platform that runs your workload across clouds from a single definition.</p>
<p>Identity, secrets, observability, and global traffic routing cut across all three layers and differ on every cloud, so any multi-cloud toolchain must either unify them or let you configure them per cloud.</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>What it does</th>
<th>Typical tools</th>
<th>What still differs per cloud</th>
</tr>
</thead>
<tbody><tr>
<td>Provisioning</td>
<td>Creates cloud infrastructure</td>
<td>Terraform, OpenTofu, Pulumi, Crossplane</td>
<td>APIs, resource names, IAM policies</td>
</tr>
<tr>
<td>Build and delivery</td>
<td>Builds, tests, and ships artifacts</td>
<td>GitHub Actions, GitLab CI/CD, Jenkins, Azure Pipelines, Harness, Argo CD, Flux, Helm, Kustomize</td>
<td>Registries, credentials, deployment targets</td>
</tr>
<tr>
<td>Runtime</td>
<td>Runs the application and serves traffic</td>
<td>Control Plane, OpenShift, Qovery, EKS/GKE/AKS, per-cloud serverless containers</td>
<td>Networking, identity, autoscaling, observability</td>
</tr>
<tr>
<td>Cross-cutting</td>
<td>Identity, secrets, observability, global traffic</td>
<td>Workload identity federation, External Secrets Operator, Vault or OpenBao, OpenTelemetry, cert-manager, global DNS and load balancing</td>
<td>Most of it</td>
</tr>
</tbody></table>
<h2>How we evaluated</h2>
<p>Each tool was assessed against seven criteria for deploying one application to AWS, GCP, and Azure at the same time.</p>
<ul>
<li><strong>Works natively on all three clouds,</strong> with documented, maintained integrations for each.</li>
<li><strong>What you still operate,</strong> such as Kubernetes clusters, CI runners, or the tool’s own control plane.</li>
<li><strong>One definition or per-cloud configuration,</strong> since fewer definitions mean less drift.</li>
<li><strong>Identity and secrets across clouds,</strong> for example a workload on GCP calling Amazon S3.</li>
<li><strong>Observability across clouds,</strong> with logs, metrics, and traces in one place.</li>
<li><strong>Failover between clouds,</strong> whether built in, possible with configuration, or left to you.</li>
<li><strong>Lock-in,</strong> through proprietary formats, vendor APIs, or operational dependencies.</li>
</ul>
<h2>Platforms that run your application across clouds</h2>
<p>These tools sit at the runtime layer. They run your containers and route traffic on AWS, GCP, and Azure.</p>
<h3>Control Plane</h3>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes (MK8s), which runs worker nodes in your own cloud account or on your own servers while Control Plane operates the Kubernetes control plane, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds.</p>
<p>A workload deployed to Control Plane’s Global Virtual Cloud (GVC), a set of locations across regions and clouds where each workload runs, runs active-active in every location of that GVC from one definition, and a global endpoint routes each request to the nearest healthy location. On Control Plane-managed locations in AWS, GCP, and Azure regions there is no Kubernetes cluster to operate.</p>
<p>Control Plane’s Universal Cloud Identity (UCI) lets workloads call AWS, GCP, and Azure services with no long-lived cloud keys in your code. Control Plane handles Day 2 operations for you, including autoscaling, built-in observability, and security.</p>
<p>The CLI, console, Terraform and Pulumi providers, and the Control Plane MCP server all work through the same Control Plane API, so Control Plane complements the infrastructure as code you already run. CI examples exist for GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI, and Google Cloud Build, and the <a href="https://docs.controlplane.com/core/kubernetes-operator?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">Control Plane Kubernetes Operator</a> lets Argo CD manage Control Plane resources from Git.</p>
<p>During the October 20, 2025 AWS us-east-1 outage, Control Plane customers with us-east-1 in their GVC had workloads active and running in healthy locations within 10 seconds, with no customer downtime, according to Control Plane’s internal incident telemetry. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. You pay for the CPU and memory a workload reserves, with no contracts or minimums.</p>
<p><strong>Best for:</strong> teams that want to run the same application across AWS, GCP, and Azure, or across regions of one cloud, without operating Kubernetes clusters, with built-in failover, identity, and observability.</p>
<p><strong>Limitations:</strong> Control Plane is the runtime. It does not build code or provision cloud infrastructure. Hyperscaler-managed services such as Amazon RDS or Amazon S3 are still provisioned with your IaC, while databases such as PostgreSQL and CockroachDB can run on Control Plane from Control Plane’s Template Catalog, its library of installable templates for databases and other open-source software.</p>
<h3>Red Hat OpenShift</h3>
<p><a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">Red Hat OpenShift</a> is an enterprise Kubernetes platform with managed offerings on all three major clouds (Red Hat OpenShift Service on AWS, Microsoft Azure Red Hat OpenShift, and Red Hat OpenShift Dedicated on Google Cloud) plus IBM Cloud, and self-managed installations on other infrastructure. It provides a consistent Kubernetes distribution with developer tooling, pipelines, service mesh, and security policies across clusters.</p>
<p><strong>What it handles:</strong> a standardized cluster platform, developer tooling, an operator framework, and enterprise support.</p>
<p><strong>What you still operate:</strong> an OpenShift cluster per cloud (operated with Red Hat’s site reliability engineers on the managed offerings, or by your team when self-managed), plus networking, identity federation between clouds, cross-cloud traffic routing, and failover.</p>
<p><strong>Best for:</strong> enterprises that want a supported, standardized Kubernetes distribution across clouds.</p>
<p><strong>Limitations:</strong> Red Hat Advanced Cluster Management covers multicluster management, but cross-cloud traffic routing and failover still need additional tooling.</p>
<h3>Qovery</h3>
<p><a href="https://www.qovery.com/">Qovery</a> is an internal developer platform that deploys applications into your own AWS, GCP, Azure, or Scaleway accounts on managed Kubernetes clusters it provisions, or onto existing Kubernetes clusters you connect. It provides self-service environments, preview environments, and deployment automation.</p>
<p><strong>What it handles:</strong> environment provisioning, deployment automation, developer self-service, and preview environments.</p>
<p><strong>What you still operate:</strong> the cloud accounts, their cloud costs and governance, and any existing clusters you connect.</p>
<p><strong>Best for:</strong> teams that want a developer-friendly deployment experience on Kubernetes in their own cloud accounts.</p>
<p><strong>Limitations:</strong> each cloud runs its own cluster, so global traffic routing and cross-cloud failover are separate concerns to plan.</p>
<h3>Kubernetes on each cloud (EKS, GKE, AKS)</h3>
<p>Running managed Kubernetes directly on each cloud is the do-it-yourself baseline. Amazon EKS, Google Kubernetes Engine (GKE), and Azure Kubernetes Service (AKS) each manage the control plane, and their automatic modes (EKS Auto Mode, GKE Autopilot, AKS Automatic) also manage nodes. You still handle networking, ingress, identity, observability, and keeping configurations consistent across clouds.</p>
<p><strong>What it handles:</strong> container orchestration, scheduling, and the Kubernetes API on each cloud.</p>
<p><strong>What you still operate:</strong> version upgrades, ingress controllers, certificates, identity federation, secrets, observability, and cross-cloud traffic routing. Cluster API, Rancher, GKE fleets, and Azure Arc-enabled Kubernetes create or manage clusters across clouds from one place, but each cluster still runs separately. For tools that help, see <a href="https://controlplane.com/blog/post/best-kubernetes-management-platforms?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">the best Kubernetes management platforms</a>.</p>
<p><strong>Best for:</strong> teams with deep Kubernetes expertise and platform engineers who want control over every layer.</p>
<p><strong>Limitations:</strong> the highest operational burden, common configuration drift between clouds, and failover that needs custom engineering. Each cloud’s serverless container service (Amazon ECS on Fargate, Google Cloud Run, Azure Container Apps) avoids cluster work on that cloud but has its own configuration model.</p>
<h2>Delivery and release tools</h2>
<p>These tools take code from your repository and deploy it to your runtime.</p>
<h3>Argo CD</h3>
<p><a href="https://argo-cd.readthedocs.io/">Argo CD</a> is a declarative GitOps continuous delivery tool for Kubernetes. It reconciles the state in Git with the live state of your clusters and can manage many clusters, which suits teams running Kubernetes on several clouds.</p>
<p><strong>What it handles:</strong> reconciliation of Helm charts, Kustomize overlays, and plain manifests from Git, multi-cluster sync through ApplicationSets, health status, and rollback.</p>
<p><strong>What you still operate:</strong> the Argo CD installation, its access to target clusters, and the Git repositories that define desired state.</p>
<p><strong>Best for:</strong> teams already on Kubernetes across clouds that want pull-based GitOps with drift correction.</p>
<p><strong>Limitations:</strong> Kubernetes only. It does not provision infrastructure or build images, canary or blue-green releases need Argo Rollouts, and promotion between environments is usually handled with Git changes or a tool such as Kargo.</p>
<h3>Flux</h3>
<p><a href="https://fluxcd.io/">Flux</a> is a GitOps toolkit for Kubernetes that reconciles cluster state from Git, Helm, and OCI artifact sources, with multi-tenancy support.</p>
<p><strong>What it handles:</strong> GitOps reconciliation, Helm release management, image automation, and multi-tenant deployments.</p>
<p><strong>What you still operate:</strong> Flux controllers in each cluster and their source configuration.</p>
<p><strong>Best for:</strong> teams that prefer a lightweight, composable GitOps operator in each cluster.</p>
<p><strong>Limitations:</strong> Kubernetes only. The core controllers are driven by the CLI and Kubernetes API, with web UIs available from ecosystem projects, and canary releases need Flagger.</p>
<h3>Spinnaker</h3>
<p><a href="https://spinnaker.io/">Spinnaker</a> is an open-source multi-cloud continuous delivery platform, created at Netflix, that deploys to AWS, GCP, Azure, Kubernetes, and other targets with pipeline orchestration and progressive delivery such as canary analysis and blue-green deployments.</p>
<p><strong>What it handles:</strong> multi-cloud deployment pipelines, progressive delivery, and approval workflows.</p>
<p><strong>What you still operate:</strong> Spinnaker itself, a multi-service system that needs its own infrastructure and engineers to upgrade and maintain it.</p>
<p><strong>Best for:</strong> large organizations with complex release processes across clouds and clusters.</p>
<p><strong>Limitations:</strong> high operational overhead for smaller teams.</p>
<h3>Harness</h3>
<p><a href="https://www.harness.io/">Harness</a> is a commercial software delivery platform covering CI/CD, Argo CD-based GitOps, feature management, and other delivery modules, with deployments to AWS, GCP, Azure, Kubernetes, and VMs.</p>
<p><strong>What it handles:</strong> pipelines, deployment verification, feature flags, and governance policies.</p>
<p><strong>What you still operate:</strong> pipeline configuration and integrations, plus the Harness installation itself if you choose the Self-Managed Enterprise Edition instead of SaaS.</p>
<p><strong>Best for:</strong> teams that want a commercial, full-featured delivery platform with built-in governance.</p>
<p><strong>Limitations:</strong> pipeline definitions are Harness-specific.</p>
<h3>GitHub Actions and GitLab CI/CD</h3>
<p><a href="https://docs.github.com/en/actions">GitHub Actions</a> and <a href="https://docs.gitlab.com/ci/">GitLab CI/CD</a> are CI/CD systems built into their source control platforms. They build images, run tests, and trigger deployments to any target their runners can reach. Jenkins and Azure Pipelines (part of Azure DevOps) fill the same role in many enterprises.</p>
<p><strong>What they handle:</strong> building, testing, packaging, and triggering deployments.</p>
<p><strong>What you still operate:</strong> workflow files, plus self-hosted runners when you need private network access.</p>
<p><strong>Best for:</strong> teams whose code lives on GitHub or GitLab.</p>
<p><strong>Limitations:</strong> they provide environments and deployment approvals, but multi-cloud rollout logic must be scripted or handed to a delivery tool or runtime platform.</p>
<h2>Infrastructure provisioning tools</h2>
<p>These tools create and manage the cloud resources your applications depend on.</p>
<h3>Terraform and OpenTofu</h3>
<p><a href="https://developer.hashicorp.com/terraform">Terraform</a> is a widely used declarative provisioning tool, with providers for AWS, GCP, Azure, and many other services. <a href="https://opentofu.org/">OpenTofu</a> is an open-source fork of Terraform under the Linux Foundation that works as a drop-in replacement for existing Terraform configurations.</p>
<p><strong>What they handle:</strong> declarative provisioning with a plan-and-apply workflow, state management, and a large provider ecosystem.</p>
<p><strong>What you still operate:</strong> state storage and the pipelines that run plans and applies (or HCP Terraform, which hosts both), and modules for each cloud.</p>
<p><strong>Best for:</strong> any team provisioning infrastructure across clouds; this is the default starting point.</p>
<p><strong>Limitations:</strong> Kubernetes and Helm providers can apply manifests, but Terraform is not designed for ongoing application rollouts, health checks, or traffic routing.</p>
<h3>Pulumi</h3>
<p><a href="https://www.pulumi.com/">Pulumi</a> provisions infrastructure with general-purpose languages such as TypeScript, Python, Go, C#, and Java, as well as YAML and HCL, across AWS, GCP, Azure, and Kubernetes, and can use any Terraform or OpenTofu provider and Terraform modules.</p>
<p><strong>What it handles:</strong> infrastructure in familiar programming languages, with testing, abstraction, and reuse.</p>
<p><strong>What you still operate:</strong> pipelines and shared components, plus state storage if you use a self-managed backend.</p>
<p><strong>Best for:</strong> developer-centric teams that want to write infrastructure in a general-purpose programming language.</p>
<p><strong>Limitations:</strong> like Terraform, it provisions infrastructure and does not run your application, and state is stored in Pulumi Cloud by default unless you configure a self-managed backend.</p>
<h3>Crossplane</h3>
<p><a href="https://www.crossplane.io/">Crossplane</a> exposes cloud resources as Kubernetes custom resources and continuously reconciles them, so teams provision a database or bucket with YAML through the Kubernetes API.</p>
<p><strong>What it handles:</strong> Kubernetes-native provisioning with continuous reconciliation, and composition of resources into higher-level abstractions.</p>
<p><strong>What you still operate:</strong> a Kubernetes cluster running Crossplane and its providers for each cloud, or a hosted control plane from Upbound.</p>
<p><strong>Best for:</strong> platform teams building Kubernetes-based internal developer platforms.</p>
<p><strong>Limitations:</strong> it requires a Kubernetes cluster and familiarity with operators and custom resources.</p>
<h3>Spacelift</h3>
<p><a href="https://spacelift.io/">Spacelift</a> orchestrates runs for Terraform, OpenTofu, Terragrunt, Pulumi, AWS CloudFormation, Kubernetes, and Ansible, with policy enforcement, drift detection, approvals, and audit trails.</p>
<p><strong>What it handles:</strong> governance and collaboration around IaC runs.</p>
<p><strong>What you still operate:</strong> stack and policy configuration.</p>
<p><strong>Best for:</strong> teams that need governance on top of existing IaC. HCP Terraform, env0, Scalr, and Atlantis cover similar ground.</p>
<p><strong>Limitations:</strong> it orchestrates IaC runs and depends on Terraform, OpenTofu, Pulumi, or another supported tool to provision resources.</p>
<p>For a full reference stack across these layers, see <a href="https://controlplane.com/blog/post/automate-app-deployment-iac-ci-cd-gitops?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">how to automate app deployment with IaC, CI/CD, and GitOps</a>.</p>
<h2>Comparison table</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Layer</th>
<th>Runs your app on all three clouds</th>
<th>You operate Kubernetes</th>
<th>One definition for every cloud</th>
<th>Cross-cloud identity built in</th>
<th>Best for</th>
</tr>
</thead>
<tbody><tr>
<td>Control Plane</td>
<td>Runtime</td>
<td>Yes</td>
<td>Not required</td>
<td>Yes</td>
<td>Yes (UCI)</td>
<td>Running apps across clouds without operating Kubernetes</td>
</tr>
<tr>
<td>Red Hat OpenShift</td>
<td>Runtime</td>
<td>Partial (cluster per cloud)</td>
<td>Operated with Red Hat SREs on managed offerings; yes if self-managed</td>
<td>No</td>
<td>No</td>
<td>Standardized enterprise Kubernetes</td>
</tr>
<tr>
<td>Qovery</td>
<td>Runtime</td>
<td>Partial (cluster per cloud)</td>
<td>Managed by Qovery, or yours if connected</td>
<td>No</td>
<td>No</td>
<td>Developer self-service in your accounts</td>
</tr>
<tr>
<td>EKS / GKE / AKS</td>
<td>Runtime</td>
<td>Partial (cluster per cloud)</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td>Full control</td>
</tr>
<tr>
<td>ECS on Fargate / Cloud Run / Azure Container Apps</td>
<td>Runtime</td>
<td>Partial (separate service per cloud)</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Serverless containers on one cloud</td>
</tr>
<tr>
<td>Argo CD</td>
<td>Delivery</td>
<td>No</td>
<td>Yes</td>
<td>Partial</td>
<td>No</td>
<td>GitOps for Kubernetes</td>
</tr>
<tr>
<td>Flux</td>
<td>Delivery</td>
<td>No</td>
<td>Yes</td>
<td>Partial</td>
<td>No</td>
<td>Lightweight GitOps</td>
</tr>
<tr>
<td>Spinnaker</td>
<td>Delivery</td>
<td>No</td>
<td>Depends on targets</td>
<td>Partial</td>
<td>No</td>
<td>Enterprise progressive delivery</td>
</tr>
<tr>
<td>Harness</td>
<td>Delivery</td>
<td>No</td>
<td>Depends on targets</td>
<td>Partial</td>
<td>No</td>
<td>Commercial delivery platform</td>
</tr>
<tr>
<td>GitHub Actions / GitLab CI/CD / Jenkins / Azure Pipelines</td>
<td>Delivery</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>CI tied to source control</td>
</tr>
<tr>
<td>Terraform / OpenTofu</td>
<td>Provisioning</td>
<td>No</td>
<td>No</td>
<td>Partial (per-cloud modules)</td>
<td>No</td>
<td>Multi-cloud infrastructure</td>
</tr>
<tr>
<td>Pulumi</td>
<td>Provisioning</td>
<td>No</td>
<td>No</td>
<td>Partial</td>
<td>No</td>
<td>IaC in programming languages</td>
</tr>
<tr>
<td>Crossplane</td>
<td>Provisioning</td>
<td>No</td>
<td>Yes</td>
<td>Partial</td>
<td>No</td>
<td>Kubernetes-native IaC</td>
</tr>
<tr>
<td>Spacelift</td>
<td>Provisioning</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>IaC governance</td>
</tr>
</tbody></table>
<h2>Which stack fits your team?</h2>
<h3>Teams already on Kubernetes everywhere</h3>
<p>Add Argo CD or Flux for GitOps delivery and Terraform or OpenTofu for infrastructure. This is the most common pattern and gives full control, with all the operational work that comes with it.</p>
<h3>Teams that do not want to operate Kubernetes</h3>
<p>Use Control Plane as the runtime, provision cloud-managed services with Terraform or Pulumi, and build images with GitHub Actions or GitLab CI/CD. You skip cluster operations and run compute active-active across clouds; for the data tier, Control Plane’s Template Catalog includes multi-location PostgreSQL and CockroachDB templates that replicate data across the locations of a GVC. For consolidating clouds onto one platform, see <a href="https://controlplane.com/blog/post/consolidate-multiple-clouds-one-platform?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">how to consolidate multiple clouds into one platform</a>.</p>
<h3>Enterprises standardizing on a supported Kubernetes distribution</h3>
<p>OpenShift gives a consistent platform with enterprise support. You still run a cluster per cloud; pair it with Terraform and Argo CD.</p>
<h3>Teams that need failover between clouds</h3>
<p>Control Plane fails over between clouds by default because every GVC location serves traffic. With Kubernetes on each cloud, equivalent failover needs your own global load balancing, health checks, and DNS automation. Stateless failover is the easier part; databases need a replication design that tolerates losing a cloud.</p>
<h3>Small platform teams</h3>
<p>Reduce what you operate. A runtime platform removes cluster operations, a managed IaC runner such as Spacelift or HCP Terraform adds governance, and GitHub Actions handles build and test, so a small team can run a multi-cloud pipeline without dedicated Kubernetes engineers.</p>
<h2>How do I run the same app across AWS, GCP, and Azure without rewriting it?</h2>
<p>Package the application as a container that reads configuration from environment variables or mounted files, so the same image runs on any cloud. Connect to data services through connection strings injected at deploy time, and keep cloud-specific service calls behind interfaces you can swap per environment.</p>
<p>Build one image in CI, replicate it to a registry each cloud can pull from, and deploy it through one pipeline. On Control Plane, one workload definition deploys that image to every location in a GVC; on Kubernetes, you maintain per-cluster Helm values or Kustomize overlays. For the full walkthrough, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">how to run the same app on AWS, GCP, and Azure</a>, and for the trade-offs of provider-specific services, see <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">managed services vs. portability</a>.</p>
<h2>FAQ</h2>
<p>These answers assume containerized applications.</p>
<h3>What are the best tools for deploying applications across AWS, GCP, and Azure?</h3>
<p>Terraform or OpenTofu, a CI system with Argo CD or Flux, and a runtime. Control Plane runs one workload definition on all three clouds with no clusters to operate; OpenShift, Qovery, and per-cloud Kubernetes run a cluster on each cloud.</p>
<h3>Is Terraform enough to deploy apps across clouds?</h3>
<p>No. Terraform provisions networks, databases, and clusters and can apply a Helm release, but it does not keep the application running, roll it out safely, or route traffic between clouds.</p>
<h3>Do I need Kubernetes to deploy to AWS, GCP, and Azure?</h3>
<p>No. Each cloud has a serverless container service (ECS on Fargate, Cloud Run, Azure Container Apps), but each one has its own configuration. On Control Plane-managed locations, one workload definition runs on all three clouds with no Kubernetes cluster to operate.</p>
<h3>What is the difference between multi-cloud deployment and multi-cloud management?</h3>
<p>Multi-cloud deployment is running an application on more than one provider. Multi-cloud management is the broader work of governing infrastructure, cost, security, and compliance across those providers.</p>
<h3>How do I handle identity and secrets across three clouds?</h3>
<p>Use workload identity federation or short-lived credentials instead of stored keys, and sync secrets where each cloud needs them with tools such as External Secrets Operator or Vault. On Control Plane, a Universal Cloud Identity (UCI) identity attached to a workload grants it scoped access to AWS, GCP, and Azure services.</p>
<h3>Can I use Argo CD with Control Plane?</h3>
<p>Yes. The Control Plane Kubernetes Operator exposes Control Plane resources as Kubernetes custom resources, so Argo CD can manage workloads, GVCs, and identities from Git.</p>
<h3>How fast can traffic fail over between clouds?</h3>
<p>Seconds when health-checked global load balancing shifts traffic, and minutes when DNS failover waits on health check intervals and TTLs. Data replication between clouds usually sets the real limit.</p>
<h3>Does Control Plane replace my CI/CD pipeline?</h3>
<p>No. Control Plane is the runtime. Your CI system still builds and tests code, then deploys to Control Plane with the CLI, the Terraform or Pulumi provider, or the Kubernetes Operator.</p>
<h3>Can I run stateful workloads across multiple clouds?</h3>
<p>Yes, with a replication design that fits your consistency needs. Control Plane runs stateful workloads with persistent storage, and its Postgres Multi-Location template runs a Patroni primary with asynchronous replicas in other GVC locations, while the CockroachDB template survives the loss of a location when deployed to three or more.</p>
<h3>What compliance certifications does Control Plane hold?</h3>
<p>Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. Your own applications and processes still need their own compliance work.</p>
<p>To deploy one application across AWS, GCP, and Azure from a single definition, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/best-tools-deploy-applications-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=best-tools-deploy-applications-aws-gcp-azure">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Managed Services vs Portability: When Cloud Lock-In Is Worth It and How to Stay Cloud-Agnostic]]></title><description><![CDATA[Managed services vs portability: when cloud lock-in is worth it, what it costs to leave, and how to stay cloud-agnostic where it matters.]]></description><link>https://controlplane-eng.hashnode.dev/managed-services-vs-portability-when-cloud-lock-in-is-worth-it-and-how-to-stay-cloud-agnostic</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/managed-services-vs-portability-when-cloud-lock-in-is-worth-it-and-how-to-stay-cloud-agnostic</guid><category><![CDATA[Cloud]]></category><category><![CDATA[Devops]]></category><category><![CDATA[architecture]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 12:54:14 GMT</pubDate><content:encoded><![CDATA[<p>Lock-in is worth accepting when a managed service saves more engineering time than it will cost to leave, and it is not worth it for the core compute runtime that every workload depends on. The runtime is the layer you should keep portable. Control Plane keeps the runtime portable across AWS, GCP, Azure, and your own servers, including on premises, while still letting workloads use each cloud’s managed services through Universal Cloud Identity, Control Plane’s credential-free access to AWS, GCP, and Azure services. This guide offers an honest framework for deciding when lock-in is a fair price, a service-by-service map of proprietary services to portable alternatives, and a practical exit plan you can act on today.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Lock-in becomes a problem when it is accidental, unmeasured, or applied to the wrong layer.</p>
<ul>
<li><strong>When lock-in is worth it:</strong> A managed service materially reduces staffing, improves reliability, or accelerates delivery, and you have documented the exit cost.</li>
<li><strong>When it is not:</strong> The service is your core compute runtime or your identity plane, where switching costs compound across every workload. Managed Kubernetes is fine when workload definitions stay in standard manifests.</li>
<li><strong>The portable layer to protect:</strong> Application code, container images, deployment pipelines, data formats, and the runtime itself.</li>
<li><strong>The exit plan:</strong> Maintain a service-dependency register, test data exports quarterly, keep infrastructure as code, and budget for egress.</li>
<li><strong>How Control Plane fits:</strong> Control Plane runs workloads on AWS, GCP, Azure, your own Kubernetes clusters through Control Plane’s Bring Your Own Kubernetes (BYOK), and your own machines, from bare metal to on-premises servers, joined as locations with Control Plane Managed Kubernetes (MK8s), all mixed in one environment. Universal Cloud Identity lets those workloads call AWS, GCP, and Azure managed services without long-lived cloud keys in your code. You get managed-service benefits without surrendering runtime portability.</li>
</ul>
<p>For a deeper look at the full lock-in landscape, see our companion piece on <a href="https://controlplane.com/blog/post/how-to-avoid-cloud-vendor-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">how to avoid cloud vendor lock-in</a>.</p>
<h2>When Do Managed Platform Services Increase Vendor Lock-In?</h2>
<p>Managed services create lock-in in five ways, and they differ in how hard they are to undo.</p>
<h3>Proprietary APIs</h3>
<p>When your application code calls a vendor-specific API, every call is a line of migration debt. The more deeply integrated the API, the more refactoring a move requires. This is the most visible form of lock-in and the one engineers think of first.</p>
<h3>Data Gravity and Egress Costs</h3>
<p>Large datasets are expensive to move. Cloud providers charge for data leaving their network, and the sheer time to transfer terabytes or petabytes creates inertia. Transfer time and egress fees grow with data volume, so the cost of leaving rises the longer you stay.</p>
<h3>Proprietary Identity and Permissions</h3>
<p>IAM systems differ significantly between AWS, GCP, and Azure. Policies, roles, and service accounts written for one cloud do not translate to another. Migrating identity is tedious, error-prone, and security-sensitive.</p>
<h3>Proprietary Serverless Runtimes</h3>
<p>Functions tied to a specific serverless platform carry implicit dependencies on the platform’s event model, scaling behavior, timeout limits, and deployment tooling. These are difficult to replicate elsewhere.</p>
<h3>Contract Terms</h3>
<p>Committed-use discounts, enterprise agreements, and reserved capacity create financial lock-in. Breaking a contract early can mean forfeiting discounts or paying penalties.</p>
<p>Data gravity and proprietary identity are the hardest to undo. Moving data is a large but bounded transfer project, while identity must be redesigned and re-audited for every workload. Proprietary APIs come next, then serverless runtimes, then contract terms, which have a defined end date.</p>
<h2>Decision Framework: When Is the Managed Option Worth It?</h2>
<p>Use this table to evaluate each service category.</p>
<table>
<thead>
<tr>
<th>Service Category</th>
<th>Lock-In Level</th>
<th>Switching Cost Drivers</th>
<th>When the Managed Option Is Worth It</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Compute runtime</strong></td>
<td>High</td>
<td>Every workload depends on it; migration touches everything</td>
<td>Rarely worth locking in. Keep this portable.</td>
</tr>
<tr>
<td><strong>Kubernetes</strong></td>
<td>Medium</td>
<td>Storage classes, load balancer and ingress annotations, CNI plugins, and the link between pods and cloud IAM (EKS Pod Identity, Workload Identity Federation for GKE, Microsoft Entra Workload ID) are cloud-specific</td>
<td>Use managed Kubernetes for convenience, but keep workload definitions portable via standard manifests.</td>
</tr>
<tr>
<td><strong>Relational databases</strong></td>
<td>Medium</td>
<td>Schema compatibility is high (PostgreSQL, MySQL), but managed features (replication, backups) differ</td>
<td>Worth it when the managed service handles HA, patching, and backups you would otherwise staff for.</td>
</tr>
<tr>
<td><strong>NoSQL databases</strong></td>
<td>High</td>
<td>Proprietary query languages, data models, and SDKs (DynamoDB, Cosmos DB)</td>
<td>Worth it for rapid prototyping or when throughput requirements match the service exactly. Document the exit path.</td>
</tr>
<tr>
<td><strong>Object storage</strong></td>
<td>Low (API), Medium (large datasets)</td>
<td>S3-compatible APIs are a de facto standard, though Azure Blob Storage uses its own API. Egress fees and transfer time scale with data volume. Lifecycle rules, storage classes, and event notifications differ by provider.</td>
<td>Almost always worth it. For large buckets, budget for egress and keep an export or replication path.</td>
</tr>
<tr>
<td><strong>Queues and streaming</strong></td>
<td>Medium</td>
<td>Client SDKs, delivery semantics, ordering, and retention differ across SQS, Pub/Sub, Event Hubs, and Kinesis</td>
<td>Worth it for most workloads. Wrap producers and consumers behind an interface, or use a Kafka- or AMQP-compatible managed service so client code stays portable.</td>
</tr>
<tr>
<td><strong>Serverless functions</strong></td>
<td>High</td>
<td>Event sources, cold-start behavior, and runtime constraints are proprietary</td>
<td>Worth it for event-driven glue code, spiky traffic, and low-traffic endpoints. For core business logic, keep handlers thin and put the logic in plain libraries that can also run in a container.</td>
</tr>
<tr>
<td><strong>Identity</strong></td>
<td>High</td>
<td>Policies, roles, and trust relationships are cloud-specific</td>
<td>Abstract identity where possible. Use workload identity federation over long-lived keys.</td>
</tr>
<tr>
<td><strong>Observability</strong></td>
<td>Medium</td>
<td>Proprietary query languages and dashboards; data export is usually feasible</td>
<td>Worth it when the team is small. Adopt OpenTelemetry for instrumentation to keep the data portable.</td>
</tr>
<tr>
<td><strong>Managed AI / model APIs</strong></td>
<td>Medium-High</td>
<td>Model-specific prompt tuning, fine-tuning artifacts, and pricing models</td>
<td>Worth it for speed to market. Use an abstraction layer for model calls.</td>
</tr>
</tbody></table>
<h2>Which Open-Source Alternatives to Managed Databases Best Support Portability?</h2>
<p>When a managed service’s lock-in level is too high for your risk tolerance, open-source alternatives can restore portability. The table below maps common managed services to their portable counterparts.</p>
<table>
<thead>
<tr>
<th>Managed Service</th>
<th>Portable Alternative</th>
<th>Notes</th>
</tr>
</thead>
<tbody><tr>
<td>Amazon RDS for PostgreSQL, Cloud SQL for PostgreSQL, Azure Database for PostgreSQL</td>
<td><a href="https://www.postgresql.org/">PostgreSQL</a></td>
<td>Schema-level compatibility is strong. Run it on any cloud or on premises.</td>
</tr>
<tr>
<td>Amazon RDS for MySQL, Cloud SQL for MySQL</td>
<td><a href="https://www.mysql.com/">MySQL</a> or <a href="https://mariadb.org/">MariaDB</a></td>
<td>Widely supported. MariaDB began as a MySQL fork and is compatible with many MySQL workloads, though the two have diverged in newer versions.</td>
</tr>
<tr>
<td>DynamoDB, Cosmos DB</td>
<td><a href="https://www.scylladb.com/">ScyllaDB</a> or <a href="https://cassandra.apache.org/">Apache Cassandra</a></td>
<td>Both are wide-column databases. Apache Cassandra is open source. ScyllaDB is source-available since 2025 and offers Alternator, a DynamoDB-compatible API. Cosmos DB also offers a Cassandra-compatible API, which eases moves in either direction.</td>
</tr>
<tr>
<td>Amazon SQS, Google Pub/Sub</td>
<td><a href="https://kafka.apache.org/">Apache Kafka</a>, <a href="https://nats.io/">NATS</a>, or <a href="https://www.rabbitmq.com/">RabbitMQ</a></td>
<td>Kafka excels at high-throughput streaming and is the closer match for Pub/Sub. RabbitMQ is mature for task queues and is the closer match for SQS. NATS is lightweight and supports both patterns.</td>
</tr>
<tr>
<td>AWS Lambda, Cloud Functions, Azure Functions</td>
<td>Standard containers</td>
<td>Package functions as containers to decouple from the serverless runtime. Any container platform can run them.</td>
</tr>
<tr>
<td>Amazon ElastiCache</td>
<td><a href="https://redis.io/">Redis</a> or <a href="https://valkey.io/">Valkey</a></td>
<td>Redis is widely deployed and, from Redis 8, is available under AGPLv3 as well as source-available licenses. Valkey is a BSD-licensed Linux Foundation fork of Redis 7.2.4. ElastiCache supports both engines, so the move is usually low-friction.</td>
</tr>
</tbody></table>
<p>The right choice depends on your team’s operational capacity and workload requirements, not on a blanket recommendation.</p>
<h2>When Is It Worth Accepting Platform Lock-In for Managed AI Services?</h2>
<p>AI services are the newest and fastest-moving category of managed cloud offerings. The lock-in calculus here is different because the field changes so quickly that today’s best model may not be tomorrow’s.</p>
<h3>Evaluate Five Factors</h3>
<ol>
<li><strong>Speed to market.</strong> Managed AI APIs remove the work of hosting, scaling, and updating models, so you can ship a first version without building GPU infrastructure. If time-to-market is critical, the lock-in trade-off is often favorable.</li>
<li><strong>Model quality.</strong> Some proprietary models outperform open alternatives on specific tasks. Benchmark on your data before committing.</li>
<li><strong>Data sensitivity.</strong> Sending data to a third-party model API may conflict with compliance requirements. On-premises or private inference may be necessary.</li>
<li><strong>Cost at scale.</strong> API pricing that looks cheap at prototype volume can become prohibitive at production scale. Model the cost curve before you commit.</li>
<li><strong>Ability to swap models behind an abstraction.</strong> If your application calls models through a thin abstraction layer, switching providers is mostly a configuration change. You still need to re-test prompts and tool calls, re-run evaluations, and re-embed stored vectors if the embedding model changes.</li>
</ol>
<p>Use managed AI APIs for experimentation and initial deployment, and build an abstraction layer for model calls from day one. For production inference at scale, portable containers running on GPU infrastructure give you the flexibility to move between clouds or neoclouds as pricing and performance shift. On Control Plane, workloads can attach NVIDIA GPUs, and MK8s lets you join GPU servers from other providers as locations. See our guide on <a href="https://controlplane.com/blog/post/ai-inference-multiple-gpu-clouds?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">running AI inference across multiple GPU clouds</a>.</p>
<h2>What Multi-Cloud Infrastructure Patterns Reduce Dependence on Proprietary Managed Services?</h2>
<p>Six engineering patterns reduce dependence on proprietary managed services when applied across the stack.</p>
<h3>Containerize the Runtime</h3>
<p>Package every workload as a standard container image that follows the OCI image spec. An image packages application code and dependencies so any runtime that supports the OCI image spec can run it. Portability still has limits. Build multi-architecture images if you may run on both x86 and Arm nodes, keep configuration in environment variables or secrets rather than the image, and treat kernel features and GPU drivers as host dependencies.</p>
<h3>Infrastructure as Code</h3>
<p>Define all infrastructure in code with tools such as Terraform, OpenTofu, or Pulumi. Infrastructure as code makes environments reproducible and auditable. On Control Plane, the CLI, console, and Control Plane’s own Terraform and Pulumi providers all work through the same Control Plane API, so your definitions stay consistent.</p>
<h3>Open Protocols and Formats</h3>
<p>Prefer open standards: OpenTelemetry for observability, S3-compatible APIs for object storage, SQL for relational data, AMQP or NATS for messaging. Open protocols reduce the surface area of proprietary dependency.</p>
<h3>Isolate Provider-Specific Code Behind Interfaces</h3>
<p>When you do use a managed service, wrap it behind a well-defined interface in your application code. A storage interface, a queue interface, or a model-call interface means you can swap implementations without touching business logic.</p>
<h3>Scheduled Data Replication</h3>
<p>For critical datasets, replicate data to a second cloud or to your own infrastructure on a schedule. This keeps a current copy outside the primary provider for migration or disaster recovery. Replication adds ongoing egress and storage costs, so limit it to data you cannot rebuild.</p>
<h3>Workload Identity Instead of Long-Lived Keys</h3>
<p>Long-lived API keys and service account credentials are both a security risk and a portability obstacle. Use workload identity federation to grant short-lived credentials scoped to the current task. On Control Plane, Universal Cloud Identity does this for AWS, GCP, and Azure services.</p>
<p>For a broader look at cloud-native design principles that support portability, see our guide on <a href="https://controlplane.com/blog/post/cloud-native-architecture-principles-patterns-and-building-portable-systems?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">cloud-native architecture principles, patterns, and building portable systems</a>.</p>
<h2>Should I Choose PaaS or SaaS for Vendor Lock-In and Portability?</h2>
<p>Choose a PaaS when portability matters. A PaaS runs your application, so you keep the code, images, and data. A SaaS product replaces the application, so only your data can move.</p>
<p>The platform provides the runtime, networking, and operational tooling. If the PaaS uses standard container images and open APIs, your application is portable even if the platform itself is not.</p>
<p>With SaaS, the contract usually says you own your data, but the export format and completeness depend on the vendor. You do not control the application logic, the runtime, or the operational model. Portability depends entirely on the vendor’s data export capabilities and API compatibility. Switching SaaS providers often means rebuilding workflows from scratch.</p>
<p>A PaaS keeps these advantages only if it runs standard containers and does not impose a proprietary build or deployment format. For a detailed comparison of PaaS options, see our <a href="https://controlplane.com/blog/post/best-paas-providers-2026?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">guide to the best PaaS providers in 2026</a>.</p>
<h2>What Contract Clauses Should I Require for Data Portability and Service Exit?</h2>
<p>Before signing a cloud or managed-service agreement, negotiate terms that protect your ability to leave. The following checklist covers the essentials.</p>
<p><em>This is general guidance, not legal advice. Consult qualified counsel for your specific situation.</em></p>
<ul>
<li><strong>Data export format and timeline.</strong> The provider must export your data in a standard, documented format within a defined number of days after termination.</li>
<li><strong>Exit assistance.</strong> The contract should include a transition period during which the provider supports migration activities.</li>
<li><strong>Egress fee terms.</strong> Cap or waive egress fees during the transition period. At minimum, get clarity on per-GB costs.</li>
<li><strong>Notice periods.</strong> Ensure notice periods for termination are reasonable and symmetric. You should not need 12 months’ notice to leave.</li>
<li><strong>Termination for convenience.</strong> You should be able to terminate without cause, subject to reasonable notice and payment for services consumed.</li>
<li><strong>Price change caps.</strong> Limit annual price increases to a defined percentage, or require advance notice that gives you time to evaluate alternatives.</li>
<li><strong>Data deletion certification.</strong> After migration, the provider must certify in writing that your data has been deleted from their systems, including backups, within a specified timeframe.</li>
</ul>
<p>Maintain a service-dependency register that tracks each provider-specific component, its owner, data location, export procedure, portable alternative, and estimated exit cost. Review it quarterly.</p>
<h2>How Control Plane Approaches Portability</h2>
<p>Control Plane is the platform for running unbreakable apps and agents. It combines any cloud, neocloud, and bare metal into what Control Plane calls a Global Virtual Cloud (GVC), a set of locations a workload runs across.</p>
<p>On Control Plane, a workload deployed to a GVC runs active-active in every location of that GVC, and a global endpoint routes each request to the nearest healthy location, so you get failover without paying for idle standby capacity. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations, and those locations can be on different providers.</p>
<p>During the October 2025 AWS us-east-1 outage, which lasted about 15 hours, Control Plane customers with us-east-1 in their GVC had no downtime, and their workloads were “active and running in healthy locations within 10 seconds,” according to Control Plane internal incident telemetry. See <a href="https://controlplane.com/blog/post/beyond-backups-designing-systems-that-survive-the-inevitable?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">designing systems that survive the inevitable</a>.</p>
<p>Control Plane runs serverless, standard, stateful, cron, and VM workloads on AWS, GCP, and Azure, on clusters you already run through Control Plane’s Bring Your Own Kubernetes (BYOK), on your own machines (bare metal or VMs) turned into managed locations with Control Plane Managed Kubernetes (MK8s), and on premises. On Control Plane-provided compute, there is no Kubernetes cluster you have to operate, and Control Plane handles Day 2 operations for you, including autoscaling, Capacity AI (Control Plane’s right-sizing of CPU and memory based on historical usage), built-in observability, and security. You pay for the CPU and memory you reserve, by the millicore and the megabyte, with no contracts or minimums. Egress, storage, observability, dedicated load balancers, and GPUs are billed separately.</p>
<p>On Control Plane, the template catalog deploys open-source data services such as PostgreSQL, MySQL, MariaDB, Cassandra, Kafka, NATS, RabbitMQ, and Redis or Valkey into a GVC, so the portable alternatives above run on the same platform as your workloads.</p>
<p>Control Plane’s Universal Cloud Identity gives workloads short-lived, least-privilege access to 600+ AWS, GCP, and Azure services, with no long-lived cloud keys in your code. The Control Plane MCP server uses the same API as the CLI, console, and Terraform and Pulumi providers, so Control Plane complements the infrastructure as code you already run.</p>
<p>Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure.</p>
<p>You use each cloud’s managed services where they earn their place, and your runtime stays free to move. For a walkthrough of deploying the same application across AWS, GCP, and Azure, see <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">how to run the same app on AWS, GCP, and Azure</a>.</p>
<h2>FAQ</h2>
<h3>When do managed platform services increase vendor lock-in?</h3>
<p>Managed services increase lock-in when they expose proprietary APIs, store large volumes of data subject to egress fees, impose proprietary identity models, or use non-standard event systems. The more deeply your application integrates with these surfaces, the higher the switching cost.</p>
<h3>Which open-source alternatives to managed databases best support portability?</h3>
<p>PostgreSQL, MySQL, MariaDB, Apache Cassandra, Redis, and Valkey are widely adopted portable alternatives. ScyllaDB is a source-available option with a DynamoDB-compatible API. For queues and streaming, Apache Kafka, NATS, and RabbitMQ replace proprietary offerings.</p>
<h3>When is it worth accepting platform lock-in for managed AI services?</h3>
<p>It is worth it when speed to market is critical and you build an abstraction layer over model calls from day one. Avoid deep lock-in for production inference at scale; portable containers on GPU infrastructure give you pricing and performance flexibility.</p>
<h3>What multi-cloud infrastructure patterns reduce dependence on proprietary managed services?</h3>
<p>Containerize workloads, define infrastructure as code, use open protocols (OpenTelemetry, S3-compatible APIs, SQL), isolate provider-specific code behind interfaces, replicate critical data on a schedule, and use workload identity instead of long-lived keys.</p>
<h3>Should I choose PaaS or SaaS for vendor lock-in and portability?</h3>
<p>Choose PaaS when portability is a priority, because you keep control of your application code, container images, and data. SaaS portability depends almost entirely on the vendor’s data export capabilities.</p>
<h3>What contract clauses should I require for data portability and service exit?</h3>
<p>Require data export in standard formats within a defined timeline, exit assistance during a transition period, capped or waived egress fees, reasonable notice periods, termination for convenience, price change caps, and written data deletion certification.</p>
<h3>How does Control Plane keep the runtime portable while using managed services?</h3>
<p>On Control Plane, workloads (containers or VMs) run on a Global Virtual Cloud (GVC), Control Plane’s set of locations that can span AWS, GCP, Azure, Kubernetes clusters you bring through Control Plane’s Bring Your Own Kubernetes (BYOK), and your own servers on premises. Control Plane’s Universal Cloud Identity lets those workloads use AWS, GCP, and Azure managed services without long-lived cloud keys in your code.</p>
<h3>Is multi-cloud the same as cloud-agnostic?</h3>
<p>No. Multi-cloud means using more than one cloud provider. Cloud-agnostic means your workloads can move between providers with minimal effort. You can be multi-cloud and still deeply locked in to each provider’s proprietary services. True cloud-agnostic architecture requires portable runtimes, open standards, and abstraction layers.</p>
<h3>Does containerization solve cloud portability?</h3>
<p>Only partly. Containers make application code and dependencies portable, as long as images are built for the CPU architectures you target. They do not solve portability for databases, storage, identity, networking, or observability, which often remain cloud-specific. You need additional patterns, such as open protocols and interface abstraction, to address those layers.</p>
<h3>How often should I test my cloud exit plan?</h3>
<p>Test your cloud exit plan on a fixed schedule set by how critical the system is, such as quarterly for revenue-critical workloads, and after any major architecture change. Each test should export real data and deploy a representative workload on an alternative cloud.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to try it.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=managed-services-vs-portability-cloud-lock-in">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Keep an AI Product Online When Your Model Provider Goes Down: LLM Failover, Gateways, and Fallback Models]]></title><description><![CDATA[Keep an AI product online when your model provider goes down: LLM failover patterns, gateways, fallback models, and how to test them.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-keep-an-ai-product-online-when-your-model-provider-goes-down-llm-failover-gateways-and-fallback-models</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-keep-an-ai-product-online-when-your-model-provider-goes-down-llm-failover-gateways-and-fallback-models</guid><category><![CDATA[Devops]]></category><category><![CDATA[architecture]]></category><category><![CDATA[llm]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 12:51:09 GMT</pubDate><content:encoded><![CDATA[<p>Keep an AI product online by putting an OpenAI-compatible gateway in front of every model call, configuring fallback chains across providers, regions, and a self-hosted open-weight model, and handling timeouts, rate limits, and partial failures in the client. Then run the gateway and your agent services in more than one region so the resilience layer is not itself a single point of failure; Control Plane’s template catalog includes a LiteLLM gateway and a vLLM model server, each deployed once per region for regional redundancy, and Control Plane runs agent services active-active across locations behind a global endpoint.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<p>Treat every model as a replaceable dependency behind a routing layer you control.</p>
<ul>
<li><strong>What fails:</strong> full outages, elevated error rates, rate limits, latency spikes, regional capacity limits, broken streams, and model deprecations.</li>
<li><strong>Gateway:</strong> one OpenAI-compatible endpoint in front of several providers, with routing, fallbacks, retries, budgets, caching, and central logging.</li>
<li><strong>Fallback chain:</strong> the same model in another region first, then an equivalent model from another provider, then a self-hosted open-weight model.</li>
<li><strong>Self-hosted fallback:</strong> an open-weight model on an OpenAI-compatible server such as vLLM, kept warm and validated against your evaluation set.</li>
<li><strong>Client handling:</strong> timeouts, backoff with jitter, circuit breakers, idempotent tool calls, and a policy for broken streams.</li>
<li><strong>Multi-region:</strong> run the gateway, agent services, and their state in at least two regions behind a health-checked global endpoint.</li>
<li><strong>Testing:</strong> block providers in staging, inject 429s and timeouts, and measure fallback time and quality.</li>
<li><strong>On Control Plane,</strong> the LiteLLM template deploys the gateway, the vLLM template serves a self-hosted fallback on GPUs, and agent services run active-active across the locations of Control Plane’s Global Virtual Cloud (GVC).</li>
</ul>
<h2>What actually fails when a model provider has an outage?</h2>
<ul>
<li><strong>Full API outages.</strong> Requests fail with connection errors, HTTP 503, or provider-specific overload codes such as 529.</li>
<li><strong>Elevated 5xx error rates.</strong> The API is up, but a share of requests return 500 or 502, which is harder to detect because some calls still succeed.</li>
<li><strong>429 rate limiting and quota exhaustion.</strong> The provider throttles your traffic after you exceed token, request, or spend limits, even while it serves other customers.</li>
<li><strong>Latency spikes and timeouts.</strong> Responses slow down until they exceed your client’s timeout, sometimes without a declared incident.</li>
<li><strong>Regional capacity limits.</strong> A model is available in some regions but has no capacity in the one you call.</li>
<li><strong>Streams that break mid-answer.</strong> A streamed response starts and then drops, after partial output has reached the user.</li>
<li><strong>Deprecations and behavior changes.</strong> A model version is retired or updated, which changes output format, quality, or tool-calling behavior.</li>
</ul>
<p>Each provider’s official status page and incident history is the authoritative record of past and current incidents; check it when you choose providers and set expectations.</p>
<h2>How do I make an AI inference API highly available across providers?</h2>
<p>Availability across providers depends on a gateway, an ordered fallback chain, portable prompts, and approved data terms for every provider.</p>
<h3>Use a gateway</h3>
<p>Put a single OpenAI-compatible endpoint between your application and every provider. The application calls one URL with one credential, and the gateway handles provider selection, provider keys, retries, fallbacks, per-key rate limits and budgets, response caching, and logging. Adding a provider or reordering fallbacks becomes a configuration change.</p>
<p><a href="https://docs.litellm.ai/docs/proxy/reliability">LiteLLM</a> is an open-source gateway that implements this pattern. It exposes one endpoint for 100+ providers, issues virtual keys with per-key and per-team budgets, enforces rate limits, and supports ordered fallbacks with configurable retries and timeouts.</p>
<p>A gateway adds a network hop and some latency. It holds every provider key, so treat it as a security boundary: restrict network access, rotate keys, and audit admin access. Key response caches by tenant and user, and exclude personalized output from them.</p>
<h3>Design the fallback chain</h3>
<p>Order fallbacks from most to least similar to the primary model:</p>
<ol>
<li><strong>Same model, another region or deployment.</strong> The model stays the same if the same version is deployed in that region. <a href="https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html">Amazon Bedrock cross-region inference</a> uses an inference profile to route requests across regions in a geography, and <a href="https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/deployment-types">Azure deployment types</a> include global and data zone deployments that draw on capacity in more than one region; Microsoft notes these do not fail over if the deployment’s primary region is interrupted, so keep a second deployment in another region as the real fallback.</li>
<li><strong>Equivalent model, another provider.</strong> This survives a full provider outage, with some differences in output.</li>
<li><strong>Self-hosted open-weight model.</strong> This removes the external dependency, with the largest quality gap for demanding tasks.</li>
</ol>
<table>
<thead>
<tr>
<th>Fallback tier</th>
<th>Protects against</th>
<th>Trade-offs</th>
</tr>
</thead>
<tbody><tr>
<td>Same model, another region</td>
<td>Regional capacity limits; single-region outages only when the fallback is a separate deployment or profile in another region</td>
<td>Little quality change; may move data to another jurisdiction; added latency</td>
</tr>
<tr>
<td>Equivalent model, another provider</td>
<td>Full provider outage, provider-wide throttling</td>
<td>Prompt and output differences; different data terms and retention; different cost</td>
</tr>
<tr>
<td>Self-hosted open-weight model</td>
<td>Any external provider failure</td>
<td>Largest quality gap; needs GPU capacity and operations; predictable cost at volume</td>
</tr>
</tbody></table>
<h3>Keep prompts portable</h3>
<p>Write prompts that do not depend on one provider’s quirks, and use structured outputs and tool schemas that every model in the chain supports. Keep an evaluation set of representative prompts, and require each fallback model to pass it on JSON validity, tool-call correctness, accuracy, tone, and latency before it enters the chain.</p>
<h3>Know what changes on failover</h3>
<p>Fallback models have different context windows and tokenizers, so a prompt that fits the primary can exceed a fallback’s limit. Provider prompt caches do not carry over, which raises latency and cost after a switch. Safety filters and refusal behavior differ by provider. The secondary provider needs quota and rate-limit tiers provisioned ahead of time for full production load. Failing over to a pricier model can spike spend, so set budgets per tier. Providers update models, so rerun the evaluation set on a schedule.</p>
<h3>Check contracts and data residency</h3>
<p>Confirm that every fallback provider is allowed for the data you send: data processing terms, retention settings, and regions. Features that handle regulated data may need to fail closed instead of routing to an unapproved provider.</p>
<h2>How do I handle provider failures in the client?</h2>
<p>Keep client safeguards, but retry in one layer only; if both the client and the gateway retry, attempts multiply during an outage.</p>
<ul>
<li><strong>Timeouts on every call.</strong> Set an explicit timeout sized to the task so a hung connection cannot stall a user request or an agent step, and set a separate time-to-first-token timeout for streams.</li>
<li><strong>Retries with exponential backoff and jitter.</strong> Retry 5xx errors and timeouts a small number of times within a strict total deadline, with random jitter to avoid synchronized retry storms.</li>
<li><strong>Retry-After on 429s.</strong> Wait the time the provider indicates before retrying. A 429 that reports exhausted quota or spend limits will not clear on retry (OpenAI marks these as insufficient_quota in the error body, and Anthropic’s spend-limit 429s carry no retry-after header); route it to the next tier instead, and do not retry other 4xx errors. See the <a href="https://developers.openai.com/api/docs/guides/rate-limits">OpenAI rate limits guide</a> and <a href="https://platform.claude.com/docs/en/api/errors">Anthropic API errors</a> for how each signals rate limiting and overload.</li>
<li><strong>Circuit breakers.</strong> After repeated failures, stop sending traffic to a provider for a cooldown period, route to the next tier, and send a probe request before restoring traffic.</li>
<li><strong>Idempotent tool calls.</strong> Give side-effecting agent actions (emails, writes, payments) idempotency keys so a retry does not repeat them.</li>
<li><strong>Broken streams.</strong> Decide per feature whether to discard partial output and retry, or keep it and mark it incomplete; failing over before a stream starts is simpler.</li>
<li><strong>Queues for non-interactive work.</strong> Put batch and background jobs on a queue so they wait out an outage instead of consuming fallback capacity.</li>
</ul>
<p>Hedged requests send a second request to another provider when the first exceeds a latency threshold. Hedging raises token cost and needs idempotent tool calls, so reserve it for latency-critical paths.</p>
<h2>What should a degraded mode look like?</h2>
<p>Prepare degraded mode before an outage:</p>
<ul>
<li>A smaller or cheaper fallback model, configured and tested for basic functions.</li>
<li>Cached answers for repeated, safe-to-reuse questions, with expiry and privacy controls.</li>
<li>Feature flags that turn off non-essential AI features.</li>
<li>Queues that accept long tasks and notify users when they finish.</li>
<li>User messaging, written and approved in advance, that says what is limited and when to expect recovery.</li>
<li>Logging of which model served each request.</li>
<li>Fail-closed behavior for compliance-sensitive features.</li>
</ul>
<h2>Should I keep a self-hosted fallback model?</h2>
<p>Keep one when you have strict uptime targets, data that cannot go to third-party APIs, or enough volume that predictable cost outweighs the operating effort.</p>
<p>A self-hosted fallback needs GPU capacity, an open-weight model that passes your evaluation set, and an OpenAI-compatible server so the gateway can call it like any other provider. Confirm the server supports tool calling and structured output for the chosen model. <a href="https://docs.vllm.ai/en/latest/">vLLM</a> serves open-weight models through an OpenAI-compatible API with continuous batching and efficient memory management.</p>
<p>Large models take time to load into GPU memory, and longer if the weights must download first. A fallback that has to answer within seconds of a primary failure needs at least one warm replica; caching weights on a persistent volume removes the download but not the load time. Size the warm tier for the traffic it must absorb, since smaller GPUs such as T4 and A10G limit model size.</p>
<p>For failover between GPU clouds, see <a href="https://controlplane.com/blog/post/ai-inference-multiple-gpu-clouds?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">running AI inference across multiple GPU clouds</a>, and for the full serving stack, <a href="https://controlplane.com/blog/post/what-infrastructure-do-you-need-to-run-an-inference-layer?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">what infrastructure you need to run an inference layer</a>.</p>
<h2>Where should I run AI agents in production so they don’t go down?</h2>
<p>Run the gateway, the agent services, and their state (queues, databases, vector stores, caches) in at least two regions, behind a health-checked global endpoint that sends each request to the nearest healthy region.</p>
<ul>
<li><strong>Remove hidden single-region dependencies.</strong> The gateway’s own database, the secrets store, the vector store, and the queue broker each become a single point of failure if they live in one region.</li>
<li><strong>Rehearse failures.</strong> Disable a region and block a provider in staging on a schedule, and confirm traffic and fallbacks shift as designed.</li>
</ul>
<p>For region outages, see <a href="https://controlplane.com/blog/post/keep-app-online-aws-region-outage?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">how to keep your app online when an AWS region goes down</a> and the <a href="https://controlplane.com/blog/post/cloud-outage-tracker?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">cloud outage tracker</a>; for operating agents safely, see <a href="https://controlplane.com/blog/post/ai-agents-production-infrastructure-safely?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">how to let AI agents operate production infrastructure safely</a>.</p>
<h2>How do I test LLM failover?</h2>
<ol>
<li><strong>Block a provider.</strong> Mark the primary unavailable in the gateway and confirm requests reach the next tier; record how long the switch takes.</li>
<li><strong>Inject 429s and timeouts.</strong> Confirm retries, backoff, and circuit breakers behave as designed.</li>
<li><strong>Break a stream mid-response.</strong> Confirm the client applies your partial-output policy.</li>
<li><strong>Load-test the secondary provider.</strong> Send production volume to confirm its quotas hold.</li>
<li><strong>Score the fallback.</strong> Run the evaluation set on each fallback model and compare results with the primary; a fallback that returns unusable output does not count.</li>
<li><strong>Run a game day.</strong> Walk through detection, alerting, fallback, user messaging, and recovery with the team.</li>
</ol>
<p>Monitor per-provider error rates (5xx, 429, timeouts), per-provider latency percentiles, token spend by provider and tier, and how often each fallback tier serves traffic.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the platform for running unbreakable apps and agents. It combines any cloud, neocloud, and bare metal into a GVC, the set of locations a workload runs across, and runs serverless, standard, stateful, and cron workloads on AWS, GCP, and Azure, on Kubernetes clusters you already run, and on your own machines turned into managed locations, including on premises.</p>
<ul>
<li><strong>Gateway.</strong> The LiteLLM template deploys LiteLLM’s OpenAI-compatible gateway (100+ providers, routing with fallbacks) with virtual API keys, per-key and per-team spend tracking and budgets, and rate limiting. It runs a stateless proxy tier backed by a bundled PostgreSQL for keys, spend, teams, and budgets, and a bundled Sentinel-managed Redis for rate-limit counters and the response cache shared across proxy replicas. Run two or more proxy replicas for an always-on tier, and keep Redis enabled whenever there is more than one replica so limits are shared. The template’s PostgreSQL and Redis run inside one GVC, so for a multi-region gateway, deploy a release per region or point it at a multi-location database. Separate per-region releases keep separate virtual keys, budgets, and spend records unless they share that database.</li>
<li><strong>Self-hosted fallback.</strong> The vLLM template serves one Hugging Face open-weight model through vLLM’s OpenAI-compatible API on an NVIDIA GPU, either Control Plane’s built-in A10G or T4 GPUs or your own GPU cluster registered as a Control Plane bring-your-own-Kubernetes (BYOK) location. The API is protected by an API key, and the model is cached on a persistent volume so restarts do not download it again. The template runs in a GVC with one location, so deploy one per region for regional redundancy. An Ollama template is also available, and Control Plane’s pricing page lists NVIDIA GPUs from T4 to B200.</li>
<li><strong>Multi-location services.</strong> A workload deployed to a GVC runs active-active in every location of that GVC from one definition, and a global endpoint routes each request to the nearest healthy location. Disabling a location removes its replicas and routes traffic to the locations that remain.</li>
<li><strong>Keyless cloud model access.</strong> Control Plane’s Universal Cloud Identity (UCI) lets workloads call AWS, GCP, and Azure services such as Amazon Bedrock, Vertex AI, or Azure OpenAI with no long-lived cloud keys in your code.</li>
</ul>
<p>During the October 20, 2025 AWS us-east-1 outage, which lasted about 15 hours, Control Plane customers with us-east-1 in their GVC had no downtime, and their workloads were “active and running in healthy locations within 10 seconds,” according to Control Plane internal incident telemetry (<a href="https://controlplane.com/blog/post/beyond-backups-designing-systems-that-survive-the-inevitable?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">details</a>). That was a cloud region outage; model provider outages are handled by the gateway and fallback design in this guide.</p>
<p>The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. It covers workloads running on Control Plane, and it does not cover third-party model APIs. Control Plane handles Day 2 operations for you, including autoscaling, Control Plane’s Capacity AI right-sizing, built-in observability, and security, with no Kubernetes cluster you have to operate; Capacity AI does not apply to GPU workloads. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure, which applies to compute and not to model tokens. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<h2>FAQ</h2>
<p>Short answers on keeping AI products online through provider outages.</p>
<h3>How do I keep an AI product online when my model provider or GPU cloud has an outage?</h3>
<p>Route every model call through a gateway with a fallback chain across regions, providers, and a self-hosted model, handle timeouts and rate limits in the client, and run the gateway and agents in at least two regions. For GPU cloud outages, fail over self-hosted inference to another GPU provider.</p>
<h3>How do I make an AI inference API highly available across providers?</h3>
<p>Put an OpenAI-compatible gateway in front of several providers, configure ordered fallbacks triggered by 5xx errors, timeouts, and 429s, and keep every fallback model validated against your evaluation set.</p>
<h3>Where should I run AI agents in production so they don’t go down?</h3>
<p>In at least two regions, behind a health-checked global endpoint, with the gateway, queues, databases, and vector stores also spread across regions so none is a single-region dependency.</p>
<h3>What is an LLM gateway and do I need one?</h3>
<p>A gateway is a proxy that handles routing, fallbacks, retries, provider keys, budgets, caching, and logging behind one endpoint. You need one once you use more than one provider or need fallbacks and central cost tracking.</p>
<h3>What order should a fallback chain follow?</h3>
<p>Same model in another region or deployment first, then an equivalent model from another provider, then a self-hosted open-weight model.</p>
<h3>How should my app handle 429 rate-limit errors?</h3>
<p>Wait the time the provider indicates, retry with backoff and jitter, open a circuit breaker after repeated failures, and let the gateway route to the next provider if limits persist.</p>
<h3>Should I self-host a fallback LLM?</h3>
<p>Yes, if you have strict uptime targets, data that cannot leave your control, or high volume. Serve it with an OpenAI-compatible server such as vLLM and keep at least one replica warm.</p>
<h3>How do I test that LLM failover works?</h3>
<p>Block the primary provider in staging, inject 429s and timeouts, time the switch, score fallback output with your evaluation set, and run periodic game days.</p>
<h3>What should users see during a model outage?</h3>
<p>Normal responses if the fallback meets your quality bar; otherwise a clear degraded-mode notice, queued processing for long tasks, and fail-closed behavior for compliance-sensitive features.</p>
<h3>Can an LLM gateway itself be a single point of failure?</h3>
<p>Yes. Run at least two stateless proxy replicas, place them in more than one region, and make sure the gateway’s database and cache are not confined to a single region.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to run your gateway and agent services across regions.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/keep-ai-product-online-model-provider-outage-llm-failover?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=keep-ai-product-online-model-provider-outage-llm-failover">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Kubernetes in Production: Reference Architecture, Zero-Downtime Upgrades, Autoscaling, and Running Postgres in Containers]]></title><description><![CDATA[Kubernetes in production: a reference architecture, safe cluster upgrades, autoscaling, and how to run Postgres in containers reliably.]]></description><link>https://controlplane-eng.hashnode.dev/kubernetes-in-production-reference-architecture-zero-downtime-upgrades-autoscaling-and-running-postgres-in-containers</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/kubernetes-in-production-reference-architecture-zero-downtime-upgrades-autoscaling-and-running-postgres-in-containers</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[postgres]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 10:53:34 GMT</pubDate><content:encoded><![CDATA[<p>A production-ready Kubernetes cluster starts with a managed control plane, worker nodes across three availability zones, an ingress controller or gateway behind a cloud load balancer, cluster and pod autoscaling, and stateful data either in a managed database or in an operator-managed database with replicas across zones. The hard part is Day 2: upgrades, scaling, failover, and security patches, which is why many teams run workloads on a platform that operates Kubernetes for them; Control Plane runs containers across AWS, GCP, Azure, and your own servers with autoscaling, failover, and Day 2 operations handled, with no Kubernetes cluster you have to operate.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>Architecture.</strong> Use a managed control plane (EKS, GKE, or AKS), separate system and workload node pools, an ingress controller or Gateway API implementation behind a cloud load balancer, cert-manager for TLS, and network policies for isolation.</li>
<li><strong>Upgrades.</strong> Read release notes, check for deprecated APIs, upgrade staging first, upgrade the control plane, then roll through node pools one at a time with surge nodes and PodDisruptionBudgets.</li>
<li><strong>Autoscaling.</strong> Layer the Horizontal Pod Autoscaler (HPA) for replica count, the Vertical Pod Autoscaler (VPA) for right-sizing, and a node autoscaler (Cluster Autoscaler or Karpenter) for capacity. KEDA adds event-driven triggers.</li>
<li><strong>Stateful data.</strong> Managed databases are the simplest path. When you need Postgres in Kubernetes, use an operator such as CloudNativePG with replicas across zones, automated failover, and rehearsed backup and restore.</li>
<li><strong>When not to run it yourself.</strong> If your team spends more time operating Kubernetes than shipping product, a platform that handles Day 2 for you is the faster path.</li>
</ul>
<h2>What is a simple Kubernetes cluster architecture for production, including ingress and load balancer traffic flow?</h2>
<p>A production cluster has three layers: the control plane, the node pools, and the networking stack that carries traffic from the internet to your pods.</p>
<h3>Reference architecture</h3>
<p><strong>Managed control plane.</strong> Use a managed Kubernetes service so the cloud provider runs etcd, the API server, and control plane upgrades. The three major options are <a href="https://aws.amazon.com/eks/">Amazon EKS</a>, <a href="https://cloud.google.com/kubernetes-engine">Google Kubernetes Engine (GKE)</a>, and <a href="https://azure.microsoft.com/en-us/products/kubernetes-service">Azure Kubernetes Service (AKS)</a>.</p>
<p><strong>Node pools.</strong> Create at least two node pools. A small system node pool runs cluster add-ons (CoreDNS, metrics-server, the ingress controller). A workload node pool runs your application pods. Spread both pools across three availability zones. Use topology spread constraints or pod anti-affinity rules so replicas land in different zones. Set resource requests and limits on every pod so the scheduler can place pods accurately.</p>
<p><strong>Ingress and gateway layer.</strong> An ingress controller or a <a href="https://gateway-api.sigs.k8s.io/">Gateway API</a> implementation sits behind a cloud load balancer and routes external HTTP and HTTPS traffic to Kubernetes Services. Use cert-manager to issue and renew TLS certificates from Let’s Encrypt or an internal CA. Use external-dns to keep DNS records in sync with your routes. Apply network policies to restrict traffic between namespaces.</p>
<p><strong>Secrets management.</strong> Store secrets in an external secrets manager (AWS Secrets Manager, Google Secret Manager, Azure Key Vault, or HashiCorp Vault) and sync them into the cluster with the External Secrets Operator or the Secrets Store CSI Driver.</p>
<h3>Request path from DNS to pod</h3>
<ol>
<li><strong>DNS resolution.</strong> The client resolves your domain. The record, kept current by external-dns, points to the cloud load balancer.</li>
<li><strong>Cloud load balancer.</strong> The load balancer accepts the connection, optionally terminates TLS, and forwards traffic to the ingress controller’s pods, either through node ports or directly to pod IPs (IP target mode on the AWS Load Balancer Controller, container-native load balancing on GKE). The load balancer’s health checks decide which ingress targets receive traffic.</li>
<li><strong>Ingress controller or gateway.</strong> The controller terminates TLS if the load balancer did not, matches the host and path, and forwards the request to the right Kubernetes Service. Most ingress controllers read the Service’s endpoints and send traffic directly to pod IPs.</li>
<li><strong>Service.</strong> The Service selects ready pods by label. kube-proxy or a CNI plugin such as Cilium balances connections across pod IPs.</li>
<li><strong>Pod.</strong> The container handles the request. Readiness probes decide whether a pod is listed as a Service endpoint. Liveness probes restart a container that has stopped responding.</li>
</ol>
<h3>Component table</h3>
<table>
<thead>
<tr>
<th>Component</th>
<th>Purpose</th>
<th>Common open-source choice</th>
</tr>
</thead>
<tbody><tr>
<td>Gateway or ingress controller</td>
<td>HTTP routing, TLS termination</td>
<td>Gateway API implementations (Envoy Gateway, Cilium, Istio, Contour)</td>
</tr>
<tr>
<td>TLS certificates</td>
<td>Automated certificate issuance and renewal</td>
<td>cert-manager</td>
</tr>
<tr>
<td>DNS automation</td>
<td>Sync DNS records with routes</td>
<td>external-dns</td>
</tr>
<tr>
<td>CNI plugin</td>
<td>Pod networking, network policy</td>
<td>Cilium, Calico</td>
</tr>
<tr>
<td>Metrics</td>
<td>Cluster and application metrics</td>
<td>Prometheus</td>
</tr>
<tr>
<td>Tracing</td>
<td>Traces, metrics, and logs</td>
<td>OpenTelemetry</td>
</tr>
<tr>
<td>Secrets sync</td>
<td>External secrets into Kubernetes</td>
<td>External Secrets Operator</td>
</tr>
<tr>
<td>Policy engine</td>
<td>Admission control, compliance</td>
<td>OPA Gatekeeper, Kyverno</td>
</tr>
</tbody></table>
<p>The community ingress-nginx controller <a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/">was retired</a> in March 2026 and receives no further releases or security fixes. The Kubernetes project recommends migrating to the Gateway API.</p>
<h2>How do I plan zero downtime Kubernetes upgrades and migrations while keeping AI infrastructure compliant and stable?</h2>
<p>Kubernetes ships about three minor releases a year, and the project maintains release branches for the three most recent minor versions; the <a href="https://kubernetes.io/releases/">Kubernetes releases page</a> lists the current versions and their end-of-life dates. Each release can remove APIs and change defaults, so a repeatable upgrade process keeps routine upgrades from turning into incidents.</p>
<h3>Upgrade runbook</h3>
<ol>
<li><strong>Read the release notes.</strong> The release notes and the <a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/">deprecated API migration guide</a> list every removal and behavior change.</li>
<li><strong>Check API deprecations.</strong> The API server exposes the <code>apiserver_requested_deprecated_apis</code> metric, and managed services such as EKS and GKE flag deprecated API usage before an upgrade. Fix manifests and Helm charts before you upgrade.</li>
<li><strong>Respect version skew.</strong> Upgrade one minor version at a time; the control plane cannot skip minor versions, and kubelets may lag the API server by up to three minor versions. Upgrade add-ons (CNI, CoreDNS, CSI drivers, kube-proxy) to versions that support the target.</li>
<li><strong>Upgrade a staging cluster first.</strong> Apply the new version to a non-production cluster that mirrors production. Run integration and smoke tests, and confirm every controller, operator, and custom resource still works.</li>
<li><strong>Upgrade the control plane.</strong> On a managed service this is a console action, a CLI command, or a Terraform change. Running pods keep serving while the control plane updates.</li>
<li><strong>Upgrade node pools one at a time.</strong> Add surge nodes on the new version, then cordon and drain old nodes. PodDisruptionBudgets limit how many replicas of an application can be evicted at once. Readiness probes keep traffic off replacement pods until they can serve. Give pods a preStop delay and a termination grace period so endpoint removal finishes before shutdown. Single-replica applications still drop traffic, and a PodDisruptionBudget that allows zero disruptions blocks the drain.</li>
<li><strong>Validate after each pool.</strong> Check pod health, error rates, and latency before moving to the next pool.</li>
</ol>
<h3>Blue/green cluster upgrades</h3>
<p>For large version jumps, or when an in-place rollback is unacceptable, build a new cluster on the target version, deploy workloads to it, shift traffic at the load balancer or DNS layer, and retire the old cluster. This costs more while both clusters run and removes in-place upgrade risk. Stateful data must be replicated or restored into the new cluster, and DNS TTLs set how fast traffic moves.</p>
<h3>GPU and AI workload considerations</h3>
<p>The NVIDIA driver on the node, the CUDA version in the container image, and the framework version must be compatible. Validate the combination in staging before you roll GPU node pools.</p>
<h3>Compliance and change management</h3>
<p>Keep a change record for every upgrade: what changed, who approved it, what was tested, and how to roll it back. Store cluster configuration in version control so auditors can see the history of every change.</p>
<h2>Which managed Kubernetes solution is best for autoscaling EC2 nodes and automatically scaling pods?</h2>
<p>Kubernetes autoscaling works at two layers. Pod autoscaling changes how many pods run or how large they are. Node autoscaling changes the compute underneath them. On AWS, the usual answer is EKS with the HPA for pods and either Karpenter or EKS Auto Mode, which runs Karpenter for you, for EC2 nodes. GKE and AKS offer managed node provisioning of their own.</p>
<h3>Pod autoscaling</h3>
<p><strong>Horizontal Pod Autoscaler (HPA).</strong> The <a href="https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/">HPA</a> adjusts replica count from CPU, memory, or custom metrics. HPA computes CPU utilization as a percentage of the pod’s request, so accurate requests matter. Stabilization windows prevent flapping during short spikes.</p>
<p><strong>Vertical Pod Autoscaler (VPA).</strong> The <a href="https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler">VPA</a> recommends or sets resource requests from observed usage. Do not let VPA and HPA act on the same CPU or memory metric; running VPA in recommendation mode alongside HPA avoids the conflict.</p>
<p><strong>KEDA.</strong> <a href="https://keda.sh/">KEDA</a> scales pods from event sources such as queue depth, stream lag, cron schedules, or Prometheus queries. It manages HPA objects for you and can scale a workload to zero.</p>
<h3>Node autoscaling</h3>
<p><strong>Cluster Autoscaler.</strong> The <a href="https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler">Cluster Autoscaler</a> adds nodes when pods cannot be scheduled and removes underused nodes. It works with node groups and managed node pools on all three major clouds.</p>
<p><strong>Karpenter.</strong> <a href="https://karpenter.sh/">Karpenter</a> is an open-source node provisioner first built for AWS. It launches right-sized instances directly from the cloud API instead of scaling fixed node groups, and it consolidates workloads onto fewer or cheaper nodes when demand drops.</p>
<p><strong>GKE Autopilot and node auto-provisioning.</strong> <a href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview">GKE Autopilot</a> manages nodes for you and bills general-purpose pods by the resources they request; pods that select specific hardware, such as GPUs or a machine series, are billed by node. On GKE Standard, node auto-provisioning creates and deletes node pools as needed.</p>
<p><strong>AKS node autoprovisioning.</strong> <a href="https://learn.microsoft.com/en-us/azure/aks/node-auto-provisioning">AKS node autoprovisioning</a>, built on Karpenter, picks VM sizes from pending pod requests so you don’t predefine a node pool for each VM size.</p>
<h3>Autoscaling comparison</h3>
<table>
<thead>
<tr>
<th>What scales</th>
<th>Trigger</th>
<th>Typical reaction time</th>
<th>Caveats</th>
</tr>
</thead>
<tbody><tr>
<td>HPA (pod replicas)</td>
<td>CPU, memory, custom metrics</td>
<td>Seconds to low tens of seconds</td>
<td>Needs accurate requests; new pods still need scheduling, image pull, and readiness, which takes minutes if nodes must be added</td>
</tr>
<tr>
<td>VPA (pod resources)</td>
<td>Observed usage</td>
<td>Minutes; may recreate pods unless in-place resize is enabled</td>
<td>Conflicts with HPA on the same metric</td>
</tr>
<tr>
<td>KEDA (pod replicas)</td>
<td>Queue depth, stream lag, cron, external metrics</td>
<td>Seconds to low tens of seconds</td>
<td>Adds a controller to operate; supports scale to zero</td>
</tr>
<tr>
<td>Cluster Autoscaler (nodes)</td>
<td>Unschedulable pods</td>
<td>Minutes</td>
<td>Limited to the instance types in each node group</td>
</tr>
<tr>
<td>Karpenter (nodes)</td>
<td>Unschedulable pods, consolidation</td>
<td>Usually faster than node-group scaling</td>
<td>GPU instances launch slower; spot interruptions need fallback capacity</td>
</tr>
<tr>
<td>GKE Autopilot (nodes)</td>
<td>Pod scheduling</td>
<td>Minutes</td>
<td>Less control over node configuration</td>
</tr>
</tbody></table>
<p>On Control Plane, each workload autoscales per location between a minimum and maximum, targeting concurrent requests, requests per second, CPU, memory, or latency depending on workload type, and KEDA is available for event-driven scaling. Capacity AI, Control Plane’s right-sizing of CPU and memory based on historical usage, adjusts resource allocation over time. Capacity AI is not used for GPU workloads or for workloads that autoscale on CPU or on multiple metrics.</p>
<h2>Best platforms for running stateful workloads like Postgres in containers</h2>
<p>Running Postgres in production needs durable storage, replication with automated failover, rehearsed backups, and a plan for major version upgrades. There are three broad options.</p>
<h3>Managed database services</h3>
<p>The cloud provider handles replication, failover, backups, and minor-version patching, and provides tooling for major version upgrades that you schedule.</p>
<ul>
<li><strong>AWS:</strong> <a href="https://aws.amazon.com/rds/postgresql/">Amazon RDS for PostgreSQL</a> and <a href="https://aws.amazon.com/rds/aurora/">Amazon Aurora PostgreSQL</a></li>
<li><strong>GCP:</strong> <a href="https://cloud.google.com/sql/docs/postgres">Cloud SQL for PostgreSQL</a> and <a href="https://cloud.google.com/alloydb">AlloyDB</a></li>
<li><strong>Azure:</strong> <a href="https://azure.microsoft.com/en-us/products/postgresql/">Azure Database for PostgreSQL</a></li>
</ul>
<p>You give up some control and portability in exchange for a lighter operational load.</p>
<h3>Kubernetes operators</h3>
<p>Operators turn Postgres lifecycle tasks (provisioning, replication, failover, backup, restore) into Kubernetes resources. The established open-source operators are:</p>
<ul>
<li><a href="https://cloudnative-pg.io/">CloudNativePG</a></li>
<li><a href="https://github.com/zalando/postgres-operator">Zalando’s Postgres Operator</a></li>
<li><a href="https://github.com/CrunchyData/postgres-operator">Crunchy Data’s PGO</a></li>
</ul>
<p>They run Postgres pods with persistent volumes, configure streaming replication, promote a replica when the primary fails, and archive WAL to object storage for point-in-time recovery.</p>
<h3>Platforms with packaged Postgres templates</h3>
<p>On Control Plane, the template catalog includes highly available Postgres (a Patroni cluster of at least three members with one leader and streaming replicas) and Postgres Multi-Location (one Patroni cluster stretched across locations with a single primary, streaming replicas in other locations, automatic promotion when a location is lost, and a leader-routing proxy per location). pgEdge and CockroachDB templates are also available. Stateful workloads on Control Plane use volume sets: persistent volumes with a performance class, snapshots, and restore from snapshot.</p>
<h3>Key operational considerations</h3>
<p><strong>Synchronous vs. asynchronous replication.</strong> With synchronous replication, the primary confirms a commit only after a replica has it, so failover to that synchronous replica loses no committed transactions. The cost is added write latency, and writes stall when no synchronous replica is available unless the operator falls back to asynchronous mode, which drops the guarantee. Asynchronous replication is faster and can lose the most recent transactions during failover. Most operators let you choose.</p>
<p><strong>Backups and point-in-time recovery.</strong> Take base backups to object storage and archive WAL continuously. Rehearse restores on a schedule.</p>
<p><strong>Storage classes and volume performance.</strong> Use SSD-backed storage classes sized for your IOPS and throughput. Block volumes such as Amazon EBS and Persistent Disk are zonal, so a pod cannot follow its volume to another zone; replica failover is what survives a zone loss. Test what happens when a volume detaches, a node dies, or a zone goes down.</p>
<p><strong>Major version upgrades.</strong> pg_upgrade needs a short outage. Copy mode scales with data size; link mode takes minutes but leaves no fallback once the new cluster starts. Run ANALYZE afterward. Logical replication to a new cluster shortens the cutover, but it does not carry DDL or sequence values, and tables need primary keys or a replica identity.</p>
<p><strong>Do not autoscale database replicas with HPA.</strong> Replication topology and consistency rules make reactive scaling unsafe. Change replica counts deliberately through the operator.</p>
<h3>Decision table</h3>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Managed service</th>
<th>Kubernetes operator</th>
<th>Platform template</th>
</tr>
</thead>
<tbody><tr>
<td>Operational burden</td>
<td>Lowest</td>
<td>Highest</td>
<td>Low to moderate</td>
</tr>
<tr>
<td>Portability</td>
<td>Tied to one cloud</td>
<td>Any conformant cluster</td>
<td>Any cloud or location Control Plane runs on, including your own clusters and servers</td>
</tr>
<tr>
<td>Customization</td>
<td>Limited</td>
<td>Full</td>
<td>Template values</td>
</tr>
<tr>
<td>Failover</td>
<td>Automatic when high availability is enabled</td>
<td>Operator-managed</td>
<td>Automatic Patroni promotion (Postgres templates)</td>
</tr>
<tr>
<td>Backup and PITR</td>
<td>Built in</td>
<td>Operator-configured</td>
<td>Optional logical or WAL-G backups, off by default; restore is manual</td>
</tr>
<tr>
<td>Major version upgrades</td>
<td>Managed or semi-managed</td>
<td>Declarative in CloudNativePG and PGO; needs planning</td>
<td>Manual, needs planning</td>
</tr>
</tbody></table>
<h2>Why is Kubernetes considered complex for AI infrastructure teams and what are the biggest operational pain points?</h2>
<p>AI and ML teams face every standard Kubernetes challenge plus problems specific to GPUs, large models, and fast-moving frameworks.</p>
<ol>
<li><strong>GPU scheduling and node pools.</strong> Kubernetes treats GPUs as extended resources, and a pod gets whole GPUs unless you add sharing such as MIG, time-slicing, or MPS, or allocate devices through Dynamic Resource Allocation. Mitigation: isolate GPU node pools with labels and taints, and use the NVIDIA GPU Operator to manage drivers and the device plugin.</li>
<li><strong>Driver and CUDA version management.</strong> A mismatch between the node driver, the CUDA version in the image, and the framework causes crashes or silent failures. Mitigation: pin driver versions in node images and test the full stack in CI.</li>
<li><strong>Image sizes and pull times.</strong> AI images often run to several gigabytes, and pulling one onto a cold node can take minutes. Mitigation: pre-pull or cache images on GPU nodes and trim images with multi-stage builds.</li>
<li><strong>Autoscaling GPU nodes with slow cold starts.</strong> GPU instances take longer to launch than CPU instances and are often capacity-constrained, so a scale-up can leave pods pending. Mitigation: keep a warm GPU node or reserved capacity for latency-sensitive inference.</li>
<li><strong>Multi-tenant isolation.</strong> Teams sharing a GPU cluster can starve each other. Mitigation: use namespaces, ResourceQuotas, LimitRanges, and priority classes.</li>
<li><strong>Networking and egress costs.</strong> Moving large datasets between zones or out of a cloud adds transfer charges. Mitigation: keep data and compute in the same zone and use topology-aware scheduling.</li>
<li><strong>Storage for models and datasets.</strong> Model checkpoints and datasets need high-throughput storage that many pods can read at once. Mitigation: use shared file storage through CSI drivers (Amazon FSx for Lustre, Filestore, Azure Files) or object storage, and cache hot models on local disks.</li>
<li><strong>Skills gap.</strong> Most ML engineers are not Kubernetes operators. Mitigation: give them a platform layer that hides cluster details.</li>
</ol>
<p>On Control Plane, workloads can attach NVIDIA GPUs, and the pricing page lists models from T4 to B200. Control Plane handles scheduling, autoscaling, and rolling updates for those workloads.</p>
<h2>Where can I find the best in class container management and networking tools?</h2>
<p>The <a href="https://landscape.cncf.io">CNCF Landscape</a> is the most complete directory of cloud native projects.</p>
<p><strong>Service mesh.</strong> <a href="https://istio.io/">Istio</a> and <a href="https://linkerd.io/">Linkerd</a> add mutual TLS, traffic management, and service-to-service telemetry.</p>
<p><strong>CNI plugins.</strong> <a href="https://cilium.io/">Cilium</a> is eBPF-based and covers network policy, observability, and service mesh features. <a href="https://www.tigera.io/project-calico/">Calico</a> is widely deployed and supports network policy and BGP.</p>
<p><strong>Ingress and Gateway API.</strong> The <a href="https://gateway-api.sigs.k8s.io/">Gateway API</a> is the successor to the Ingress resource, with richer routing, traffic splitting, and role-based configuration. Implementations include Cilium, Istio, Contour, and Envoy Gateway; cloud options include the AWS Load Balancer Controller and GKE Ingress.</p>
<p><strong>Observability.</strong> <a href="https://prometheus.io/">Prometheus</a> for metrics, <a href="https://opentelemetry.io/">OpenTelemetry</a> for traces, metrics, and logs, and Grafana with Alertmanager for dashboards and alerting.</p>
<p><strong>Policy engines.</strong> <a href="https://open-policy-agent.github.io/gatekeeper/">OPA Gatekeeper</a> and <a href="https://kyverno.io/">Kyverno</a> enforce admission policies such as required labels, no privileged containers, and mandatory resource limits.</p>
<p>For a comparison of platforms that manage Kubernetes for you, see the <a href="https://controlplane.com/blog/post/best-kubernetes-management-platforms?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-production-architecture-upgrades-autoscaling-postgres">best Kubernetes management platforms</a> roundup.</p>
<h2>When not to run Kubernetes yourself, and how Control Plane fits</h2>
<p>If your engineers spend more hours on cluster upgrades, node patching, autoscaler tuning, and incident response than on your product, operating Kubernetes is costing you delivery time.</p>
<p>Control Plane is the platform for running unbreakable apps and agents. It combines any cloud, neocloud, and bare metal into what Control Plane calls a Global Virtual Cloud (GVC), a set of locations a workload runs across. It runs serverless, standard, stateful, and cron workloads on AWS, GCP, and Azure; on existing Kubernetes clusters, through Bring Your Own Kubernetes (BYOK), Control Plane’s option for connecting a cluster you already run; and on your own servers, including on premises, through Managed Kubernetes (MK8s), Control Plane’s way of turning your own servers into managed locations. Many teams run it in one cloud as well.</p>
<p>Control Plane handles Day 2 operations for you, including autoscaling, Capacity AI right-sizing, built-in observability, and security, with no Kubernetes cluster you have to operate. With MK8s, Control Plane operates the Kubernetes layer on the servers you join; with BYOK, you keep running the cluster you connected.</p>
<p>Every workload update is a rolling update: the previous version keeps serving until the new version reports ready. Readiness and liveness probes decide when a replica takes traffic and when it restarts. A workload deployed to a GVC runs active-active in every location of that GVC, and a global endpoint routes each request to the nearest healthy location. The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations. Those locations can be two regions of one cloud or locations on different providers. For the cost side of that design, see <a href="https://controlplane.com/blog/post/active-active-vs-active-passive-cost?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-production-architecture-upgrades-autoscaling-postgres">active-active vs. active-passive costs</a>.</p>
<p>Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant. Control Plane ships Terraform and Pulumi providers, so workloads fit the same infrastructure-as-code review process as the rest of your stack, plus an MCP server for AI assistants.</p>
<p>Teams weighing whether to build a platform team at all can read the <a href="https://controlplane.com/blog/post/production-grade-infrastructure-without-platform-team?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-production-architecture-upgrades-autoscaling-postgres">guide to production-grade infrastructure without a platform team</a>.</p>
<h2>FAQ</h2>
<p>Short answers to common production Kubernetes questions.</p>
<h3>What is a simple Kubernetes cluster architecture for production, including ingress and load balancer traffic flow?</h3>
<p>A managed control plane (EKS, GKE, or AKS), worker nodes across three availability zones, and an ingress controller or Gateway API implementation behind a cloud load balancer. Traffic flows from DNS to the load balancer, through the ingress or gateway where TLS usually terminates, to a Kubernetes Service, and then to pods that pass their readiness probes.</p>
<h3>How do I plan zero downtime Kubernetes upgrades and migrations while keeping AI infrastructure compliant and stable?</h3>
<p>Read the release notes and fix deprecated APIs, upgrade a staging cluster, upgrade the production control plane, then roll node pools one at a time with surge nodes and PodDisruptionBudgets. For AI workloads, validate GPU driver and CUDA compatibility before touching GPU node pools, and keep a change record for every upgrade.</p>
<h3>Which managed Kubernetes solution is best for autoscaling EC2 nodes and automatically scaling pods?</h3>
<p>On AWS, EKS with the Horizontal Pod Autoscaler for pods and Karpenter, or EKS Auto Mode, which runs Karpenter for you, for EC2 nodes. Karpenter launches right-sized instances directly instead of scaling fixed node groups. Add KEDA if workloads scale on queue depth or event streams.</p>
<h3>What are the best platforms for running stateful workloads like Postgres in containers?</h3>
<p>Managed database services (RDS, Aurora, Cloud SQL, AlloyDB, Azure Database for PostgreSQL) carry the lightest operational load. Inside Kubernetes, operators such as CloudNativePG, Zalando’s Postgres Operator, and Crunchy Data’s PGO handle replication, failover, and backup. Control Plane’s template catalog includes Patroni-based highly available and multi-location Postgres.</p>
<h3>Why is Kubernetes considered complex for AI infrastructure teams?</h3>
<p>GPU scheduling, driver and CUDA compatibility, large image pulls, slow GPU node launches, multi-tenant contention, and the gap between ML engineering and cluster operations are the main sources. Many AI teams adopt a platform layer to absorb them.</p>
<h3>How does pod autoscaling work with node autoscaling in Kubernetes?</h3>
<p>The HPA adds or removes pod replicas based on metrics. When new pods cannot be scheduled, the node autoscaler (Cluster Autoscaler or Karpenter) adds nodes, and it removes nodes that become underused after pods scale down. Configure both layers together.</p>
<h3>What are the biggest operational pain points of running Kubernetes in production?</h3>
<p>Upgrade churn across Kubernetes versions, node images, and add-ons is the most persistent. Autoscaler tuning, secrets management, network policy, observability, and incident response for stateful workloads follow. Teams without platform engineers often find Day 2 work takes more time than the initial setup.</p>
<h3>Can I run production Kubernetes workloads without managing a cluster myself?</h3>
<p>Yes. On Control Plane-managed compute in AWS, GCP, and Azure regions there is no cluster to operate, and autoscaling, rolling updates, observability, and security are built in. You can also connect existing clusters with BYOK, which you keep operating, or join your own servers with MK8s, where Control Plane operates the Kubernetes layer.</p>
<h3>How do I run Postgres with high availability across multiple cloud regions?</h3>
<p>Run a Patroni cluster with a single primary, streaming replicas in other regions, and leader-aware routing in each location, and decide whether replication to the remote regions is synchronous or asynchronous; synchronous commits across regions add a network round trip to every write. Control Plane’s Postgres Multi-Location template packages this design.</p>
<h3>Where can I find the best container management and networking tools for Kubernetes?</h3>
<p>Start with the <a href="https://landscape.cncf.io">CNCF Landscape</a>. For CNI, look at Cilium and Calico; for service mesh, Istio and Linkerd; for observability, Prometheus and OpenTelemetry; for policy, OPA Gatekeeper and Kyverno.</p>
<p><a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-production-architecture-upgrades-autoscaling-postgres">Talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a> to run your containers without operating Kubernetes.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/kubernetes-production-architecture-upgrades-autoscaling-postgres?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=kubernetes-production-architecture-upgrades-autoscaling-postgres">Control Plane blog</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Manage Kubernetes Across Multiple Clouds Without Vendor Lock-In: A Layer-by-Layer Guide]]></title><description><![CDATA[Manage Kubernetes across multiple clouds without vendor lock-in: a layer-by-layer guide to clusters, networking, identity, data, and tooling.]]></description><link>https://controlplane-eng.hashnode.dev/how-to-manage-kubernetes-across-multiple-clouds-without-vendor-lock-in-a-layer-by-layer-guide</link><guid isPermaLink="true">https://controlplane-eng.hashnode.dev/how-to-manage-kubernetes-across-multiple-clouds-without-vendor-lock-in-a-layer-by-layer-guide</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Platform Engineering ]]></category><dc:creator><![CDATA[Noah Grinstein]]></dc:creator><pubDate>Mon, 09 Nov 2026 10:50:44 GMT</pubDate><content:encoded><![CDATA[<p>Kubernetes itself is portable, so lock-in comes from the services around it: cloud-specific networking, load balancers, storage, identity, secrets, observability, managed databases, and management consoles. Keep each layer portable with Git and infrastructure as code, the same open-source components on every cloud, Gateway API, external secrets, OpenTelemetry, and databases you can run anywhere, and manage the fleet with tools that work on every cloud. Control Plane runs the same workload definition across AWS, GCP, Azure, and clusters you already run, with networking, identity, and observability built in.</p>
<p>Disclosure: Control Plane publishes this guide.</p>
<h2>TL;DR</h2>
<ul>
<li><strong>Where lock-in hides:</strong> cloud-specific CNIs, load balancer controllers, IAM bindings, secret managers, monitoring agents, managed databases, and cloud consoles.</li>
<li><strong>The portable stack:</strong> Terraform or OpenTofu for provisioning, Argo CD or Flux for GitOps, Cilium where you can run it, Gateway API for ingress, Rook-Ceph, Longhorn, or application-layer replication for data, External Secrets Operator or HashiCorp Vault for secrets, workload identity federation for cloud access, OpenTelemetry and Prometheus for observability, and PostgreSQL or MySQL you can run anywhere.</li>
<li><strong>The cost of portability:</strong> more clusters and components to operate, cross-cloud egress, and sometimes lowest-common-denominator features. A managed service is worth its lock-in when you document an exit plan.</li>
<li><strong>How Control Plane fits:</strong> Control Plane’s Global Virtual Cloud (GVC), a named set of locations across one or more clouds where each workload runs, deploys one workload definition active-active across AWS, GCP, Azure, your own Kubernetes clusters, and on-premises servers, with networking, identity, and observability built in.</li>
</ul>
<h2>Which parts of Kubernetes cause cloud lock-in?</h2>
<p>Each layer has a cloud-specific default, a portable alternative, and a trade-off.</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Cloud-specific default</th>
<th>Portable option</th>
<th>Trade-off</th>
</tr>
</thead>
<tbody><tr>
<td>Provisioning</td>
<td>Cloud console, CloudFormation, ARM or Bicep templates</td>
<td>Terraform, OpenTofu, Pulumi, or Crossplane</td>
<td>Extra tooling to maintain; new cloud features can arrive later</td>
</tr>
<tr>
<td>Deployment</td>
<td>AWS CodePipeline, Azure Pipelines, Cloud Build</td>
<td>Argo CD or Flux (GitOps)</td>
<td>You operate the GitOps controller</td>
</tr>
<tr>
<td>Networking (CNI)</td>
<td>AWS VPC CNI, Azure CNI, GKE Dataplane V2</td>
<td>Cilium where supported, with rules written as standard NetworkPolicy</td>
<td>GKE Dataplane V2 and Azure CNI Powered by Cilium are already Cilium-based; on EKS, replacing the VPC CNI changes pod IP addressing and some AWS integrations</td>
</tr>
<tr>
<td>Ingress and load balancing</td>
<td>AWS Load Balancer Controller, GKE Ingress, Application Gateway Ingress Controller</td>
<td>Gateway API implementations such as Envoy Gateway, Cilium, Istio, or NGINX Gateway Fabric</td>
<td>The Gateway still provisions a cloud load balancer, and Gateway classes and annotations differ per provider</td>
</tr>
<tr>
<td>Service-to-service security</td>
<td>Cloud-specific options or none</td>
<td>Istio, Linkerd, or Cilium Cluster Mesh</td>
<td>Operational overhead of a mesh, plus proxy latency and resource use</td>
</tr>
<tr>
<td>Storage and data</td>
<td>Provider block storage classes (EBS, Persistent Disk, Azure Disk)</td>
<td>Rook-Ceph or Longhorn, or application-layer replication, with StorageClass names set per overlay</td>
<td>Different performance and durability; self-managed storage to operate</td>
</tr>
<tr>
<td>Identity</td>
<td>IAM roles for service accounts, Workload Identity Federation for GKE, Microsoft Entra Workload ID</td>
<td>One pattern on every cloud: Kubernetes service account tokens federated to each provider, with bindings kept in per-cloud overlays</td>
<td>A separate binding per provider</td>
</tr>
<tr>
<td>Secrets</td>
<td>AWS Secrets Manager, Google Secret Manager, Azure Key Vault</td>
<td>External Secrets Operator or HashiCorp Vault</td>
<td>You run and secure the secrets layer</td>
</tr>
<tr>
<td>Observability</td>
<td>CloudWatch, Cloud Monitoring, Azure Monitor</td>
<td>Prometheus, Grafana, and OpenTelemetry</td>
<td>Self-managed collection and storage</td>
</tr>
<tr>
<td>Databases</td>
<td>Amazon Aurora, Spanner, Azure Cosmos DB</td>
<td>PostgreSQL or MySQL run portably, or a managed service with a documented migration path</td>
<td>You handle backups, replication, and upgrades</td>
</tr>
<tr>
<td>Cluster management</td>
<td>EKS, GKE, and AKS consoles</td>
<td>Rancher, Karmada, or Red Hat Advanced Cluster Management</td>
<td>Another management plane to operate and secure</td>
</tr>
</tbody></table>
<p>Each cloud-specific default lowers setup effort and raises switching cost. Decide and document where you accept lock-in, and keep an exit plan for each case.</p>
<h2>How do I manage Kubernetes across multiple clouds without vendor lock-in?</h2>
<p>Manage every cluster from Git and infrastructure as code, run the same open-source component at each layer on every cloud, route traffic globally, and test moves to a second cloud on a schedule. The ten steps below build that setup.</p>
<ol>
<li><strong>Git and a GitOps controller for every cluster.</strong> Keep manifests, Helm charts, and Kustomize overlays in Git, with one base per application and an overlay per cloud for StorageClass names, load balancer annotations, and identity bindings. Run Argo CD or Flux so each cluster reconciles from Git. See <a href="https://controlplane.com/blog/post/argo-cd-vs-flux-gitops-environments-clusters?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">Argo CD vs Flux</a>.</li>
<li><strong>Infrastructure as code for clusters and cloud resources.</strong> Define clusters, networks, IAM roles, and DNS zones in Terraform, OpenTofu, or Pulumi, with shared modules and provider-specific parameters. Crossplane manages cloud resources as Kubernetes custom resources.</li>
<li><strong>The same networking on every cluster where you can.</strong> Run Cilium where the provider allows it: GKE Dataplane V2 and Azure CNI Powered by Cilium are Cilium-based, and EKS supports Cilium in chaining or replacement mode. Write network rules as standard Kubernetes NetworkPolicy so they apply whichever CNI enforces them. For ingress, adopt Gateway API so routing definitions are the same on every cloud; the community ingress-nginx project was retired in March 2026.</li>
<li><strong>Secrets from one source.</strong> Run External Secrets Operator on every cluster against one backend, such as HashiCorp Vault, so every workload fetches secrets the same way.</li>
<li><strong>Workload identity per cloud.</strong> Configure <a href="https://controlplane.com/blog/post/workload-identity-federation?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">workload identity federation</a> so pods get cloud credentials without long-lived keys. Each cloud wires it differently: IRSA uses a service account annotation, EKS Pod Identity uses an association in the EKS API, Workload Identity Federation for GKE can grant IAM roles directly to the Kubernetes service account as a principal, with no annotation, and Microsoft Entra Workload ID on AKS uses a service account annotation plus a pod label, backed by a federated identity credential in Entra ID. Keep these bindings in per-cloud overlays; application code that uses the default cloud SDK credential chain does not change.</li>
<li><strong>One observability backend.</strong> Instrument workloads with OpenTelemetry and run Collectors on each cluster that ship metrics, logs, and traces to one backend, with Prometheus and Grafana for metrics and dashboards. Telemetry from every cloud lands in one place, with no dependency on CloudWatch, Cloud Monitoring, or Azure Monitor.</li>
<li><strong>A global traffic layer.</strong> Use external-dns with DNS-based global load balancing, or another global traffic manager, to route users to the nearest healthy cluster, with health checks per cluster and an active-active or active-passive policy per application.</li>
<li><strong>A data strategy per service.</strong> Stateless services need no cross-cloud data plan beyond the stores they call. For stateful services, run a portable database on Kubernetes with application-layer replication, use a managed database on each cloud with asynchronous replication between them, or keep the service on one cloud and document the lock-in. Weigh cross-cloud transfer cost and latency.</li>
<li><strong>Policy as code across clusters.</strong> Run OPA Gatekeeper or Kyverno on every cluster with a shared policy library in Git, enforcing Pod Security Standards, resource limits, image provenance, and network policy.</li>
<li><strong>Regular portability drills.</strong> Deploy a service to the second cloud on a schedule and verify it works, starting with non-critical workloads. Drills expose hidden dependencies on cloud-specific features.</li>
</ol>
<h2>What tools help with cloud portability and avoiding vendor lock-in?</h2>
<p>The main open-source tools are Terraform or OpenTofu, Argo CD or Flux, Cilium, Gateway API, External Secrets Operator or Vault, OpenTelemetry and Prometheus, Velero, and a fleet manager such as Rancher.</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Tools</th>
<th>What it makes portable</th>
</tr>
</thead>
<tbody><tr>
<td>Infrastructure as code</td>
<td>Terraform, OpenTofu, Pulumi, Crossplane</td>
<td>Cluster provisioning and cloud resource definitions</td>
</tr>
<tr>
<td>GitOps</td>
<td>Argo CD, Flux</td>
<td>Application deployment, configuration, and drift correction</td>
</tr>
<tr>
<td>Networking and mesh</td>
<td>Cilium (including Cluster Mesh), Calico, Istio, Linkerd</td>
<td>Network policy, service-to-service encryption, cross-cluster connectivity</td>
</tr>
<tr>
<td>Ingress</td>
<td>Gateway API implementations (Envoy Gateway, Cilium, Istio, NGINX Gateway Fabric)</td>
<td>Routing definitions</td>
</tr>
<tr>
<td>Global traffic</td>
<td>external-dns with DNS-based global load balancing</td>
<td>Routing users between clusters on different clouds</td>
</tr>
<tr>
<td>Secrets</td>
<td>External Secrets Operator, HashiCorp Vault</td>
<td>Secret storage and delivery</td>
</tr>
<tr>
<td>Backup and migration</td>
<td>Velero</td>
<td>Moving workloads and volumes between clusters</td>
</tr>
<tr>
<td>Observability and cost</td>
<td>OpenTelemetry, Prometheus, Grafana, OpenCost</td>
<td>Metrics, logs, traces, and Kubernetes cost allocation</td>
</tr>
<tr>
<td>Fleet and multi-cluster management</td>
<td>Rancher, Karmada, Red Hat Advanced Cluster Management</td>
<td>Cluster access, inventory, policy, and multi-cluster scheduling</td>
</tr>
<tr>
<td>Platforms that run workloads across clouds</td>
<td>Control Plane</td>
<td>Workload deployment, global routing, identity, and observability across AWS, GCP, Azure, Kubernetes clusters you already run, and on-premises servers from one definition</td>
</tr>
</tbody></table>
<p>GKE fleet management can also manage clusters on other clouds, but it is tied to Google Cloud. For a broader comparison, see <a href="https://controlplane.com/blog/post/best-kubernetes-management-platforms?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">the best Kubernetes management platforms</a>.</p>
<h2>Is multi-cloud a real solution to vendor lock-in?</h2>
<p>Partly. Running on two or more clouds reduces dependence on one provider’s availability and pricing, but it removes lock-in only when each layer uses portable components. Workloads that depend on Aurora on AWS and Spanner on GCP are locked in to both providers.</p>
<p>Multi-cloud also adds operational cost: more credentials, networking models, billing systems, and provider quirks. Teams that adopt it without the portable stack often carry the operating complexity of two clouds and the lock-in of each.</p>
<p>The practical approach is selective portability. Run each workload where it fits best, keep its layers portable so it can move, and accept managed-service lock-in only with a documented exit plan. See <a href="https://controlplane.com/blog/post/managed-services-vs-portability-cloud-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">managed services vs portability</a> and <a href="https://controlplane.com/blog/post/how-to-avoid-cloud-vendor-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">how to avoid cloud vendor lock-in</a>.</p>
<h2>What does portability cost?</h2>
<p>Budget for these costs when you commit to a portable stack on every cloud.</p>
<p><strong>More clusters to upgrade.</strong> Each Kubernetes upgrade is tested and rolled out to every cluster, and CNI, ingress, mesh, and policy components each have their own upgrade cycle. The work grows with the number of clusters.</p>
<p><strong>More components to operate.</strong> Running Cilium, a mesh, Vault, External Secrets Operator, OpenTelemetry Collectors, Prometheus, Grafana, and a policy engine on every cluster means monitoring, capacity planning, and incident response for each.</p>
<p><strong>Cross-cloud egress.</strong> Providers bill data leaving their network, so cross-cloud database replication, service calls, and log shipping add recurring transfer charges. Keep chatty services and their data in one cloud and track egress spend per service.</p>
<p><strong>Lowest-common-denominator features.</strong> Portable alternatives can lack the integration of managed services. A self-managed PostgreSQL cluster needs engineering effort to match a managed database’s automated backups, point-in-time recovery, and read replicas.</p>
<p><strong>When managed services are worth it.</strong> A small team may be better served by a managed database despite the dependency. Document the lock-in and the migration path (most managed PostgreSQL and MySQL services support logical or binlog replication to an external target), and revisit the decision as the team grows.</p>
<p><strong>Operating the clusters.</strong> The largest recurring labor cost is operating Kubernetes itself on every cloud: upgrades, node pools, autoscaler tuning, and patching. A platform that handles Day 2 operations across clouds removes much of it, which is the approach Control Plane takes.</p>
<h2>How Control Plane fits</h2>
<p>Control Plane is the unbreakable platform for running production workloads. It runs serverless, standard, stateful, and cron workloads natively on AWS, GCP, and Azure, VM workloads on locations joined through Control Plane’s Managed Kubernetes, and workloads on Kubernetes clusters you already run or your own machines, including on premises, active-active across regions and clouds.</p>
<p>A workload deployed to a GVC runs active-active in every location of that GVC from one definition. Locations can be Control Plane-managed regions on AWS, GCP, and Azure, Kubernetes clusters you already run joined through Control Plane’s Bring Your Own Kubernetes (BYOK), or clusters created through Control Plane’s Managed Kubernetes (MK8s). On Control Plane-managed locations there is no Kubernetes cluster to operate. MK8s runs worker nodes, load balancers, and storage in your AWS account or GCP project, or on servers you provide (documented providers include Generic, AWS, GCP, Hetzner, and Triton), while Control Plane operates the Kubernetes control plane.</p>
<p><strong>Networking.</strong> Control Plane’s built-in global endpoint routes each request to the nearest healthy location, and every workload has a deny-by-default internal firewall with mTLS between services. Control Plane runs the service mesh for you, so there is no separate mesh to install or operate.</p>
<p><strong>Identity.</strong> Control Plane’s Universal Cloud Identity gives workloads access to 600+ AWS, GCP, and Azure services with no long-lived cloud keys in your code. You connect each cloud account once through an IAM role or service-account grant, and workloads receive short-lived, least-privilege credentials at runtime, in place of the per-cluster federation setup in step 5.</p>
<p><strong>Day 2 operations.</strong> Control Plane handles autoscaling, built-in observability, and security for every workload.</p>
<p><strong>Tooling.</strong> The CLI, console, Terraform and Pulumi providers, and the Control Plane MCP server all work through the same Control Plane API, so Control Plane complements the infrastructure as code tools you already run.</p>
<p><strong>Availability, cost, and compliance.</strong> The 99.999% availability SLA applies to workloads running at least two replicas in at least two locations, and those locations can be on different providers. You pay for the CPU and memory a workload reserves, with no contracts or minimums. Customers typically cut compute costs 30 to 50 percent compared with running directly on AWS, GCP, or Azure. Control Plane is PCI DSS Level 1, SOC 2 Type II, HIPAA, and GDPR compliant.</p>
<p><strong>Portability.</strong> Workloads on Control Plane stay standard container images, and you can export Control Plane resources to Terraform with the CLI. Your containers, Git repository, and infrastructure as code remain yours, which keeps the exit path short compared with a cloud-specific managed service.</p>
<p>See <a href="https://controlplane.com/blog/post/run-same-app-aws-gcp-azure?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">how to run the same app on AWS, GCP, and Azure</a>, and for teams reconsidering Kubernetes itself, <a href="https://controlplane.com/blog/post/best-kubernetes-alternatives?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">the best Kubernetes alternatives</a>.</p>
<h2>FAQ</h2>
<p>Short answers for teams planning multi-cloud Kubernetes.</p>
<h3>How do I run Kubernetes on EKS, GKE, and AKS with one set of tools?</h3>
<p>Provision all three clusters from one Terraform or OpenTofu codebase. Register them with one Argo CD instance or install Flux on each, and keep one base of manifests with a Kustomize overlay per cloud for StorageClass names, load balancer annotations, and identity bindings. Use Gateway API for ingress, External Secrets Operator for secrets, one OpenTelemetry Collector configuration, one Kyverno or Gatekeeper policy library, and Rancher or Red Hat Advanced Cluster Management for one access and inventory layer. With Control Plane, existing EKS, GKE, and AKS clusters join one GVC through BYOK, and one workload definition deploys to all three.</p>
<h3>Is Kubernetes itself a form of lock-in?</h3>
<p>No. Kubernetes is an open-source CNCF project with a consistent API across providers. The lock-in risk comes from the cloud-specific services attached to it.</p>
<h3>Can I use managed Kubernetes (EKS, GKE, AKS) and still avoid lock-in?</h3>
<p>Yes. The API server, etcd, and scheduler are largely interchangeable across EKS, GKE, and AKS. Keep the add-ons you attach portable, using the layer table above.</p>
<h3>How do I move a Kubernetes workload from one cloud to another?</h3>
<p>Create the target cluster from your infrastructure as code, point your GitOps controller at it with that cloud’s overlay, and move data with Velero file-system backups or database-native replication; native cloud volume snapshots do not transfer between clouds. Run the workload in both places, shift traffic gradually through the global traffic layer, then retire the old deployment.</p>
<h3>Do I need a service mesh for multi-cloud Kubernetes?</h3>
<p>Not always. Cilium Cluster Mesh provides cross-cluster connectivity and network policy without a full mesh. If you need mTLS and L7 traffic policy between services, Istio or Linkerd provides both.</p>
<h3>Which multi-cloud Kubernetes cost do teams most often underestimate?</h3>
<p>Cross-cloud egress. Replication, service calls, and log shipping between clouds add transfer charges, so design data placement to minimize cross-cloud traffic and track egress per service.</p>
<h3>Does CSI make storage portable?</h3>
<p>No. CSI is the interface that EBS, Persistent Disk, and Azure Disk already use, so data stays on each cloud’s disks. Use portable storage such as Rook-Ceph or Longhorn, or replicate at the application layer, and move data between clouds with Velero or database replication.</p>
<h3>Can Control Plane replace my multi-cluster management tooling?</h3>
<p>For running workloads, yes. Control Plane deploys, networks, secures, and observes workloads across clouds from one API and console. Control Plane-managed locations and MK8s clusters need no control plane work from your team. Clusters joined through BYOK run Control Plane workloads in the same GVC, and your team keeps operating those clusters.</p>
<h3>What is the minimum multi-cloud setup to reduce lock-in risk?</h3>
<p>Run primary workloads on one cloud and keep a validated environment on a second cloud where you can deploy the same workloads on demand. Keep manifests in GitOps, keep the second cloud’s infrastructure as code current, and run portability drills on a fixed schedule. Active-active can come later.</p>
<p>To run the same workloads across AWS, GCP, Azure, and your own infrastructure without having to operate the clusters yourself, <a href="https://controlplane.com/requestdemo?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">talk to the Control Plane team</a> or <a href="https://console.cpln.io/signup">sign up free</a>.</p>
<hr />
<p><em>Originally published on the <a href="https://controlplane.com/blog/post/manage-kubernetes-multiple-clouds-without-vendor-lock-in?utm_source=hashnode&amp;utm_medium=syndication&amp;utm_campaign=manage-kubernetes-multiple-clouds-without-vendor-lock-in">Control Plane blog</a>.</em></p>
]]></content:encoded></item></channel></rss>