In this lesson, you will learn how to leverage Git tagging strategies to orchestrate the promotion of verified application versions across multiple Kubernetes clusters.
The Logic of Git-Based Promotion
In a multi-cluster GitOps environment, we treat our Git repository as the single source of truth. Rather than pushing code directly to clusters, we use Git tags to represent a "blessed" version of an application that is ready for promotion. A typical workflow involves two distinct environments: staging and production, each managed by a separate sync process (like Argo CD or Flux).
By tagging a commit in your repository—for example, v1.2.0—you trigger a CI pipeline that updates the production environment’s manifest folder to point to that specific tag. This creates a clear, auditable trail of what is running where.
Illustrating the Promotion Flow
Imagine your Git repository structure separates clusters by directory:
/clusters
/staging
kustomization.yaml # points to tag: v1.1.9-rc
/production
kustomization.yaml # points to tag: v1.1.8
When QA validates v1.2.0 in staging, your CI/CD pipeline runs a promotion job. This job performs a git commit and git push that updates the production/kustomization.yaml to reference v1.2.0.
The automation logic looks like this:
- Validation: The pipeline confirms the tag
v1.2.0exists and passed integration tests. - Update: The pipeline modifies the
productiondirectory overlay to reference the new image tag. - Synchronization: The GitOps controller detects the drift between the Git repository and the
productioncluster and automatically applies the change.
By using tags, you move away from mutable references like latest, which are dangerous for multi-cluster environments, and instead ensure that every promotion is an intentional, versioned release. This decoupling allows you to roll forward or backward simply by updating the reference in the target environment’s configuration, ensuring consistency across your fleet.
Key Takeaway: Automating multi-cluster promotion relies on treating Git tags as immutable markers of release readiness, allowing GitOps controllers to synchronize environment-specific manifests to a validated state.