
Learn how GKE decouples binary rollouts from API finalization to safely test and roll back Kubernetes minor version upgrades.
title: Two-step control plane upgrades in GKE: How minor version rollbacks work under the hood published: true description: Learn how GKE decouples binary rollouts from API finalization to safely test and roll back Kubernetes minor version upgrades. tags: kubernetes, ai, gke, googlecloud cover_image: https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/2jcp2qyptueri8fhzcp7.png
Kubernetes control plane minor version upgrades have historically been an all-or-nothing proposition. In standard Kubernetes clusters, upgrading a control plane from one minor version to the next—such as moving from 1.33 to 1.34—commits changes to storage schemas immediately. If an unexpected regression emerges after upgrading the API server, rolling back to the previous minor version was impossible without restoring etcd snapshots.
To eliminate this operational risk, the GKE team drove upstream contributions in Kubernetes Enhancement Proposal KEP-4330 (Compatibility Versions) and introduced two-step control plane upgrades. Following public preview validation with enterprise customers, this capability is now Generally Available (GA) across all GKE release channels.
In this article, I will explain how two-step upgrades work under the hood, how automated rollouts leverage canary analysis, and how to manage rollback-safe upgrades using the Google Cloud CLI and Terraform.
In Kubernetes, minor version releases introduce storage schema changes, deprecated API removals, and modified controller behaviors. When the kube-apiserver binary starts on a newer minor version, it writes resources using newer internal schemas.
Because earlier binary versions cannot parse data stored in newer schemas, Kubernetes prohibits control plane downgrades across minor versions. If an organization encountered an issue after upgrading, platform operators had to either run the degraded control plane or rebuild the cluster.
Two-step upgrades decouple binary execution from API capability enablement. By separating the upgrade into two distinct phases, GKE provides an observation period (also known as a soak window) during which operators or automated systems can monitor cluster behavior and roll back the control plane to the previous minor version with zero data loss.
The foundation of two-step upgrades is running a newer control plane binary in an emulated compatibility mode.
When a two-step upgrade begins, GKE advances the control plane through two sequential stages:
During the soak period, worker node pools cannot be upgraded beyond the emulated version to preserve Kubernetes version skew rules.
For clusters configured for auto-upgrades, two-step upgrades are enabled out of the box with zero manual configuration required. The GKE rollout engine, known as Control Plane Rollout Service (CPRS), orchestrates the staged lifecycle natively:
This validation framework has helped GKE control plane upgrades achieve a 99.999% (five nines) rolling 30-day success rate across the global fleet.
If your team manages upgrades manually, you can execute two-step upgrades using the Google Cloud CLI or Terraform.
To initiate a two-step upgrade with a custom soak duration using gcloud:
gcloud beta container clusters upgrade my-cluster \
--location=us-central1 \
--cluster-version=1.34.1-gke.1829001 \
--control-plane-soak-duration=48h \
--master
The --control-plane-soak-duration flag defines the rollback-safe window, supporting values from 6 hours up to 7 days (e.g., 48h or 2d).
For infrastructure-as-code workflows, Terraform includes official support for managing two-step control plane upgrades declaratively by specifying the target version and soak parameters in your GKE cluster resources.
While the cluster is soaking in emulated mode, you can inspect the active rollback state using the CLI:
gcloud container clusters describe my-cluster \
--location=us-central1 \
--format="yaml(rollbackSafeUpgradeStatus)"
The output includes a rollbackSafeUpgradeStatus block with the target binary version, emulated version, remaining soak time, and previousVersion string.
If your monitoring tools uncover a regression during the soak window, you can roll back the control plane to the previous minor patch:
gcloud container clusters upgrade my-cluster \
--location=us-central1 \
--cluster-version=1.33.5-gke.1080000 \
--master
Because the control plane ran in emulated mode, no new data formats were written to etcd. GKE downgrades the control plane binary back to the specified version without risking data corruption.
If your validation tests pass and you want to unlock new minor version features immediately without waiting for the soak duration to expire, you can finalize the upgrade manually:
gcloud beta container clusters clusters complete-control-plane-upgrade my-cluster \
--location=us-central1
Once executed, GKE promotes the emulated version to match the binary version, completing the upgrade.
When planning two-step control plane upgrades, keep the following operational rules in mind:
Two-step control plane upgrades eliminate the risk of irreversible minor version updates in Kubernetes, providing platform engineers with automated safety and an emergency rollback mechanism.
To learn more about configuring two-step upgrades, read the official GKE cluster upgrade documentation and explore KEP-4330: Compatibility Versions.
flutterDiscover how CubitSignalMixin and BlocSignalMixin allow any existing Flutter controller, domain repository, or enterprise class to gain full reactive state container capabilities without occupying its single inheritance slot.
googleappsscriptBreaking the Limits of GAS with Direct Cloud-to-Cloud Streaming in Persistent Linux...
flutterDiscover why Flutter state management is no longer an all-or-nothing choice. Explore how BlocSignal, Classic BLoC, and Riverpod now operate as first-class bidirectional peers at the Grand Central State Terminal.
kubernetesLearn how to troubleshoot and audit GKE Vertical Pod Autoscaler actions with structured decision logs in Cloud Logging.
kubernetesLearn how GKE VerticalPodAutoscaler (VPA) CPU Startup Boost cuts JVM cold starts and eliminates ongoing CPU waste using in-place Pod resizing.
aiIf you've built a website with AI recently, there is a good chance it looks familiar. Maybe you have...
Workflows from the Neura Market marketplace related to this Stable Diffusion resource