NEBUACLOUD
DashboardpricingLabsNebuacloud for BusinessDocs

How Do You Run GitOps Across Multiple Kubernetes Clusters?

Learn how to design GitOps workflows for multi-cluster Kubernetes environments, including repository structure, promotion, drift control, and tenant isolation.

GitOps is easy to understand in a single cluster: store desired state in Git, let a controller reconcile it, and keep the live cluster aligned with the repository. The model becomes more difficult once the same platform must operate across production, staging, regional, edge, and tenant-specific Kubernetes clusters.

At that point, the problem is no longer just deployment. It becomes a question of consistency, isolation, promotion, drift detection, and operational ownership across many clusters with different requirements. Teams need a GitOps model that scales without turning into duplicated manifests, manual exceptions, or fragile pipeline logic.

This article explains the technical challenges of multi-cluster GitOps, the standard patterns teams use today, their limitations, and a practical way to operate Kubernetes and k3s clusters with less friction.

The Core Problem: GitOps Works, Until the Cluster Count Grows

GitOps is built around a simple contract:

  1. Desired state lives in Git.
  2. A controller compares Git to the live cluster.
  3. Drift is corrected automatically.

That contract works well when one team manages one or two clusters. It becomes harder when each cluster has different network boundaries, storage classes, IAM integrations, release windows, or tenancy rules.

What changes from cluster to cluster?

Even when the application is identical, the runtime context often is not. Common differences include:

  • Region-specific ingress and DNS settings
  • Different node pools, taints, and tolerations
  • Distinct storage backends
  • Per-environment secrets and identity providers
  • Policy differences between dev, staging, and production
  • Different rollback expectations or maintenance windows
  • Separate tenant boundaries for shared infrastructure

In other words, multi-cluster GitOps is a configuration management problem as much as it is a deployment problem.

Why this creates operational pain

Without a clear model, teams usually end up with one or more of these failure modes:

  • Copy-pasted manifests that drift over time
  • Environment branches that diverge in subtle ways
  • Manual kubectl fixes that bypass Git
  • Unclear promotion paths from staging to production
  • Difficulty proving which version is running where

The result is familiar to most platform teams: the GitOps controller still works, but the overall system becomes harder to trust.

Conceptual comparison showing how multi-cluster GitOps becomes unreliable when each cluster accumulates its own exceptions instead of following a cleaner shared model

Technical Explanation: Where Multi-Cluster GitOps Breaks Down

The hardest part of multi-cluster GitOps is not syncing YAML. It is separating reusable intent from cluster-specific intent.

1. Shared application state

This is the part that should remain mostly identical across clusters:

  • Deployment spec
  • Service definition
  • Container image tags
  • Probes and resource requests
  • Application-level configuration defaults

2. Cluster-specific overlays

This is the part that should vary intentionally:

  • External endpoints
  • Storage class names
  • Node selectors
  • Resource quotas
  • Secret references
  • Replica counts

3. Reconciliation policy

This is the operational logic that determines how changes land:

  • Which cluster gets updated first
  • Whether promotion is automatic or manual
  • How failures are detected
  • Whether the system can roll back or pause reconciliation

If these concerns are mixed together, the repo becomes difficult to review and even harder to audit.

Current Approaches Teams Use Today

Most teams use one of a few standard GitOps patterns when they start managing more than one Kubernetes cluster.

Repository per cluster

Each cluster gets its own repository or top-level folder.

This model is simple and easy to reason about. It also makes access control straightforward, because each cluster can be managed independently.

The downside is duplication. Shared workloads and platform components often get copied into many places, and changes must be repeated cluster by cluster.

Shared base with overlays

Another common approach is a shared base layer with Kustomize overlays, Helm values, or environment-specific patches.

This reduces duplication and keeps the application definition centralized. It is a good fit when many clusters run the same stack with only small variations.

The challenge is keeping overlays readable. As the number of clusters grows, overlay logic can become difficult to trace.

One GitOps controller per cluster

Many teams install Argo CD or Flux into each cluster and let each controller reconcile its own path in Git.

This is a strong operational pattern because reconciliation happens locally. If one cluster is unavailable, it does not block the others.

But it also means the platform team now manages multiple controllers, multiple sets of credentials, and multiple operational dashboards.

Central promotion pipeline

Some organizations keep a central platform workflow that promotes changes from dev to staging to production through Git updates, approvals, and checks.

This is often used in regulated environments because it creates a clear audit trail. The tradeoff is that promotion logic can become more complex than the application itself.

Limitations of the Standard Patterns

The usual GitOps patterns are valid, but they do not eliminate the platform burden.

Repository sprawl

Multi-cluster environments often grow into many repos, branches, overlays, and exceptions. Engineers spend time searching for where a value is defined instead of reviewing the actual change.

Drift still happens

GitOps reduces drift, but it does not remove the human factor. Emergency fixes, manual overrides, and cluster-specific hot patches still happen unless there is a strong operating discipline.

Promotion becomes brittle

Promoting one version across several clusters sounds simple until policy, approval, and availability requirements differ by environment. Then the process starts to depend on custom automation and handoffs.

Multi-tenancy gets complicated

Shared clusters make isolation harder. Namespace boundaries help, but they are not always enough for teams that need stronger separation between tenants or internal customers.

Operational overhead increases linearly

Every added cluster brings more controllers, credentials, alerts, policies, and reconciliation state. Without a centralized operating model, the platform cost rises quickly.

A Better Model for Multi-Cluster GitOps

A scalable multi-cluster GitOps design usually works best when it separates three layers.

