Lesson 6 / 25

Rolling Updates: maxSurge and maxUnavailable

Replace pods without downtime.

Two knobs control the pace

The default RollingUpdate strategy replaces pods gradually. maxSurge is how many extra pods may exist above the desired count during the update; maxUnavailable is how many may be unavailable below it. Both default to 25% (surge rounded up, unavailable rounded down). maxUnavailable: 0 with maxSurge: 1 never reduces capacity, at the cost of a slower rollout and some extra resources. New pods only count as available once their readiness probe passes, which is what makes rolling updates safe.

Simulating rollout steps, run

I ran this with Python 3. It is a simplified model of Kubernetes behaviour for learning, not the real controller code. With 10 replicas and the 25% defaults, up to 13 pods may exist and at least 8 must be available; the rollout finishes in three steps. With 4 replicas, maxSurge 1 and maxUnavailable 0, it replaces one pod at a time and never drops below 4. The model assumes new pods become ready instantly; in reality readiness probes pace each step.

import math
def rolling(replicas, max_surge, max_unavailable):
    surge = math.ceil(replicas * max_surge) if isinstance(max_surge, float) else max_surge
    unavail = math.floor(replicas * max_unavailable) if isinstance(max_unavailable, float) else max_unavailable
    old, new, step = replicas, 0, 0
    print(f"replicas {replicas}, maxSurge {surge}, maxUnavailable {unavail}: at most {replicas + surge} pods, at least {replicas - unavail} available")
    while old > 0 or new < replicas:          # simplified: new pods become ready instantly
        step += 1
        start = min(replicas - new, replicas + surge - (old + new))   # new pods we may start now
        new += start
        stop = min(old, (old + new) - (replicas - unavail))           # old pods we may remove once new are ready
        old -= stop
        print(f"  step {step}: +{start} new, -{stop} old -> old {old}, new {new}")
rolling(10, 0.25, 0.25)    # the default: 25% / 25%
rolling(4, 1, 0)           # zero-downtime style: surge one, never drop below 4

Output:

replicas 10, maxSurge 3, maxUnavailable 2: at most 13 pods, at least 8 available
  step 1: +3 new, -5 old -> old 5, new 3
  step 2: +5 new, -5 old -> old 0, new 8
  step 3: +2 new, -0 old -> old 0, new 10
replicas 4, maxSurge 1, maxUnavailable 0: at most 5 pods, at least 4 available
  step 1: +1 new, -1 old -> old 3, new 1
  step 2: +1 new, -1 old -> old 2, new 2
  step 3: +1 new, -1 old -> old 1, new 3
  step 4: +1 new, -1 old -> old 0, new 4

Readiness probes make rollouts safe

Without a readiness probe, Kubernetes treats a pod as ready as soon as it starts, and a broken version can replace all healthy pods.

Quick check: What does maxUnavailable: 0 guarantee during a rollout?

  • Old pods are never removed
  • The rollout is instant
  • No new pods are created
  • Available pods never drop below the desired replica count
Answer

Available pods never drop below the desired replica count — Capacity is preserved; surge provides the room.