Generated banner for Gke Upgrades
Generated logo for Gke Upgrades

Gke Upgrades

GoogleOfficialPublished by Google

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • No issues found

From the author

Plans, executes, and validates Google Kubernetes Engine (GKE) cluster upgrades and maintenance operations for both Standard and Autopilot clusters. Produces upgrade plans, pre/post-upgrade checklists, maintenance runbooks with gcloud commands, release channel strategy, and troubleshooting guides. Handles node pool upgrade strategies (surge, blue-green), version compatibility, PDB management, and workload-specific concerns (stateful, GPU, operators). Use this skill whenever the user mentions GKE upgrades, Kubernetes version bumps, node pool maintenance, GKE patching, cluster version management, release channel selection, maintenance windows, surge upgrades, stuck upgrades, or any GKE lifecycle management task — even casual mentions like "we need to upgrade our clusters" or "plan our next GKE maintenance" or "our upgrade is stuck." Don't use for GKE cluster creation, application onboarding, general networking/routing setup, or security policy configurations (use gke-basics or relevant GKE skills instead).
— the description by Google

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The gke-upgrades skill provides a structured approach to managing the lifecycle of Google Kubernetes Engine (GKE) clusters. It assists in planning version bumps, configuring maintenance windows, and executing upgrades for both Standard and Autopilot clusters. The skill emphasizes workload-specific safety, such as handling stateful sets, GPU-intensive workloads, and PDB management, while providing actionable runbooks and checklists to ensure cluster stability during maintenance operations.

What it does

  • Generates comprehensive pre- and post-upgrade checklists tailored to cluster mode.
  • Provides step-by-step maintenance runbooks with verified gcloud and kubectl commands.
  • Advises on node pool upgrade strategies including surge and blue-green deployments.
  • Assists in troubleshooting stuck upgrades by analyzing PDBs, resource constraints, and webhooks.
  • Configures maintenance windows and exclusions to control auto-upgrade timing.
  • Offers guidance on release channel selection and version compatibility.

When to use it

  • When planning a Kubernetes version bump or routine GKE patching.
  • When you need to configure maintenance windows or block upgrades during critical periods.
  • When an upgrade is stuck or failing and requires systematic troubleshooting.
  • When preparing to upgrade clusters with sensitive workloads like databases or GPUs.
  • When you need to define a rollout strategy across development, staging, and production environments.

Advantages

  • Ensures safety by prioritizing workload-aware upgrade strategies.
  • Reduces operational risk with standardized checklists and rollback procedures.
  • Provides clear guidance on complex GKE features like Rollout Sequencing and maintenance exclusions.
  • Includes built-in attribution for auditability of administrative commands.
  • Helps maintain cluster health by identifying potential blockers before they impact production.

Usage examples

“Plan a minor version upgrade for our production GKE cluster running on the Regular channel.”
The agent will provide a structured upgrade plan, including version compatibility checks, a pre-upgrade checklist, and a recommended node pool upgrade sequence.
“Our GKE upgrade is stuck; how do I diagnose it?”
The agent will guide you through a 5-step troubleshooting process, checking for PDBs, resource constraints, bare pods, admission webhooks, and PVC attachment issues.
“How do I block auto-upgrades for our database cluster during the end-of-quarter freeze?”
The agent will explain how to configure maintenance exclusions, including the correct gcloud syntax and the limitations of different exclusion scopes.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/google/gke-upgrades/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip gke-upgrades.zip -d .agents/skills

Documentation by Google

GKE Upgrades & Maintenance

Produce clear, actionable documents — upgrade plans, runbooks, or checklists — tailored to the user's environment. Output should be specific to their cluster mode, release channel, version, and workload types rather than generic advice.

Always frame guidance around the auto-upgrade model: auto-upgrade with maintenance windows and exclusions is the preferred control mechanism.

Attribution