Technical diagram separating application intent, cluster intent, and governance for multi-cluster GitOps

Application intent

This layer defines the workload itself:

  • Container image
  • Ports and probes
  • Deployment strategy
  • Resource requests and limits
  • Config defaults

This should be reusable across clusters.

Cluster intent

This layer describes the environment the workload is targeting:

  • Region
  • Storage class
  • Node placement
  • Ingress configuration
  • Policy constraints
  • Tenant boundaries

This should stay explicit and narrow.

Governance and reconciliation

This layer handles how changes move through the system:

  • Validation before merge
  • Promotion rules
  • Drift detection
  • Rollback behavior
  • Audit and visibility

When these layers are separated cleanly, GitOps becomes easier to operate at scale.

Where NebuaCloud Fits Naturally

For teams that need to manage Kubernetes and k3s clusters as a coordinated fleet, NebuaCloud can serve as the operational layer around that GitOps model.

NebuaCloud is focused on Kubernetes management, GitOps workflows, multi-tenant infrastructure, and simplified deployment of production workloads. In a multi-cluster setup, that combination matters because the platform problems are usually around visibility, isolation, and repeatability rather than the GitOps controller itself.

What that looks like in practice

NebuaCloud can help teams:

  • Manage multiple Kubernetes and k3s clusters from a consistent control layer
  • Apply GitOps workflows across environments with less manual wiring
  • Keep tenant or team boundaries isolated in shared infrastructure
  • Reduce duplicated platform setup across clusters
  • Surface operational signals that help detect drift, unhealthy rollouts, or reconciliation issues

The point is not to replace GitOps. The point is to make GitOps easier to run across many clusters without turning every environment into a separate operational project.

Practical Workflow: Promoting an App Across Three Clusters

Consider a service that runs in:

  • dev
  • staging
  • prod

The team also has two production clusters in different regions for availability and latency.

Desired flow

  1. A developer merges a change to the application repository.
  2. CI builds a container image and pushes it to the registry.
  3. Git updates the dev overlay with the new image tag.
  4. The GitOps controller syncs dev automatically.
  5. After validation, the same version is promoted to staging.
  6. Once approved, production updates are applied to both regional clusters.
  7. Each cluster reconciles locally, and observability confirms the rollout.
Technical flow showing Git change, promotion, GitOps target tracking, cluster reconciliation, and operational feedback across multiple clusters

Example repository layout

apps/
  payments/
    base/
      deployment.yaml
      service.yaml
      hpa.yaml
    overlays/
      dev/
        values.yaml
      staging/
        values.yaml
      prod-us-east/
        values.yaml
      prod-us-west/
        values.yaml
clusters/
  dev/
    apps.yaml
  staging/
    apps.yaml
  prod-us-east/
    apps.yaml
  prod-us-west/
    apps.yaml

This kind of structure keeps shared logic in one place while making cluster-specific settings visible and reviewable.

Where the workflow still needs help

Even a clean GitOps layout still needs answers to questions like:

  • Who can promote changes across clusters?
  • How are secrets injected safely?
  • How is cluster health checked before promotion?
  • What happens if a production cluster falls out of sync?
  • How is tenant isolation enforced when many teams share the same platform?

That is where platform automation matters.

GitOps, k3s, and Multi-Tenant Infrastructure

Multi-cluster environments often include a mix of upstream Kubernetes and k3s clusters.

Why k3s appears in these architectures

k3s is common when teams need Kubernetes in lightweight or distributed environments:

  • Edge deployments
  • Regional workloads
  • Internal tools
  • Development clusters
  • Small production footprints

The challenge is that smaller clusters still need the same operational discipline as larger ones. GitOps helps, but only if the platform treats k3s as a first-class cluster type instead of a special case.

Why tenant isolation matters

If multiple teams or customers share infrastructure, namespace-only separation may not be enough. Teams often need stronger boundaries for:

  • RBAC
  • Resource quotas
  • Policy enforcement
  • Network segmentation
  • Independent cluster views

Virtual-cluster-style isolation can help here because it gives each tenant a cleaner logical environment while the platform team retains control of the underlying physical cluster.

Conclusion

GitOps scales well when the environment is simple. As soon as you manage multiple Kubernetes clusters, the real challenge shifts to structure: how to separate shared application intent from cluster-specific settings, how to promote safely, and how to keep drift and tenancy under control.

The standard patterns work, but they often leave teams with too much duplicated logic and too many moving parts. A stronger multi-cluster model separates application state, cluster state, and governance, then centralizes the operational layer around them.

That is the role NebuaCloud can play: a platform for managing Kubernetes and k3s clusters, coordinating GitOps workflows, supporting multi-tenant infrastructure, and reducing the friction of running production workloads across many clusters.

Try it with NebuaCloud -> deploy in minutes

Current Availability

Note: NebuaCloud currently provides real building blocks around this topic, including multi-cluster management, active cluster context, GitOps-backed application deployment, revision visibility, cluster reconcile operations, and GitOps governance endpoints.

The platform does not yet clearly expose every multi-cluster promotion, approval, and governance path described in this article as a complete end-to-end product workflow for all teams and all environments.

GitOps here remains a Git-based reconciliation model. Any AI-assisted or AIOps-style analysis should be treated as a separate optional layer around telemetry, not as part of the multi-cluster GitOps control path.

This article therefore combines current capabilities with platform-direction guidance. Where the workflow goes beyond what is fully exposed today, it should be understood as an operational model NebuaCloud is moving toward rather than a fully finished feature set already available everywhere.


Profile picture

Written with love by Nebuacloud, Private Cloud Infrastructure Automation Platform.