GKE Setup: Production-Ready Cluster on GCP

As load grows, a manually assembled cluster starts slowing release rollouts and fails at the worst possible moment. We set up a managed cloud cluster turnkey: we migrate workloads, enable autoscaling, and configure fault tolerance. After launch, releases ship several times faster, and downtime during failures is reduced.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Setting Up GKE in GCP: What Breaks as Load Grows

The default cluster configuration is designed for steady traffic: nodes of one size, autoscaling with an upper bound, resources without explicit requests. As long as load grows gradually, the scheme holds.

A peak spike several times over flips the picture — the scheduler lacks free capacity, new application replicas sit pending, and some requests are rejected before scaling has time to take effect.

The first class of failures is resource bottlenecks in the cluster. Without set requests and limits, the scheduler packs pods more densely than they can handle: as consumption grows, eviction begins, and the most loaded node drags its neighbors down with it.

If the pool is capped from above or made up of preemptible VMs, the autoscaler simply cannot add capacity — pods remain pending until manual intervention.

The second class is updates and scheduled maintenance.

A rollout without a disruption budget takes several instances out of service at once, and application fault tolerance rests on good faith; when a node is drained, open connections are broken, and without proper readiness checks traffic can reach an instance that has not yet warmed up.

The third class is manual changes in production. An “here and now” fix saves the moment but diverges from the infrastructure description: the next run either overwrites it or fails on a conflict, and the incident returns.

That is why below we look at how setting up GKE in GCP becomes a reproducible configuration — with pools split by different load profiles, eviction policies, and repository-driven management.

What Changes After Moving Workloads to a Managed Cluster

A managed cluster changes the nature of day-to-day work with workloads. Release rollout stops being an event with a window and on-call duty: new instances come up one by one, are checked for readiness, and only then receive traffic, while old ones are shut down gradually. Rollout time drops to minutes, and rolling back to the previous build takes just as long.

Service recovery time is no longer measured in hours of manual diagnostics. Health checks remove an instance that stopped responding from load balancing, and automatic recovery brings up a replacement without an on-call engineer.

While the restart is in progress, load is redistributed among the remaining replicas, and most often the user does not notice the failure.

A separate topic is the classes of failures that stop reaching the user: instance crash, node degradation, resource shortage under peak, volume loss.

They are covered by restart policies, limits, and autoscaling, so the share of incidents visible from outside drops severalfold — most are contained within the environment.

Self-healing of the environment rests not on magic but on rules defined in advance: how many replicas to keep, at what load to scale out, what is considered unhealthy, and after how long to drain a node.

Without these rules, a managed cluster behaves like an ordinary set of servers, and all discipline falls on the on-call engineer.

The effect can be checked with a short set of metrics: rollout time, recovery time, share of failures that reached the user, number of manual interventions per week. If at least two are not moving, the rules are only formal.

Comparison of GKE Cluster Operation Modes

The cluster operation mode is chosen not by team size but by where failure and access boundaries should run.

A single environment with namespace-based separation gives dense node utilization and a shared resource pool, but also a shared risk zone: an error in rights or configuration is immediately visible to all environments. Splitting into several environments removes this, but adds idle nodes and parallel maintenance.

Option When it fits Limitations
One cluster, environments by namespaces Small team, single release cycle, high node utilization matters Shared management domain: an error in rights is visible to everyone, and there is no strict separation between test and production environments
Cluster per team Several independent streams, different release schedules, isolation of rights and quotas needed Some nodes sit idle, and updates and oversight are maintained in parallel for each environment
Cluster per environment (test, pre-prod, prod) Different access policies and independent release rollback More places where configuration must be kept in a single state
Hybrid: some services on their own servers There are systems that cannot be moved due to security requirements or hardware coupling A connecting layer and a unified access scheme are needed — part of the automation works on both sides

In practice, the choice is rarely binary: production and pre-prod are separated into dedicated environments, while test environments live together with a shared pool.

We start with an inventory of services, team isolation requirements, and acceptable downtime — and only then lock down the scheme so it does not have to be reworked on a running system.

Work Stages: From Discovery to Handover to Operations

The order of stages is strict: each next one relies on an artifact from the previous one. The most expensive mistake is skipped discovery — a scheme assembled without accounting for real networks, quotas, and rights later has to be redone on a running environment.

  1. Audit of the current environment. We analyze what already exists: services, network ranges, access rules, project quotas, manual operations in releases. The output is an environment map and a list of bottlenecks with risk assessment.

  2. Scheme design. We determine node composition and their distribution across zones, rights boundaries by namespaces, network policies, the secrets and external address scheme.

    We document each decision with rationale: which failure it covers and what will happen to the service if a zone goes down.

  3. Deployment and configuration. We build the cluster on GKE, enable autoscaling, managed updates, metric and log collection, backup, and image retention policy. Configuration lives as code: changes go through review rather than being made by hand in the console.

  4. Failure testing. We shut down a node and an entire zone, break an update, fill a disk, limit outbound traffic. We look at what the system recovers on its own, where an on-call engineer is needed, and how long it takes. Each scenario gets a report and a configuration fix.

  5. Training the customer's team. We hand over the scheme and walk through typical incidents: how to read alerts, how to roll back a release, how to expand resources, where the boundary of our and your responsibility lies. The team is left with working instructions, not a verbal retelling.

  6. Commissioning. We move the workload in stages with metric monitoring, compare the result against acceptance criteria, and stay in touch during the support period — until your side's first independent release.

Handover Artifacts: Schemes, Policies, Procedures