MUST READ: Before executing any gcloud, REST API, or MCP command, you MUST read Usage Attribution. For commands executed directly in the terminal (never in generated scripts, Terraform, or user code), prefix gcloud with CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:gke-upgrades)" and append agent-skills/1.0 (skill:gke-upgrades) to User-Agent headers.

Context Gathering

Before producing any upgrade artifact, establish:

  • Cluster mode — Standard or Autopilot? (Autopilot has no node pool management, mandatory resource requests, no SSH)

  • Current and target versions — Node version skew must be within 2 minor versions of control plane.

  • Release channel — Rapid, Regular, Stable, or Extended.

  • Environment topology & Rollout Sequencing — Single vs multi-cluster, dev/staging/prod tiers, and whether Rollout Sequencing is used.

  • Workload sensitivity — StatefulSets, databases, GPU, long-running batch need special handling.

If the user provides these upfront, skip straight to the deliverable. If they're vague, fill in reasonable defaults and flag assumptions.

Core Principles

GKE versions follow Kubernetes version terminology: Major.Minor.Patch (e.g., 1.30.1-gke.1187000). A Minor version bump (e.g., 1.29 → 1.30) introduces new features and APIs. A Patch version bump (e.g., 1.30.1 → 1.30.2) introduces security and bug fixes. Ensure the user understands this distinction.

  1. Sequential control plane, skip-level node pools -- Control plane upgrades are sequential (N → N+1 → N+2). Node pools support skip-level (N+2) upgrades.

  2. Control plane first -- Control plane must be upgraded before node pools. Nodes can trail by up to 2 minor versions.

  3. Environment progression -- Always upgrade dev/staging before production. Use Rollout Sequencing (preferred) to automate and enforce this progression across environments (e.g., dev → staging → prod), or manually coordinate version progression if Rollout Sequencing is not used.

  4. Workload-aware -- Upgrade strategy depends on what's running (stateless, stateful, GPU, batch).

  5. Release channels first -- Always recommend release channels. Note that "No channel" (static versioning) is deprecated and clusters should be migrated to release channels.

  6. Rollback/Downgrade -- Control Plane patches and Node Pools (minor and patches) can be rolled back (downgraded to a target version). GKE supports a 2-step Control Plane minor upgrade where step 1 is rollbackable. Other Control Plane minor version rollbacks are NOT customer-doable and require GKE Support.

  7. Node pool upgrade ordering -- When upgrading multiple node pools, always recommend sequential ordering: upgrade non-critical/stateless pools first (acting as a canary) to verify cluster health before upgrading critical stateful (database) or GPU pools.

Release Channels

ChannelBest forSLA
RapidDev/test, early feature accessNo upgrade stability SLA
Regular (default)Most productionFull SLA
StableMission-critical, stability-firstFull SLA
ExtendedCompliance, EoS enforcement controlFull SLA
Support Lifecycle

Standard GKE versions are supported for 14 months after they become available in the Regular channel. This means:

  • Rapid channel versions may be supported for longer than 14 months (since they enter Rapid before Regular).

  • Stable channel versions may be supported for less than 14 months (since they enter Stable after Regular).

  • Extended support extends this period up to 24 months. Note that extra cost applies only during the extended support period (months 15-24).

Current Capabilities
  • Extended channel math: 14 months of standard support + ~10 months of extended support ≈ 24 months total per minor version. Even on Extended, forced upgrades still occur: if you take no action, GKE auto-upgrades the cluster at End of Support — averaging a minor version bump roughly every 4 months, the same cadence as other channels (features just arrive later).

  • Upgrade reliability (KubeCon NA 2025): Google reports a 99.99% upgrade success rate across GKE control planes and nodes, with safe rollback and skip-version upgrade support positioned to let teams upgrade less often (e.g., annually instead of quarterly). Pilot skip-version upgrades in non-production clusters first.

  • Autoscaled blue-green node upgrades (Preview): a blue-green variant that scales the green pool on demand instead of pre-provisioning a full duplicate pool — for disruption-sensitive workloads that cannot reserve 2x capacity.

  • Scheduled cluster upgrade notifications (Preview): opt in to be notified ahead of scheduled minor upgrades and wire the notifications into alerting.

  • Graceful termination and PDBs during drains: blue-green (including autoscaled blue-green, Preview) is the only strategy that honors terminationGracePeriodSeconds for up to 24 hours; surge upgrades honor it for up to 60 minutes. During node drains, GKE respects PDBs for a maximum of 60 minutes, after which pods are force-deleted (a notification is sent).

