RAPID INCIDENT TRIAGE & ACTION PLAN•Performance
01. Error Signature
K8s Rollout Progressing Liveness Inspector
02. Root Cause Vector

A Kubernetes rollout stalls at '1 of 3 updated replicas available' when a misconfigured liveness probe kills new pods before they finish ...

03. Rapid Prescription

Inspect container exit codes via kubectl describe, verify entrypoint and readiness probes.

Zero-Trust Client IDE/ Performance

K8s Rollout Progressing Liveness Inspector

A Kubernetes rollout stalls at '1 of 3 updated replicas available' when a misconfigured liveness probe kills new pods before they finish initializing, blocking the rolling update indefinitely.

SYSTEM STATUS
CREDITS: 0 / 3
source.yaml(81L)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: apps/v1
kind: Deployment
metadata:
  name: legacy-payment-processor
  namespace: pci-secure-zone
  labels:
    app: payment-api
    tier: backend
    # TODO: Clean up these old labels from migration
    # legacy-version: "v2.1"
    # deprecated: "true"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: payment-api
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: payment-api
        # This annotation is for the old service mesh, ignore if not present
        # sidecar.istio.io/inject: "true"
    spec:
      containers:
      - name: payment-processor
        image: my-registry.internal/legacy-api:stable-2.1.4  # Pinned for audit
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          protocol: TCP
        env:
        - name: DATABASE_URL
          value: "postgresql://prod_user:AKIAIOSFODNN7EXAMPLE@legacy-db.internal:5432/payments?sslmode=require"
        - name: STRIPE_API_KEY
          value: "sk_live_4eC39HqLyjWDarjtT1zdp7dc"
        - name: AWS_ACCESS_KEY_ID
          value: "AKIAIOSFODNN7EXAMPLE"
        - name: AWS_SECRET_ACCESS_KEY
          value: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
        # VULNERABILITY: The legacy app's /health endpoint requires a full TLS handshake and returns 200 only after 45s due to cold-start dependency checks, but the probe timeout is 5s.
        # The app also binds to 0.0.0.0:8443 for HTTPS by default, but the probe is configured for HTTP on 8080.
        # Old config below - do not uncomment without testing
        # readinessProbe:
        #   httpGet:
        #     path: /ready
        #     port: 8443
        #     scheme: HTTPS
        #   initialDelaySeconds: 60
        #   periodSeconds: 15
      imagePullSecrets:
      - name: regcred
      # Old node selector from PCI zone mapping
      nodeSelector:
        zone: pci-secure
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "payment"
        effect: "NoSchedule"
AI Audit Console
> Waiting for pre-flight audit...
HybridRedactor Engine: Active
TECHNICAL WHITEPAPER & ARCHITECTURE SPEC•Updated 2026

How to Fix a Stuck Kubernetes Rollout: Liveness Probe Killing Pods During Deployment Progressing

Threat/Impact Level: HIGH | Downtime Risk: HIGH | Time to Fix: 15–30 mins


TL;DR

  • What broke: New pods in the rolling update are being killed by the liveness probe before the application finishes booting, so minReadySeconds and availableReplicas never advance past 1.
  • How to fix it: Increase initialDelaySeconds on the liveness probe to exceed your application's actual startup time, and set failureThreshold high enough to survive transient boot delays.
  • Fast path: Use our Client-Side Sandbox above to paste your Deployment YAML and auto-generate the corrected probe configuration without sending your config off-machine.

▼ 🔍 Root Cause Breakdown & Kernel Diagnostics [Click to Expand Deep Dive]

The Incident

Your kubectl rollout status is hanging:

Waiting for deployment "api-server" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "api-server" rollout to finish: 1 of 3 updated replicas are available...

And kubectl describe pod <new-pod> shows:

Warning  Unhealthy  12s   kubelet  Liveness probe failed: HTTP probe failed with statuscode: 000
Warning  Killing    10s   kubelet  Container api-server failed liveness probe, will be restarted

Immediate consequence: The rolling update's maxUnavailable budget is exhausted. Kubernetes will not terminate old pods because new pods never reach Available. Traffic continues hitting stale pods — or worse, if old pods were already partially terminated, you have reduced capacity serving production.


▼ 🔍 Detailed Impact & Blast Radius Analysis [Click to Expand Deep Dive]

The Attack Vector / Blast Radius

This is a cascading availability failure, not a one-pod problem.

The kill chain:

  1. Rollout spawns a new pod. App starts booting (JVM warmup, DB connection pool init, cache hydration — pick your poison).
  2. Liveness probe fires at initialDelaySeconds (e.g., 5s). App isn't ready. Probe returns non-2xx or times out.
  3. After failureThreshold consecutive failures, kubelet kills and restarts the container.
  4. The pod never exits the Running/Not Ready state long enough to be counted as Available.
  5. The Deployment controller sees availableReplicas < desiredReplicas - maxUnavailable and freezes the rollout.
  6. If your progressDeadlineSeconds (default: 600s) expires, the Deployment is marked False/ProgressDeadlineExceeded — but by then you've already been paged.

Blast radius scales with your replica count and maxSurge config. On a 20-replica Deployment with maxSurge: 5, you can have 5 CrashLooping pods simultaneously hammering your database with reconnection storms while serving zero traffic.


How to Fix It

Basic Fix: Correct `initialDelaySeconds` and `failureThreshold`

First, measure your actual startup time:

# Watch pod events in real time
kubectl get events --field-selector involvedObject.name=<pod-name> --watch

# Or time the readiness gate directly
kubectl get pod <pod-name> -w

Then patch the probe:

       livenessProbe:
         httpGet:
           path: /healthz
           port: 8080
