Rolling Update: What Breaks When Rolling Out a New Version
The most common failure during a new version rollout is replacing all service instances in a single wave.
While old processes are shutting down and new ones are starting up, some requests go nowhere: connections are interrupted mid-transaction, readiness checks do not have time to warm up, and the share of error responses spikes precisely among active users — those who are paying or placing an order right now.
Service unavailability lasts minutes, but during peak hours this is the most expensive minute of the day.
The second, more unpleasant problem is a data schema version race.
If the database migration runs before the code rollout, old instances are still alive and do not know about the new field or renamed column; if it runs after, the new code is already reading something that does not exist.
A failed release at this moment stops being a single event: errors come from two versions at once, and the logs do not show who is actually to blame.
Manual rollback of a version under load makes everything worse.
The engineer brings up the previous image, but the data schema has already moved forward, and the old code does not fit it: recovery stretches from minutes to hours, and traffic goes to a degrading circuit the whole time.
We break down how this is closed: waves one replica at a time with warm-up and connection retention, reversible migrations across two compatible schema generations, and automatic rollback by metrics instead of manual intervention.
The Effect of a Controlled Rollout: What Changes in Numbers
Measurable results appear where the rollout is described by formal parameters: how many instances are started in parallel, which readiness checks a new instance passes, and by what condition the old one is removed from balancing.
In an orchestrator such as Kubernetes, this is defined declaratively, so the state before and after implementation is compared using the same metrics, not by the on-call shift's impressions.
Checklist of what we verify and what we record in the report:
- Downtime window. Before — from a few minutes to half an hour per release, with some traffic receiving errors. After — zero: a new instance receives traffic only after a successful readiness check, and the old one is removed from balancing last.
- Shorter release window. Replacement happens in portions, so rollout stops being a work stoppage: build and checks run in parallel with instance replacement.
- Share of failed releases. Previously — based on production actually going down; now — based on the number of instances that failed the readiness check. Such releases are stopped automatically before reaching the whole group.
- One-step rollback. Returning to a working version is switching to the previous set of instances, not rebuilding and manually sorting things out. Return time is measured in tens of seconds.
- Eliminated failure class. Correct process termination with a pause longer than the longest request eliminates long-connection interruptions and gateway error spikes at startup.
- On-call workload. Manual actions during rollout are reduced to starting and observing: progress, share of replaced instances, and the reason for stopping are visible in one place.
All six points are measured before and after on the same load profile — otherwise the comparison proves nothing. Describe your task: we will come back with an estimate, a measurement plan, and a configuration for your environment.
Comparison of Approaches: Rolling Update and Alternatives
Rollout strategies differ in how many versions serve traffic simultaneously and how fast rollback is.
Below are four working options and their honest limitations: they determine whether reserve capacity is needed for a second circuit, whether external consumers are ready for two service addresses, and whether the team can retire incompatible data schema changes.
| Approach | When it fits | Limitations |
|---|---|---|
| Full restart | Internal services, nighttime maintenance window, short downtime acceptable | Downtime while all replicas start; rollback is restarting the previous image; switching without smoothness |
| Rolling Update | Long-lived services without state on the node, several replicas behind a load balancer, rollout without downtime | Two versions run simultaneously: breaks on incompatible API and schema changes; rollback is a reverse pass through replicas; if unavailable replicas are prohibited, spare capacity is needed |
| Canary rollout | Need to test a version on 1–5% of traffic, with metrics and weight-based routing available | Requires a managed load balancer and observability; rollout is stretched over time; two versions coexist longer |
| Blue-green rollout | Critical service, rollback by switching traffic in seconds is needed | Double resource consumption during rollout; new circuit needs warm-up; more difficult with state, queues, and migrations |
How to Choose for Your Environment
If external consumers are not ready for two service addresses and there are no version-level metrics, the choice narrows to a full restart or Rolling Update.
The order of work is always the same: first observability and schema backward compatibility, then the strategy — otherwise rollback turns into guesswork.
How We Implement the Strategy: Engineering Work Stages
The order of work is the same for one service and for a platform with dozens of components — only the scope differs. The goal is the same: an update should not be noticeable to either the user or the on-call shift. We go from infrastructure audit to handover to operations.
Implementation Stages
- Infrastructure audit. We count replicas and their spread across nodes, check readiness and liveness probes, disruption policy, and how the load balancer removes a node from rotation.
- Rollout scheme. We determine how many new replicas are started simultaneously and what availability drop is acceptable (maxSurge and maxUnavailable), and how versions alternate in the service.
- Parameter configuration. We adjust probes, termination grace period, the preStop handler, and client request retries — otherwise a stopped replica tears connections during the rollout itself.
- Load testing. On a staging environment with a production traffic profile, we run rollout and rollback: error rate, response time on rare slow requests, and how long return to the previous version takes.
- Documentation. Rollout and rollback procedure, stop criteria when errors increase, and what to look at first.
- Handover to operations. We give the on-call shift metrics and alerts for a stuck rollout, walk through the procedure, and define the boundary beyond which they call us.
The acceptance criterion is a rollout under working load without an increase in errors; if the condition is not met, we return to the parameters and repeat the check.
Configurations, Schemes, and Release Procedures
After implementing the Rolling Update strategy, we assemble the set of artifacts so that your team can ship the next release without us.
Everything is versioned alongside the code: configurations, schemes, procedures, and access policies — with edit history and a clear entry point.
- Environment configuration — manifests for gradual rollout: share of traffic to the new version, how many instances are updated at once, pause between steps, readiness thresholds. Parameters are separated across development, pre-production, and production environments — staging does not blindly replicate production.
- Rollout scheme — the order of steps from artifact build to full traffic switchover, automation stop points, and what the user sees at the moment of transition.
- Release procedure — who initiates the release, who approves it, which checks are mandatory before start, and by what signal rollback is declared.
- Rollback procedure — return to the previous version in one action, retention period of previous artifacts in the registry, and verification that rollback works not only on release day.
- Access policies — roles in the cluster and registry: who changes production environment configuration, who reads logs, who approves the release; human and service accounts are separated.
- Documentation and observability — description of environments, variables, and secrets, network diagram, instructions for standard operations, monitoring dashboards, and alerts on error rate and number of available instances.
We hand over each item with a short walkthrough: what is configured, why this particular threshold was chosen, and how to act if system behavior deviates from expectations.
Case Study: How Version Rollout Stopped Taking Down the Service
A service with a daily load peak: online orders, tens of thousands of requests per minute, low-traffic window only at night.
Version releases went through stopping a group of servers: 4–6 minutes of unavailability per release, and roughly every seventh release was rolled back manually and almost always at night.
The release scheme was rebuilt to rolling update in Kubernetes: instances are replaced in batches, maxSurge and maxUnavailable set how many new ones to start simultaneously and how many old ones may be removed.
The readiness probe does not let traffic into a warming-up instance, and a delayed preStop hook lets active connections close — not a single request is lost during version switchover.
| Metric | Before | After |
|---|---|---|
| Unavailability time during release | 4–6 minutes | none — traffic goes to live instances |
| Share of failed releases | about 14% | 2% |
| Return to working version | 25–40 minutes manually | one command, less than a minute |
| Release window | only at night | any time, including peak |
Control remained with the on-call engineer, but the decision is made by automation: when the error rate rises, the rollout stops itself and returns the previous set of images without waiting for service degradation.
The error budget per release is set in advance — once exhausted, rollout is blocked until the causes are analyzed.
As a result, release stopped being an event with nighttime on-call duty: versions ship during working hours, rollback takes less than a minute, and the share of failed releases dropped sevenfold on the same traffic volume.
What If the Service Is Already Running in a Cluster?
A running cluster cannot simply be "switched" to phased replacement: the old and new instances serve traffic simultaneously for some time.
Therefore, the first thing we check is whether the service can survive two versions running in parallel — in terms of code, data, and background tasks. Without this check, a transition without downtime turns into a lottery.
Data schema compatibility is the main constraint. We split changes into waves: first add fields and indexes that the old version understands, then release code that reads both formats, and only in the next wave remove the old one.
Destructive operations — renaming, type narrowing, column deletion — are never combined with code release in a single step.
Separately, we check everything that does not split well into parts: schedulers, caches with their own state, long-lived connections. A background task replicated across several instances runs twice, so during release it is left in a single active copy.
The readiness check must reflect real readiness, otherwise traffic will reach an instance that has not yet established connections.
The transition order goes from simple to interconnected. First, stateless layers: request handlers and application API. Then queue consumers and worker processes.
Last are components with data: databases, caches, brokers, which are updated one at a time with verification at each step.
Transition risks come down to the mixed-version window and the absence of a path back. We plan rollback in advance: until the new version is confirmed, the old one remains operational and compatible with the new data.
We limit the share of traffic to the new version and stretch replacement over time so that errors appear on a small part of the cluster, not on the entire load.
Technical Doubts and Limitations of the Approach
Rolling Update aligns the code version but not the state: while the new pod is starting, the old one receives traffic, and a connection that lives longer than pod eviction is interrupted on the user side.
This is treated not by the strategy itself but by the combination — preStop hook, delay before removal from the load balancer, correct termination on signal. Without them, smoothness is visible only on the deployment graph.
The data schema constrains more strongly. Two code versions run simultaneously, so both old and new must survive any schema version: fields are added as optional, writes go to both formats, and deletion happens only after the previous release is retired.
Rollback breaks exactly when a migration has removed a column: returning it without data loss is no longer possible.
Infrastructure sets the upper bound. Starting a new pod requires spare CPU and memory; otherwise the scheduler keeps it pending and the update hangs halfway.
Environment quotas, disk volumes, and the number of addresses in balancing are the limit beyond which the approach is not used without changing the deployment scheme.
Will a user hit the old version during an update?
Yes, and that is normal if the versions are compatible by interface contract and data schema. The task is not to eliminate simultaneous operation but to make it safe: versioning interfaces, backward-compatible responses, and no shared mutable state in memory.
In Kubernetes, this is complemented by a readiness probe so that traffic goes only to a pod that can actually respond.
How do we roll back if the migration has already been applied?
Safe return is possible only before irreversible changes. Therefore migrations are divided into stages: schema expansion, data migration, code switchover, removal of the old — at each step the application remains operational on the previous version.
If removal has already happened, rollback means restoring from a backup with loss of changes made during that interval.
Let's Discuss the Task and Return with a Rollout Plan
To make the rollout estimate concrete rather than "plus or minus a week," engineers need access to the real picture of the environment: workload manifests, probe settings, update parameters, and the migration scheme.
The fewer assumptions at the input, the more accurate the work plan and the fewer surprises in the rollout window itself.
What is useful to send before the discussion:
- current workload manifests and the parameters of the service through which external traffic flows;
- probe settings: what is considered a live process, what is considered ready to accept requests, and what timeouts and startup delays are;
- rolling update parameters: how many instances can be started above the norm, how many can be taken out of service, and how long to wait for readiness;
- how images are stored — whether there are immutable tags, who tags the build and at which step;
- database migration scheme and the requirement for forward and backward version compatibility;
- where to look during degradation: metrics, logs, alerts, and who receives the notification;
- rollout window constraints — working hours, freeze periods, approval requirements;
- who owns the rollback decision and by what signal it is triggered.
In response, we will come back with a plan: rollout breakdown by waves and traffic shares, a set of configuration parameters for your load profile, ready-made manifests and revision rules, stop-signal criteria with a procedure for returning to the previous version, and a checklist for the on-call engineer.
Describe the task and the current environment — we will come back with an estimate and work plan.