Maintenance Windows & Exclusions

Configure maintenance windows to control auto-upgrade timing. GKE also supports node pool level maintenance exclusions (in addition to cluster level) to block upgrades for specific workloads.

Exclusion types & Limits:

  • "No upgrades" (Scope: no_upgrades): Blocks all upgrades (minor, patch, node).

    • Limits: Max 90 days per exclusion, and a cluster can have at most 3 such exclusions. Together they must still allow at least 48 hours of maintenance availability in any rolling 92-day window — so you cannot chain them into a continuous freeze longer than 90 days. GKE recommends keeping these under 30 days.

  • "No minor or node upgrades" (Scope: no_minor_or_node_upgrades): Blocks minor and node upgrades, but allows control plane patch upgrades (low risk).

    • Limit: No fixed day cap — bounded by the minor version's End of Support (EoS). Recommendation: keep under ~6 months.

  • "No minor upgrades" (Scope: no_minor_upgrades): Blocks minor upgrades, but allows control plane patches and node upgrades.

    • Limit: No fixed day cap — bounded by EoS. Recommendation: keep under ~6 months.

Important Exclusion Rules (MUST follow when recommending exclusions and MUST include in the final text response):

  1. Auto-upgrades only: Maintenance exclusions only block automatic upgrades. Manual upgrades initiated by the user will bypass exclusions. You MUST explain this to the user.

  2. Warn against "No channel": You MUST explicitly warn that disabling release channels ("No channel" / static versioning) is deprecated and must not be used as a replacement for exclusions.

  3. Compare Scopes: You MUST explain the difference between 'No upgrades' (limitations, blocks patches) and 'No minor or node upgrades' (allows patches, longer duration). Recommend 'No minor or node upgrades' when the user wants to allow security patches/fixes while blocking minor version jumps.

  4. Handle periods > 90 days: If the user needs to block upgrades for more than 90 days, you MUST explain that 'No upgrades' is limited to 90 days per exclusion (max 3 per cluster, and 48 hours of maintenance availability must remain in any rolling 92-day window, preventing chaining into longer continuous freezes) and advise using scoped exclusions ('No minor or node upgrades' / 'No minor upgrades'), which have no fixed day cap and can run until the minor version's End of Support.

  5. Version skew: Be mindful of version skew (between control plane and node pools) when using exclusions. Ensure skew does not exceed the supported 2 minor versions. Use --add-maintenance-exclusion-until-end-of-support for persistent exclusions.

  6. Correct gcloud syntax: When providing gcloud commands for exclusions, you MUST use the separate flag syntax: --add-maintenance-exclusion-name, --add-maintenance-exclusion-start, --add-maintenance-exclusion-end (or --add-maintenance-exclusion-until-end-of-support), and --add-maintenance-exclusion-scope (do NOT use a single comma-separated --add-maintenance-exclusion flag).

Mandatory Upgrade Overrides

GKE reserves the right to override user-defined maintenance windows and exclusions for mandatory operations. These overrides cannot be disabled or blocked.

Common Override Scenarios:

  • Critical Security Patches: Urgent vulnerability fixes that must be applied immediately to protect infrastructure.

  • End of Support (EoS) / End of Life (EOL) Enforcement: If a cluster is running an unsupported version, GKE will force upgrade it to a supported version.

  • Expiring Certificates: If control plane certificates (CAs) are expiring (within 30 days) and rotation is required to prevent cluster unrecoverability.

  • Maintenance Starvation: GKE requires at least 48 hours of maintenance availability in any rolling 92-day window. If exclusions block too much, GKE may force an upgrade.