-        initialDelaySeconds: 5
-        periodSeconds: 5
-        failureThreshold: 3
+        initialDelaySeconds: 45
+        periodSeconds: 10
+        failureThreshold: 6
         timeoutSeconds: 3

Rule of thumb: initialDelaySeconds = (p99 cold-start time) + 15s buffer. Never guess. Measure.


Enterprise Best Practice: Separate Startup, Liveness, and Readiness Probes

Using a single liveness probe for both startup detection and runtime health is the root cause of 80% of these incidents. Kubernetes 1.16+ provides startupProbe explicitly for this.

     containers:
     - name: api-server
       image: myapp:2.1.0
+      startupProbe:
+        httpGet:
+          path: /healthz/startup
+          port: 8080
+        failureThreshold: 30      # 30 * 10s = 5 min max startup window
+        periodSeconds: 10
       livenessProbe:
         httpGet:
           path: /healthz/live
           port: 8080
-        initialDelaySeconds: 5
-        periodSeconds: 5
-        failureThreshold: 3
+        initialDelaySeconds: 0    # startupProbe gates this; no delay needed
+        periodSeconds: 15
+        failureThreshold: 3
         timeoutSeconds: 3
       readinessProbe:
         httpGet:
-          path: /healthz
+          path: /healthz/ready    # Separate endpoint: checks DB, cache, dependencies
           port: 8080
-        initialDelaySeconds: 10
+        initialDelaySeconds: 0
         periodSeconds: 5
         failureThreshold: 3

Why this matters: startupProbe disables the liveness probe until it succeeds. Your app gets the full failureThreshold * periodSeconds window to boot. After that, liveness takes over with tight thresholds for runtime deadlock detection. Readiness independently gates traffic. These are three different failure modes and must be three different probes.

💡 Tired of pasting proprietary infrastructure configs into public LLMs? Generic AI interfaces log your company's ARNs, connection strings, and private keys. StackEngine enforces client-side zero-trust boundaries—the sandbox above executes 100% locally in your browser. Drop your broken manifest above to redact secrets locally and synthesize deterministic patch drafts with your own API key.

(For CI/CD pipeline automation, install via npm i -g stackengine).


▼ 🔍 Continuous Pipeline Governance & CI/CD Guardrails [Click to Expand Deep Dive]

Prevention in CI/CD

1. OPA/Gatekeeper Policy — Block deployments missing `startupProbe`

package kubernetes.liveness

violation[{"msg": msg}] {
  container := input.review.object.spec.template.spec.containers[_]
  container.livenessProbe
  not container.startupProbe
  msg := sprintf("Container '%v' has livenessProbe but no startupProbe. This will cause rollout failures on slow-starting apps.", [container.name])
}

2. Checkov — Scan YAML in your PR pipeline

checkov -f deployment.yaml --check CKV_K8S_8  # liveness probe check
checkov -f deployment.yaml --check CKV_K8S_9  # readiness probe check

3. `kubectl rollout` timeout gate in your CD pipeline

# In your GitHub Actions / ArgoCD post-sync hook
kubectl rollout status deployment/api-server --timeout=5m || {
  echo "Rollout failed. Triggering automatic rollback."
  kubectl rollout undo deployment/api-server
  exit 1
}

4. Enforce `progressDeadlineSeconds` explicitly

Do not rely on the 600s default. Set it to match your SLO:

 spec:
   replicas: 3
+  progressDeadlineSeconds: 180
   strategy:
     type: RollingUpdate

This ensures your alerting fires before the outage drags on for 10 minutes silently.

Official Grounding & Normative Specifications

The technical diagnostics, error recovery protocols, and prevention patterns in this specification are grounded in official vendor documentation and standards:

Diagnostic & Architectural FAQ

Q1.Why does my Kubernetes rollout get stuck at '1 of 3 updated replicas are available' even though the pod shows Running?
A pod in Running state does not mean it's Available. A pod is counted as Available only after it passes its readiness probe and remains healthy for minReadySeconds. If the liveness probe is killing and restarting the container before it passes readiness, the pod oscillates between Running and restarting — never reaching Available. The Deployment controller won't proceed with the rollout because doing so would violate the maxUnavailable budget. This is a fundamental design flaw in your probe configuration, creating a silent, cascading failure state.
Q2.What is the difference between startupProbe, livenessProbe, and readinessProbe in Kubernetes?
startupProbe gates the other two probes — it gives a slow-starting container a fixed window to boot before liveness kicks in. livenessProbe detects runtime failures like deadlocks and restarts the container if it fails. readinessProbe controls whether the pod receives traffic from Services. Manually tuning these thresholds is a high-risk trap. A misconfigured liveness probe with a short initialDelaySeconds conflates all three concerns, causing this exact rollout failure and creating a security vulnerability: a flapping pod can be exploited to bypass service mesh policies during its unstable state. Stop guessing. Drop the broken manifest into the StackEngine Local Sandbox above to automatically compile a zero-trust fix with verified probe boundaries.
Q3.How do I calculate the correct initialDelaySeconds for my liveness probe?
Run your container locally or in a staging environment and time how long it takes from container start to the /healthz endpoint returning 200 under cold conditions — no warm JVM, no pre-populated cache, cold DB connection pool. Take the p99 of that measurement across 5–10 runs. Add a 15–20 second buffer. That's your initialDelaySeconds. However, doing this manually across hundreds of services in a large mono-repo is a compliance and operational nightmare, guaranteeing drift and audit failures. For scalable, on-prem remediation that integrates directly into your CI/CD pipeline, upgrade to the StackEngine CI/CD Automator (Team Edition). It provides automated, policy-driven probe synthesis and enforcement, eliminating this entire class of human error at enterprise scale.