The cluster is handed over not as access to someone else's panel but as a set of configurations, schemes, and procedures by which your team operates it independently. We lock down this set at acceptance: no artifact means the work section is not closed. Below is what remains with the customer.

  • Configuration description — a reproducible set of manifests and parameter values: deployment from scratch does not turn into recovery from memory.
  • Network and segment scheme — which subnets are allocated, what is exposed externally, what is available only inside the environment, and how environments are separated from each other.
  • Access policies — through which channel the cluster is accessed, how authenticity is confirmed, where the login log is stored, and who reads it.
  • Roles for teams — a role-based model by namespaces: development does not change shared settings, the on-call engineer sees what is needed, and access is granted and revoked upon request.
  • Update procedure — windows and order for updating the control plane and node pools, post-rollout checks, and conditions for rolling back to the previous version.
  • Response procedure — which events are considered emergencies, who is notified, who acts first, and in what order the others join in.
  • Environment documentation — a map of services and their dependencies, a list of external endpoints, and the procedure for the loss of a zone.
  • Instructions for standard operations — adding a node, rotating access credentials, restoring from backup, and actions when resources are exhausted.

Case Study: How Downtime and Release Rollout Time Were Reduced

The product environment lived on manually assembled virtual machines: configurations diverged between environments, and recovery after a failure depended on which engineer was on call.

The environment went down 3–4 times a week, recovery took from 40 to 90 minutes, and a release was shipped once every two to three weeks and only in an agreed window.

What Was Changed

The workload was moved to a managed Google Kubernetes Engine cluster: nodes were split into pools for services and for background tasks so that heavy jobs would not evict user traffic.

Resource requests and limits were set, readiness probes — traffic reaches only a warmed-up process, and autoscaling by load.

Rollout was switched to a canary scheme: the new version receives part of the traffic, metrics are compared against baselines, then either full cutover or automatic rollback.

The Outcome

Emergency restarts dropped from 3–4 per week to one case per quarter, recovery — from 40–90 minutes to 6 minutes: the pod is recreated from the declarative description instead of being repaired manually.

The release cycle accelerated to two or three rollouts per week, and the share of releases with rollback fell from one fifth to isolated cases.

At handover to operations, the customer's team received a description of node pools, image update policies, dashboards and alerts for key metrics, and instructions for the on-call engineer.

Infrastructure changes go through a repository with review — the configuration of environments no longer diverges.

How Does a Managed Cluster Differ from a Manually Assembled One?

The difference is not in who presses the button to create the cluster but in where the responsibility boundary lies. In the managed option, the provider maintains the control plane: its availability, state storage, backups, certificate rotation, and update order.

The team is left with workloads — manifests, policies, node pools, network rules, and access rights.

In a manually assembled cluster, all of this rests on the team, plus what simply does not exist in the managed option: control plane consistency, regular state snapshots and recovery drills, component update order, and operating system patches on nodes. There is no “default” there: someone configures each element and then maintains it.

Hidden work is usually underestimated.

Updating node images with eviction of workloads, disruption budgets, system agents on every node, internal DNS, storage drivers, certificate issuance and renewal — the provider covers some of this itself, but everything that faces your workload remains yours. Automation does not eliminate these tasks; it only removes part of the routine.

Guarantee boundaries should also be discussed in advance. The provider is responsible for control plane availability but not for your release, data integrity, or configuration.

A single application instance, an incorrect disruption budget, or a missing resource limit is a failure in your zone, and guarantees do not cover it.

Therefore, maintaining the environment is not just the cluster: who is on call, where the notification arrives, who rolls back an unsuccessful update, and how the branch update plan and maintenance windows live.

The managed option does not eliminate operations but shifts them: from “stand up and repair” to “configure correctly and do not break.” We work out where this boundary lies in your case.

Technical Concerns Before Starting Work

Concerns before setting up GKE in GCP are usually the same: the environment is already running, it is scary to break it, and the responsibility boundary after handover is blurred. We answer to the point — with specifics on each item.

The cluster already handles the load — will the migration cost downtime?

We bring up the target environment in parallel with the current one: we transfer manifests, network policies, and storage state, and test on a copy of traffic.

Switching happens at the external load balancer by shifting weight, so rollback takes exactly the same amount — returning the weight back.

How do we separate team access inside the cluster?

Each team gets its own namespace, a role with the minimum necessary rights, and a resource quota. One team's application cannot see another's objects, and all changes remain in the audit log: you can see who changed the configuration and when.

Who is responsible for the cluster after handover?

We hand over not only access credentials: network schemes, update policy, rollback procedure, on-call instructions, and a walkthrough with your team. We can keep support with us, but the environment's operability does not depend on our presence.

We separately document migration risks: incompatible add-ons, project limits, storage zone affinity, and external service dependencies. Each item has a rollback plan and a point after which we move on.

Let's Discuss the Task and Come Back with an Estimate and Plan

Discussing the task starts without lengthy preparation: it is enough to describe what service we are placing, what loads we expect, and what fault-tolerance requirements exist.

Then we analyze the current environment and come back with a work plan — stages, scope of changes, roles, and timelines. We go through the plan point by point: edits to scope and order are made before the start, not during the process.

What will be included in the input data:

  • a diagram of the current environment: where services run, what has already been moved to the cloud, and what dependencies remain outside it;
  • load profile: peak requests, daily and weekly rhythm, seasonal spikes;
  • availability requirements: acceptable downtime, data rollback depth, and whether geo-distribution is needed;
  • constraints: data retention rules, security requirements, agreed change windows;
  • responsible people on your side and the set of access credentials, who makes infrastructure decisions;
  • a list of services that must survive the migration without downtime.

At the first step, we compare this with the state of the infrastructure and provide a plan with readiness criteria for each stage.

Setting up Google Kubernetes Engine for production workloads is broken down into clear steps: what we do, what we check, and how we confirm the result. The scope estimate is calculated from your requirements — if part of the tasks is already closed, we will not duplicate it. Describe the task, and we will come back with an estimate and a plan.