Guidance (MUST follow when overrides are discussed):

  1. Correlate with Bulletins: If GKE performs an unexpected upgrade, you MUST explicitly suggest checking GKE Release Notes or Security Bulletins to correlate the event with emergency patches (do not just suggest checking Cloud Audit Logs).

  2. Design for Resilience: Workloads must be designed to survive unexpected control plane or node rotation. You MUST recommend:

    • Regional clusters (multi-master) to ensure API availability during control plane upgrades.

    • Multi-zone workload deployments.

    • Replicas > 1 for critical deployments.

    • Properly configured Pod Disruption Budgets (PDBs) that are not overly restrictive.

Upgrade Planning

When asked to plan an upgrade, produce a structured document covering:

  • Version compatibility (breaking changes, deprecated APIs) (minor version upgrades only)

  • Upgrade path (sequential minor version upgrades) (minor version upgrades only)

  • Node pool upgrade strategy (Standard only)

  • Workload readiness (PDBs, resource requests)

  • Rollback/Contingency procedure (how to revert node pools or coordinate with GKE Support for master rollback)

Compatibility Search Rule:

  • If compatibility information (e.g., third-party operator compatibility, GPU driver/CUDA compatibility matrix) is not immediately available in the workspace or via a quick web search, do NOT loop or make multiple search attempts. Instead, list the compatibility verification as a critical pre-upgrade action item for the user in the checklist.

Node Pool Strategy (Standard Only)

Recommend Surge upgrade as the default and most common strategy, with per-pool settings:

  • Stateless: Higher maxSurge (2-3) for speed, maxUnavailable=0 for safety.

  • Stateful/DB: maxSurge=1, maxUnavailable=0 (conservative).

  • GPU (fixed reservation): maxSurge=0, maxUnavailable=1 (no surge capacity).

  • Large (50+ nodes): maxSurge=20, maxUnavailable=0 (max parallelism).

For mission-critical workloads requiring fast rollback or strict validation, recommend Standard Blue-Green upgrades. Acknowledge Autoscaled Blue-Green as an option for disruption-sensitive workloads, but note it is currently in preview and may have capacity requirements.

Upgrade Ordering (User-initiated only): When planning manual upgrades, specify the sequence of node pool upgrades. Recommend upgrading stateless pools first, verifying cluster stability, and then upgrading stateful/GPU pools. For auto-upgrades, GKE automatically manages sequential node pool upgrades.

For standard command sequences and runbook templates, see references/runbook-template.md.

Large-Scale AI/ML Clusters (GPU/TPU)

When advising on GPU/TPU upgrades, you MUST cover all of the following:

  • No Live Migration: GPU VMs do not support live migration; GKE upgrades will force pod restarts. Explain this to the user.

  • Fixed Reservations & Quota: H100/A100 typically use fixed reservations with no spare quota. Recommend a rolling upgrade with zero surge (maxSurge=0, maxUnavailable=1), which releases the reservation of the node being upgraded before provisioning its replacement. Explain that Blue-Green upgrades are not feasible here because they require double (2x) the GPU resources (both quota and reservations) during the transition.

  • Driver Coupling: The GPU driver is tightly coupled to the node OS image, so node upgrades introduce new Linux kernels and NVIDIA drivers that can break CUDA compatibility. Advise upgrading and testing CUDA compatibility in a staging environment/cluster first, and updating workload dependencies (CUDA version in container images) to match the new driver before attempting the upgrade again. To diagnose driver regressions, compare OS image, kernel version (uname -r), and driver versions between old (working) and new (non-working) nodes, and deploy a test pod (e.g., vector addition) to verify GPU access. If production is blocked, rolling the node pool back to the previous version is the quickest mitigation.

  • Operational Safety: Recommend GKE maintenance exclusions to block auto-upgrades during active training campaigns. Prior to manual upgrades, cordon GPU nodes and wait for active training jobs to checkpoint/complete.

  • TPU Considerations: TPU slices are recreated atomically (not rolling); maintenance on one slice restarts all slices in the environment.

