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.
Disclosure: Control Plane publishes this guide.
TL;DR
Multi-cloud deployment is a three-layer problem, and a typical stack takes one tool from each layer.
- Runtime (runs your app across clouds): 1. Control Plane, 2. Red Hat OpenShift, 3. Qovery, 4. Kubernetes on each cloud (EKS, GKE, AKS).
- Delivery and release (gets your code deployed): 1. Argo CD, 2. Flux, 3. Spinnaker, 4. Harness, 5. GitHub Actions and GitLab CI/CD.
- Infrastructure provisioning (creates the cloud resources): 1. Terraform and OpenTofu, 2. Pulumi, 3. Crossplane, 4. Spacelift.
- Main decision: operate a Kubernetes cluster on every cloud and engineer failover yourself, or let a platform run the app active-active across clouds.
What do you need to deploy one application to AWS, GCP, and Azure?
Three layers must be in place before a request reaches your application on all three clouds.
Provisioning 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.
Build and delivery 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.
Runtime 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.
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.
| Layer | What it does | Typical tools | What still differs per cloud |
|---|---|---|---|
| Provisioning | Creates cloud infrastructure | Terraform, OpenTofu, Pulumi, Crossplane | APIs, resource names, IAM policies |
| Build and delivery | Builds, tests, and ships artifacts | GitHub Actions, GitLab CI/CD, Jenkins, Azure Pipelines, Harness, Argo CD, Flux, Helm, Kustomize | Registries, credentials, deployment targets |
| Runtime | Runs the application and serves traffic | Control Plane, OpenShift, Qovery, EKS/GKE/AKS, per-cloud serverless containers | Networking, identity, autoscaling, observability |
| Cross-cutting | Identity, secrets, observability, global traffic | Workload identity federation, External Secrets Operator, Vault or OpenBao, OpenTelemetry, cert-manager, global DNS and load balancing | Most of it |
How we evaluated
Each tool was assessed against seven criteria for deploying one application to AWS, GCP, and Azure at the same time.
- Works natively on all three clouds, with documented, maintained integrations for each.
- What you still operate, such as Kubernetes clusters, CI runners, or the tool’s own control plane.
- One definition or per-cloud configuration, since fewer definitions mean less drift.
- Identity and secrets across clouds, for example a workload on GCP calling Amazon S3.
- Observability across clouds, with logs, metrics, and traces in one place.
- Failover between clouds, whether built in, possible with configuration, or left to you.
- Lock-in, through proprietary formats, vendor APIs, or operational dependencies.
Platforms that run your application across clouds
These tools sit at the runtime layer. They run your containers and route traffic on AWS, GCP, and Azure.
Control Plane
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.
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.
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.
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 Control Plane Kubernetes Operator lets Argo CD manage Control Plane resources from Git.
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.
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.
Best for: 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.
Limitations: 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.
Red Hat OpenShift
Red Hat OpenShift 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.
What it handles: a standardized cluster platform, developer tooling, an operator framework, and enterprise support.
What you still operate: 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.
Best for: enterprises that want a supported, standardized Kubernetes distribution across clouds.
Limitations: Red Hat Advanced Cluster Management covers multicluster management, but cross-cloud traffic routing and failover still need additional tooling.
Qovery
Qovery 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.
What it handles: environment provisioning, deployment automation, developer self-service, and preview environments.
What you still operate: the cloud accounts, their cloud costs and governance, and any existing clusters you connect.
Best for: teams that want a developer-friendly deployment experience on Kubernetes in their own cloud accounts.
Limitations: each cloud runs its own cluster, so global traffic routing and cross-cloud failover are separate concerns to plan.
Kubernetes on each cloud (EKS, GKE, AKS)
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.
What it handles: container orchestration, scheduling, and the Kubernetes API on each cloud.
What you still operate: 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 the best Kubernetes management platforms.
Best for: teams with deep Kubernetes expertise and platform engineers who want control over every layer.
Limitations: 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.
Delivery and release tools
These tools take code from your repository and deploy it to your runtime.
Argo CD
Argo CD 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.
What it handles: reconciliation of Helm charts, Kustomize overlays, and plain manifests from Git, multi-cluster sync through ApplicationSets, health status, and rollback.
What you still operate: the Argo CD installation, its access to target clusters, and the Git repositories that define desired state.
Best for: teams already on Kubernetes across clouds that want pull-based GitOps with drift correction.
Limitations: 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.
Flux
Flux is a GitOps toolkit for Kubernetes that reconciles cluster state from Git, Helm, and OCI artifact sources, with multi-tenancy support.
What it handles: GitOps reconciliation, Helm release management, image automation, and multi-tenant deployments.
What you still operate: Flux controllers in each cluster and their source configuration.
Best for: teams that prefer a lightweight, composable GitOps operator in each cluster.
Limitations: 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.
Spinnaker
Spinnaker 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.
What it handles: multi-cloud deployment pipelines, progressive delivery, and approval workflows.
What you still operate: Spinnaker itself, a multi-service system that needs its own infrastructure and engineers to upgrade and maintain it.
Best for: large organizations with complex release processes across clouds and clusters.
Limitations: high operational overhead for smaller teams.
Harness
Harness 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.
What it handles: pipelines, deployment verification, feature flags, and governance policies.
What you still operate: pipeline configuration and integrations, plus the Harness installation itself if you choose the Self-Managed Enterprise Edition instead of SaaS.
Best for: teams that want a commercial, full-featured delivery platform with built-in governance.
Limitations: pipeline definitions are Harness-specific.
GitHub Actions and GitLab CI/CD
GitHub Actions and GitLab CI/CD 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.
What they handle: building, testing, packaging, and triggering deployments.
What you still operate: workflow files, plus self-hosted runners when you need private network access.
Best for: teams whose code lives on GitHub or GitLab.
Limitations: they provide environments and deployment approvals, but multi-cloud rollout logic must be scripted or handed to a delivery tool or runtime platform.
Infrastructure provisioning tools
These tools create and manage the cloud resources your applications depend on.
Terraform and OpenTofu
Terraform is a widely used declarative provisioning tool, with providers for AWS, GCP, Azure, and many other services. OpenTofu is an open-source fork of Terraform under the Linux Foundation that works as a drop-in replacement for existing Terraform configurations.
What they handle: declarative provisioning with a plan-and-apply workflow, state management, and a large provider ecosystem.
What you still operate: state storage and the pipelines that run plans and applies (or HCP Terraform, which hosts both), and modules for each cloud.
Best for: any team provisioning infrastructure across clouds; this is the default starting point.
Limitations: Kubernetes and Helm providers can apply manifests, but Terraform is not designed for ongoing application rollouts, health checks, or traffic routing.
Pulumi
Pulumi 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.
What it handles: infrastructure in familiar programming languages, with testing, abstraction, and reuse.
What you still operate: pipelines and shared components, plus state storage if you use a self-managed backend.
Best for: developer-centric teams that want to write infrastructure in a general-purpose programming language.
Limitations: 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.
Crossplane
Crossplane exposes cloud resources as Kubernetes custom resources and continuously reconciles them, so teams provision a database or bucket with YAML through the Kubernetes API.
What it handles: Kubernetes-native provisioning with continuous reconciliation, and composition of resources into higher-level abstractions.
What you still operate: a Kubernetes cluster running Crossplane and its providers for each cloud, or a hosted control plane from Upbound.
Best for: platform teams building Kubernetes-based internal developer platforms.
Limitations: it requires a Kubernetes cluster and familiarity with operators and custom resources.
Spacelift
Spacelift orchestrates runs for Terraform, OpenTofu, Terragrunt, Pulumi, AWS CloudFormation, Kubernetes, and Ansible, with policy enforcement, drift detection, approvals, and audit trails.
What it handles: governance and collaboration around IaC runs.
What you still operate: stack and policy configuration.
Best for: teams that need governance on top of existing IaC. HCP Terraform, env0, Scalr, and Atlantis cover similar ground.
Limitations: it orchestrates IaC runs and depends on Terraform, OpenTofu, Pulumi, or another supported tool to provision resources.
For a full reference stack across these layers, see how to automate app deployment with IaC, CI/CD, and GitOps.
Comparison table
| Tool | Layer | Runs your app on all three clouds | You operate Kubernetes | One definition for every cloud | Cross-cloud identity built in | Best for |
|---|---|---|---|---|---|---|
| Control Plane | Runtime | Yes | Not required | Yes | Yes (UCI) | Running apps across clouds without operating Kubernetes |
| Red Hat OpenShift | Runtime | Partial (cluster per cloud) | Operated with Red Hat SREs on managed offerings; yes if self-managed | No | No | Standardized enterprise Kubernetes |
| Qovery | Runtime | Partial (cluster per cloud) | Managed by Qovery, or yours if connected | No | No | Developer self-service in your accounts |
| EKS / GKE / AKS | Runtime | Partial (cluster per cloud) | Yes | No | No | Full control |
| ECS on Fargate / Cloud Run / Azure Container Apps | Runtime | Partial (separate service per cloud) | No | No | No | Serverless containers on one cloud |
| Argo CD | Delivery | No | Yes | Partial | No | GitOps for Kubernetes |
| Flux | Delivery | No | Yes | Partial | No | Lightweight GitOps |
| Spinnaker | Delivery | No | Depends on targets | Partial | No | Enterprise progressive delivery |
| Harness | Delivery | No | Depends on targets | Partial | No | Commercial delivery platform |
| GitHub Actions / GitLab CI/CD / Jenkins / Azure Pipelines | Delivery | No | No | No | No | CI tied to source control |
| Terraform / OpenTofu | Provisioning | No | No | Partial (per-cloud modules) | No | Multi-cloud infrastructure |
| Pulumi | Provisioning | No | No | Partial | No | IaC in programming languages |
| Crossplane | Provisioning | No | Yes | Partial | No | Kubernetes-native IaC |
| Spacelift | Provisioning | No | No | No | No | IaC governance |
Which stack fits your team?
Teams already on Kubernetes everywhere
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.
Teams that do not want to operate Kubernetes
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 how to consolidate multiple clouds into one platform.
Enterprises standardizing on a supported Kubernetes distribution
OpenShift gives a consistent platform with enterprise support. You still run a cluster per cloud; pair it with Terraform and Argo CD.
Teams that need failover between clouds
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.
Small platform teams
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.
How do I run the same app across AWS, GCP, and Azure without rewriting it?
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.
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 how to run the same app on AWS, GCP, and Azure, and for the trade-offs of provider-specific services, see managed services vs. portability.
FAQ
These answers assume containerized applications.
What are the best tools for deploying applications across AWS, GCP, and Azure?
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.
Is Terraform enough to deploy apps across clouds?
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.
Do I need Kubernetes to deploy to AWS, GCP, and Azure?
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.
What is the difference between multi-cloud deployment and multi-cloud management?
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.
How do I handle identity and secrets across three clouds?
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.
Can I use Argo CD with Control Plane?
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.
How fast can traffic fail over between clouds?
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.
Does Control Plane replace my CI/CD pipeline?
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.
Can I run stateful workloads across multiple clouds?
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.
What compliance certifications does Control Plane hold?
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.
To deploy one application across AWS, GCP, and Azure from a single definition, talk to the Control Plane team or sign up free.
Originally published on the Control Plane blog.
