If you’ve worked with Kubernetes StatefulSets, you know they’re designed to manage stateful workloads—applications that need stable identities and persistent storage. But managing updates for these stateful applications can get tricky. That’s where maxUnavailable comes in.

Let’s break this down step by step.

Why Does maxUnavailable Matter?

Imagine you’re updating a StatefulSet running a database cluster. By default, Kubernetes updates StatefulSet pods one at a time, ensuring that the next pod isn’t updated until the previous one is running and ready. This is safe but slow, especially for large StatefulSets.

maxUnavailable allows you to adjust this behavior by permitting more than one pod to be unavailable simultaneously during updates. This means you can speed up updates while still maintaining control over availability.

For example:

  • A maxUnavailable value of 1 (the default) ensures only one pod is down at a time.
  • A higher value, like 2, allows two pods to be updated simultaneously, speeding up the process.

How Does maxUnavailable Work?

When you set maxUnavailable in your StatefulSet update strategy, Kubernetes uses this value to decide how many pods it can update concurrently during a rolling update. It calculates the number based on the total replicas of the StatefulSet and the maxUnavailable value.

Key Points:

  1. Default Behavior: If maxUnavailable isn’t specified, the default value is 1.
  2. Integer or Percentage: You can specify maxUnavailable as an absolute number (e.g., 2) or a percentage (e.g., 25%).
  3. Granular Control: By tweaking maxUnavailable, you can tailor the update process to suit your application’s tolerance for downtime.

Setting maxUnavailable in a StatefulSet

Here’s a practical example to show how maxUnavailable works. Let’s say you have a StatefulSet with 5 replicas, and you want to allow up to 2 pods to be unavailable during updates.

Example YAML:


  apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example-statefulset
spec:
  replicas: 5
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: app-container
        image: example-app:latest





What Happens Here:

  • Kubernetes ensures no more than 2 pods are unavailable at any point during the rolling update.
  • If one pod is still terminating or starting up, Kubernetes won’t update additional pods until the number of unavailable pods is back within the maxUnavailable limit.

When Should You Use maxUnavailable?

Here are some scenarios where adjusting maxUnavailable can be useful:

  1. Faster Updates:
    • For large StatefulSets with non-critical workloads, increasing maxUnavailable can reduce the time it takes to complete updates.
  2. Maintaining Quorum:
    • For distributed systems like Kafka or Zookeeper, keeping maxUnavailable low ensures the cluster maintains quorum and avoids service disruptions.
  3. Balancing Risk and Speed:
    • Applications with medium fault tolerance can allow higher maxUnavailable values to balance downtime and update speed.

Tips for Using maxUnavailable

  1. Know Your Application: Understand your application’s tolerance for downtime. A database cluster might require a low maxUnavailable value, while a caching layer can tolerate higher values.
  2. Test in Staging: Always test updates in a non-production environment to ensure the maxUnavailable setting works as expected.
  3. Use Percentages for Flexibility: When scaling your StatefulSet up or down, percentages allow maxUnavailable to adjust dynamically based on the replica count.

maxUnavailable vs. Default StatefulSet Behavior

By default, StatefulSets update one pod at a time. This ensures stability but can be slow. Here’s a quick comparison of default behavior and using maxUnavailable:

BehaviorDefault (1 pod at a time)With maxUnavailable
Update SpeedSlowerFaster (with more unavailable pods)
Application UptimeHigherDepends on the maxUnavailable value
Use CaseCritical, stateful applicationsNon-critical or large StatefulSets

Best Practices for Using maxUnavailable

  • Start Small: If you’re unsure of the right value, start with 1 or a low percentage to minimize risk.
  • Monitor During Updates: Keep an eye on application metrics and pod health while testing new maxUnavailable settings.
  • Combine with Readiness Probes: Ensure your StatefulSet pods have proper readiness probes configured to prevent Kubernetes from considering a pod “available” before it’s actually ready.

Resources for Further Learning

  1. Official Kubernetes Documentation
  2. Kubernetes Blog Posts
  3. YouTube Tutorial