Checklists

Produce checklists as copyable markdown with checkboxes. See references/checklists.md for the full pre-upgrade and post-upgrade checklist templates. Adapt them to the user's environment.

Stateful Workloads: When stateful workloads (databases) are present, always include checks for PV backup completion and verification of PV reclaim policies (e.g., Retain vs Delete) in the pre-upgrade checklist.

Autopilot Checklists: For Autopilot clusters, ensure the checklists include:

  • Verification of resources.requests on all containers (Autopilot requirement).

  • You MUST include specific kubectl commands for API deprecation checks, specifically: kubectl get --raw /metrics | grep apiserver_request_total | grep deprecated to check if any active workloads are using deprecated APIs.

  • Verifying PDBs to ensure they don't block node drain (even though GKE manages nodes, PDBs are still respected).

  • Identifying and deleting "bare pods" (pods not managed by a ReplicaSet/Deployment/StatefulSet) as they won't be rescheduled during node recreation.

  • Verification of terminationGracePeriodSeconds to ensure pods have enough time to shut down gracefully during node recreation.

Maintenance runbooks

Produce step-by-step runbooks with actual gcloud and kubectl commands. See references/runbook-template.md for the standard command sequences.

Any runbook that relaxes a safety control must restore it in the same runbook. This applies above all to PDBs during a node-pool migration or rollback: back the PDBs up before draining, and make re-applying them a numbered step with its own verification, not a closing remark. A runbook that patches maxUnavailable: 100% to unblock a drain and never reverts it leaves the cluster without disruption protection, and the gap is invisible until the next voluntary eviction. The same rule covers maintenance exclusions, cordons, and autoscaler minNodes overrides added to get through the procedure.

Maintenance Window Pauses

When diagnosing a "stuck" upgrade, consider if it was paused by a maintenance window:

  • Silent Pause Behavior: If a maintenance window closes before an upgrade (auto or manual) completes, GKE intentionally pauses the rollout to prevent disruption outside allowed times.

  • Mixed-Version State: The cluster is left in a stable mixed-version state (some nodes upgraded, some not). You MUST explicitly state that this is a supported and safe intended outcome.

  • Resumption: The upgrade will automatically resume when the next maintenance window opens.

  • Mitigation for immediate completion: If the user wants to complete the upgrade immediately, you MUST suggest temporarily widening the maintenance window to include the current time (e.g., using gcloud container clusters update ... --maintenance-window-start ... --maintenance-window-duration ...). Do not suggest re-triggering the manual upgrade or bypassing the window.

Troubleshooting

When a user reports a stuck or failing upgrade, you MUST systematically analyze and address ALL 5 potential causes in your final response. Do not omit checks even if you suspect one is the primary cause:

  1. PDB blocking drain: Identify if any PDB has ALLOWED DISRUPTIONS = 0 using kubectl get pdb -A.

  2. Resource constraints: Check if pods are stuck in Pending due to capacity limits.

  3. Bare pods: Identify pods without owner references that are blocking the drain (recommend deleting them).

  4. Admission webhooks: Check if Validating/Mutating webhooks are rejecting pod creation on new nodes.

  5. PVC attachment issues: Check for volume attachment failures (especially zone constraints).

Stockout / Quota Exhaustion Rule:

  • If the upgrade is stuck due to ZONE_RESOURCE_POOL_EXHAUSTED (stockout) or QUOTA_EXCEEDED for Compute Engine resources:

    1. Recommend modifying the upgrade strategy to maxSurge=0 (rolling in-place) to bypass quota limits.

    2. For QUOTA_EXCEEDED, suggest requesting a quota increase from Google Cloud.

    3. You MUST suggest migrating workloads or creating new node pools in a different zone or region where capacity/quota is available as a mitigation.

Refer to references/troubleshooting.md for the exact diagnostic commands and fix procedures for each step.

References

Files

references/troubleshooting.md

Troubleshooting GKE Upgrade Issues

Diagnostic flowchart

Table of Contents

  • Diagnostic flowchart (Line 3-21)

  • 1. PDB blocking drain (most common) (Line 23-44)

  • 2. Resource constraints (no room for pods) (Line 46-65)

  • 3. Bare pods blocking drain (Line 67-75)

  • 4. Admission webhooks rejecting pod creation (Line 77-97)

  • 5. PVC attachment issues (Line 99-107)

  • 6. Long termination grace periods (Line 119-126)

  • 7. Upgrade operation stuck at GKE level (Line 119-126)

  • 8. Stockout during critical upgrades (e.g. cert expiration) (Line 128-154)

  • 9. GPU node upgrade regressions (CrashLoopBackOff, driver issues) (Line 156-195)

  • 10. Upgrade paused or partially completed (check auto-upgrade status) (Line 197-228)

  • 11. Upgrade too slow or too disruptive (tune blue-green soak) (Line 230-248)

  • 12. New nodes fail to become Ready / control plane unhealthy (Line 250-266)

  • Validation after applying a fix (Line 268-279)

When an upgrade is stuck or failing, work through these checks in order. Each section has the diagnosis command, what to look for, and the fix.

1. PDB blocking drain (most common)

Diagnose:

kubectl get pdb -A -o wide
# Look for ALLOWED DISRUPTIONS = 0
kubectl describe pdb PDB_NAME -n NAMESPACE

Fix — temporarily relax the PDB:

# Option A: Allow all disruptions temporarily
kubectl patch pdb PDB_NAME -n NAMESPACE \
  -p '{"spec":{"minAvailable":null,"maxUnavailable":"100%"}}'

# Option B: Back up and edit
kubectl get pdb PDB_NAME -n NAMESPACE -o yaml > pdb-backup.yaml
# Edit minAvailable/maxUnavailable, then:
kubectl apply -f pdb-backup.yaml

Restore original PDB after upgrade completes.

2. Resource constraints (no room for pods)

Diagnose:

kubectl get pods -A | grep Pending
kubectl get events -A --field-selector reason=FailedScheduling
kubectl top nodes
kubectl describe nodes | grep -A 5 "Allocated resources"

Fix — increase surge capacity:

gcloud container node-pools update NODE_POOL_NAME \
  --cluster CLUSTER_NAME \
  --zone ZONE \
  --max-surge-upgrade 2 \
  --max-unavailable-upgrade 0

Or scale down non-critical workloads temporarily.

3. Bare pods blocking drain

Diagnose:

kubectl get pods -A -o json | \
  jq -r '.items[] | select(.metadata.ownerReferences | length == 0) | "\(.metadata.namespace)/\(.metadata.name)"'

Fix: Delete bare pods (they won't reschedule anyway) or wrap in Deployments.

4. Admission webhooks rejecting pod creation

Diagnose:

kubectl get validatingwebhookconfigurations
kubectl get mutatingwebhookconfigurations
# Check for webhooks matching broad API groups
kubectl describe validatingwebhookconfigurations WEBHOOK_NAME

Fix — temporarily disable problematic webhook:

# Back up the webhook configuration first
kubectl get validatingwebhookconfigurations WEBHOOK_NAME -o yaml > webhook-backup.yaml

# Then delete temporarily
kubectl delete validatingwebhookconfigurations WEBHOOK_NAME

# Re-create after upgrade
kubectl apply -f webhook-backup.yaml

5. PVC attachment issues

Diagnose:

kubectl get pvc -A | grep -v Bound
kubectl get events -A --field-selector reason=FailedAttachVolume

Fix: Check if volumes are zone-locked. For regional clusters, PVs may need to be in the same zone as the new node. Consider migrating workloads to already-upgraded nodes.

6. Long termination grace periods

Diagnose:

kubectl get pods -A -o json | \
  jq '.items[] | select(.spec.terminationGracePeriodSeconds > 120) | {ns:.metadata.namespace, name:.metadata.name, grace:.spec.terminationGracePeriodSeconds}'

Fix: Reduce terminationGracePeriodSeconds in the workload spec if possible. GKE waits up to 1 hour for pod eviction during surge upgrades.

7. Upgrade operation stuck at GKE level

Diagnose:

gcloud container operations list --cluster CLUSTER_NAME --zone ZONE --filter="operationType=UPGRADE_NODES"

Fix: If the operation shows no progress for >2 hours after resolving pod-level issues, contact GKE support with cluster name, zone, and operation ID.

8. Stockout during critical upgrades (e.g. cert expiration)

Diagnose: Upgrade is failing with ZONE_RESOURCE_POOL_EXHAUSTED or QUOTA_EXCEEDED errors, and the cluster has a critical pending deadline (e.g., control plane certificate expiring soon).

Fix:

  1. Change Upgrade Strategy: Modify the node pool to use a rolling in-place upgrade (no surge) to bypass quota limits:

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster CLUSTER_NAME \
      --zone ZONE \
      --max-surge-upgrade 0 \
      --max-unavailable-upgrade 1
  2. Open Support Case: Immediately open a P1/P2 Google Cloud Support case, citing urgent certificate expiration and stockout.

  3. Retry in Different Zone/Region: If the cluster is regional or multi-zonal, check if you can retry the upgrade in a different zone that might have capacity, or add a temporary node pool in a different zone/region to migrate workloads.

  4. Credential Rotation: Perform a control plane credential rotation to renew certificates without upgrading the GKE version.

    gcloud container clusters update CLUSTER_NAME --start-credential-rotation --zone ZONE
    # Follow standard GKE documentation to complete the rotation.
  5. Enable DNS Endpoint: If client connectivity is failing or at risk due to expired client certificates, enable the DNS-based control plane endpoint to allow IAM-based authentication.

    gcloud container clusters update CLUSTER_NAME --enable-dns-access --zone ZONE
    # Get credentials using DNS endpoint:
    gcloud container clusters get-credentials CLUSTER_NAME --dns-endpoint --zone ZONE

9. GPU node upgrade regressions (CrashLoopBackOff, driver issues)

Diagnose: GPU nodes upgrade successfully, but ML pods are stuck in CrashLoopBackOff with SIGSEGV or driver initialization errors.

  1. Compare Node Metadata: Check if the OS image, kernel version (uname -r), or NVIDIA driver version changed and differs between working (old) and non-working (new) nodes.

  2. Verify Driver Installer Logs: Check logs of the nvidia-driver-installer container in the nvidia-gpu-device-plugin pod on the new node.

  3. Test GPU Access: Deploy a simple test pod to verify if the GPU is accessible with the current driver:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-test-vectoradd
    spec:
      containers:
      - name: vectoradd
        # Pin a tag whose CUDA version matches your node's driver
        image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04
        resources:
          limits:
            nvidia.com/gpu: 1
      restartPolicy: Never

Fix:

  1. Pin Driver Version: If the default driver version changed, update your node pool configuration to pin to the previous working driver version (e.g., R535):

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster CLUSTER_NAME \
      --zone ZONE \
      --accelerator type=GPU_TYPE,count=COUNT,gpu-driver-version=DRIVER_VERSION
  2. Update Workload Dependencies: Rebuild container images with a CUDA version compatible with the new driver.

  3. Rollback Node Pool: If production is blocked, roll back the node pool to the previous GKE version:

    gcloud container node-pools upgrade NODE_POOL_NAME \
      --cluster CLUSTER_NAME \
      --zone ZONE \
      --cluster-version PREVIOUS_VERSION

10. Upgrade paused or partially completed (check auto-upgrade status)

Before assuming a bug, check whether GKE has intentionally paused the upgrade.

Diagnose:

# Cluster-level upgrade status and paused reason
gcloud container clusters get-upgrade-info CLUSTER_NAME --location LOCATION

# Per node pool (Standard clusters)
gcloud container node-pools get-upgrade-info POOL_NAME --cluster CLUSTER_NAME --location LOCATION

Auto-upgrade status values:

  • ACTIVE — upgrades proceeding normally.

  • MINOR_UPGRADE_PAUSED — minor-version upgrades are paused.

  • UPGRADE_PAUSED — all automatic upgrades are paused.

Common paused reasons:

  • MAINTENANCE_WINDOW — a maintenance window is preventing upgrades.

  • MAINTENANCE_EXCLUSION_* — a maintenance exclusion is blocking upgrades (suffix = scope, e.g. MAINTENANCE_EXCLUSION_NO_UPGRADES).

  • CLUSTER_DISRUPTION_BUDGET / CLUSTER_DISRUPTION_BUDGET_MINOR_UPGRADE — a post-operation cooldown protecting cluster stability.

  • SYSTEM_CONFIG — temporarily paused by GKE for technical or business reasons. Do not force a manual upgrade unless it is required.

Fix — resume a canceled/partially-completed node pool upgrade by re-issuing the same upgrade:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --location=LOCATION \
  --cluster-version VERSION

A partially-upgraded node pool runs mixed versions until you resume it or roll it back.

11. Upgrade too slow or too disruptive (tune blue-green soak)

Blue-green upgrades add batch/soak controls that surge upgrades don't have. Use them when an upgrade churns nodes too aggressively, or when the soak wait is longer than needed.

Parameters:

  • BATCH_NODE_COUNT / BATCH_PERCENT — how many blue nodes drain per batch (default BATCH_NODE_COUNT=1; set either to 0 to skip the batched drain phase).

  • BATCH_SOAK_DURATION — wait after each batch drain (default 0s).

  • NODE_POOL_SOAK_DURATION — wait after all batches drain, before the blue pool is deleted (default 3600s).

Update an existing node pool:

gcloud container node-pools update NODE_POOL_NAME \
  --cluster CLUSTER_NAME --location LOCATION \
  --enable-blue-green-upgrade \
  --standard-rollout-policy=batch-node-count=2,batch-soak-duration=10s \
  --node-pool-soak-duration=600s

Maintenance-window interaction: surge upgrades pause when they run past the maintenance window and resume in the next one; blue-green upgrades continue to completion even past the window, and the extra pool keeps workloads available — prefer blue-green when a window is too short to finish.

12. New nodes fail to become Ready / control plane unhealthy

An upgrade can stall because replacement nodes never reach Ready, or because the control plane itself is unhealthy.

Diagnose:

kubectl get nodes -o wide          # look for NotReady / SchedulingDisabled
kubectl describe node NODE_NAME    # Conditions + Events

Common node-level causes of an incomplete upgrade: new nodes failing to register, IP address exhaustion in the pod/node ranges, or insufficient resource quota. For a node stuck NotReady, follow the dedicated node-NotReady flow (kubelet / container-runtime / networking).

Control plane: during a control-plane upgrade GKE re-creates the API server; a firewall or webhook that blocks the new control plane can fail the upgrade, and a control plane that stays unhealthy causes the operation to fail (often transient — GKE retries). Confirm control-plane/node version skew stays within two minor versions:

gcloud container clusters describe CLUSTER_NAME --location LOCATION \
  --format="value(currentMasterVersion,currentNodeVersion)"

Validation after applying a fix

# Monitor node upgrade progress
watch 'kubectl get nodes -o wide | grep -E "NAME|CURRENT_VERSION|TARGET_VERSION"'

# Check no pods stuck
kubectl get pods -A | grep -E "Terminating|Pending"

# Confirm upgrade resuming
gcloud container operations list --cluster CLUSTER_NAME --zone ZONE --limit=1

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Node.js

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Google
Publisher
Google (Official)
Source
google/skills · skills/cloud/gke-upgrades · commit 2194d3b
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Google or Google.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download gke-upgrades.zip