Kubernetes a platforma5 min čtení

Kubernetes Zero-Downtime Deployments: Kompletní průvodce

Jak nasazovat aktualizace vašich Kubernetes aplikací bez jakéhokoli přerušení služby. Rolling updates, blue-green, canary releases a kritické konfigurace, které většina týmů přehlíží.

TL;DR - Rychlá odpověď

  • Zero-downtime deployment znamená vydávání aktualizací bez přerušení služby
  • Vyžaduje: správné readiness probes, rolling update strategii, zpracování graceful shutdown
  • Běžné strategie: Rolling Updates (výchozí), Blue-Green, Canary Releases
  • Většina selhání je způsobena chybějícími readiness probes nebo nesprávným drainováním spojení

Co je Zero-Downtime Deployment?

Zero-downtime deployment je strategie nasazování, při které jsou aktualizace aplikací vydávány bez jakéhokoli přerušení služby. Uživatelé pokračují v normálním přístupu k aplikaci po celou dobu procesu nasazování - nezaznamenají chyby, timeouty ani žádnou indikaci, že probíhá aktualizace.

V Kubernetes se toho dosahuje kombinací správné konfigurace deploymentu, health checků a zpracování graceful shutdown. Když je to provedeno správně, můžete nasazovat vícekrát denně s naprostou jistotou, že uživatelé nebudou ovlivněni.

Proč na Zero-Downtime záleží

Každá minuta výpadku má svou cenu:

  • Ztráta příjmů - E-commerce stránky přicházejí o prodeje, SaaS platformy o příjmy založené na využití
  • Důvěra uživatelů - Časté výpadky narušují důvěru ve vaši platformu
  • Rychlost vývojářů - Strach z nasazování vede k méně častým releasům s většími, rizikovějšími změnami
  • Zátěž on-call - Riziková nasazování znamenají více incidentů a stresované inženýry

Týmy, které dosáhnou spolehlivých zero-downtime deployments, nasazují častěji, dodávají menší změny a mají vyšší důvěru ve své releasy.

Porovnání deployment strategií

Strategie Jak funguje Nejlepší pro
Rolling Update Postupně nahrazuje staré pody novými Většinu aplikací (výchozí strategie)
Blue-Green Dvě identická prostředí, přepnutí trafficu najednou Databázové migrace, velké změny
Canary Směruje malé % trafficu na novou verzi jako první Vysoce rizikové změny, postupný rollout

Rolling update je vestavěná strategie objektu Deployment. Blue-green a canary Kubernetes přímo nenabízí: obvykle se staví ze dvou Deploymentů a přepnutí selektoru Service, nebo z váženého směrování, například HTTPRoute v Gateway API, kde váhy backendů určují podíl trafficu pro novou verzi.

Krok 1: Nakonfigurujte Readiness Probes

Readiness probe říká Kubernetes, kdy je váš pod připraven přijímat traffic. Pokud ji nedefinujete, kubelet považuje výsledek za úspěšný a pod dostává traffic hned po startu kontejneru, i když aplikace ještě není připravena. To během nasazování způsobuje chyby.

spec:
  containers:
  - name: app
    readinessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      failureThreshold: 3

Častá chyba

Nespoléhejte jen na liveness probe! Liveness probe restartuje kontejner, ale směrování trafficu řídí readiness probe. Liveness probe by měla odhalit jen neopravitelný stav procesu (např. deadlock), ne výpadek databáze: špatně nastavená liveness probe vede ke kaskádovým restartům pod zátěží. Proto v kompletním příkladu níže používá samostatný endpoint /livez.

Váš health endpoint by měl ověřit, že aplikace je skutečně připravena:

  • Databázová spojení jsou navázána
  • Cache je zahřáta (pokud je třeba)
  • Závislosti jsou dosažitelné

Krok 2: Nakonfigurujte Rolling Update strategii

Rolling update strategie řídí, jak Kubernetes nahrazuje staré pody novými. Výchozí hodnoty jsou 25 % pro maxUnavailable i maxSurge, takže při výchozím nastavení může být během rolloutu část kapacity mimo provoz. Dva parametry, které je dobré nastavit explicitně:

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  • maxUnavailable: 0 - Nikdy nemít méně než požadovaný počet podů (zero-downtime)
  • maxSurge: 1 - Povolit jeden extra pod během rolloutu

S touto konfigurací Kubernetes:

  1. Vytvoří nový pod s aktualizovanou verzí
  2. Počká, až projde readiness kontrolami
  3. Začne směrovat traffic na nový pod
  4. Terminuje starý pod
  5. Opakuje, dokud nejsou všechny pody aktualizovány

Krok 3: Implementujte Graceful Shutdown

Když Kubernetes terminuje pod, pošle SIGTERM signál. Vaše aplikace musí tento signál zpracovat korektně:

  • Přestat přijímat nové požadavky
  • Dokončit zpracování probíhajících požadavků
  • Čistě uzavřít databázová spojení
  • Ukončit proces
# Python příklad
import signal
import sys

def graceful_shutdown(signum, frame):
    print("Přijat SIGTERM, probíhá graceful shutdown...")
    # Přestat přijímat nové požadavky
    server.stop_accepting()
    # Počkat na dokončení probíhajících požadavků
    server.wait_for_pending_requests(timeout=30)
    # Uzavřít spojení
    db.close()
    sys.exit(0)

signal.signal(signal.SIGTERM, graceful_shutdown)

Krok 4: Přidejte PreStop Hook

Existuje race condition: ve chvíli, kdy kubelet zahájí ukončování podu (spustí preStop hook a poté pošle SIGTERM), control plane současně aktualizuje EndpointSlices dané Service. Než se změna propíše do kube-proxy, load balancerů a ingress controllerů, může na pod stále přicházet traffic.

PreStop hook přidává zpoždění před shutdownem, což dává čas pro propagaci aktualizací endpointů. Nativní akce sleep je stabilní od Kubernetes 1.34, takže ji mají všechny aktuálně podporované verze. Spouští ji kubelet, a funguje proto i v distroless image bez /bin/sh. Na starších clusterech použijte exec s příkazem ["/bin/sh", "-c", "sleep 10"].

spec:
  containers:
  - name: app
    lifecycle:
      preStop:
        sleep:
          seconds: 10

Tento 10sekundový sleep dává load balancerům a ingress controllerům čas přestat posílat traffic na tento pod, než začne shutdown.

Pro Tip

Nastavte terminationGracePeriodSeconds minimálně na preStop sleep + čas shutdownu vaší aplikace. Odpočet začíná už před spuštěním preStop hooku a zahrnuje obojí. Výchozí hodnota je 30 sekund.

Kompletní příklad

Zde je kompletní konfigurace deploymentu pro zero-downtime:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: app
        image: my-app:v2
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          failureThreshold: 3
        livenessProbe:
          httpGet:
            path: /livez
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
        lifecycle:
          preStop:
            sleep:
              seconds: 10

Řešení běžných problémů

1. Chyby během nasazování

Příznak: Uživatelé vidí 502/503 chyby během nasazování.
Příčina: Obvykle chybějící nebo špatně nakonfigurované readiness probes.
Řešení: Zajistěte, aby readiness probe vracela healthy až když je aplikace skutečně připravena.

2. Resety spojení

Příznak: Probíhající požadavky selhávají s connection reset.
Příčina: Aplikace nezpracovává SIGTERM korektně.
Řešení: Implementujte graceful shutdown a přidejte preStop hook.

3. Pomalé rollouty

Příznak: Nasazování trvá příliš dlouho.
Příčina: Obvykle pomalé readiness probes nebo konzervativní nastavení.
Řešení: Vylaďte initialDelaySeconds a periodSeconds, zvyšte maxSurge.

Klíčové poznatky

  • Zero-downtime deployment je dosažitelný se správnou konfigurací
  • Readiness probes jsou kritické - řídí směrování trafficu
  • Použijte maxUnavailable: 0 pro zajištění kapacity během nasazování
  • Implementujte graceful shutdown ve vaší aplikaci
  • Přidejte preStop hook pro řešení race condition aktualizace endpointů
  • Otestujte svou deployment strategii, než se na ni v produkci spolehnete

A co upgrade samotného clusteru?

Všechno výše je o nasazování vaší aplikace na cluster, který se nemění. Upgrade Kubernetes samotného je jiná úloha: uzly se postupně vyprazdňují, pody se vystěhovávají a přesně tady se pozná, jestli readiness probes, PodDisruptionBudgety a graceful shutdown opravdu fungují, nebo jestli jen vypadají správně v manifestu.

Deprecated API, nekompatibilní add-ony a admission webhooky k tomu přidávají vrstvu, kterou rolling update aplikace vůbec neřeší. Jak k tomu přistupujeme my (pět fází včetně zkoušky nanečisto na klonu clusteru), je popsané na stránce Upgrade produkčního Kubernetes bez výpadku. Kdy končí podpora vaší verze, si můžete ověřit v kalendáři konce podpory.

Zdroje

  1. Kubernetes: Deployments (červenec 2026)
  2. Kubernetes: Liveness, Readiness, and Startup Probes (červen 2026)
  3. Kubernetes: Pod Lifecycle, Termination of Pods (červenec 2026)
  4. Kubernetes: Container Lifecycle Hooks (únor 2026)
  5. Kubernetes: Feature Gates (PodLifecycleSleepAction) (leden 2026)
  6. Kubernetes: Releases (září 2026)
  7. Gateway API: HTTP traffic splitting (květen 2026)

Potřebujete pomoc s Kubernetes deployments?

Pomohli jsme firmám dosáhnout zero-downtime deployments a snížit obavy z nasazování. Pojďme si promluvit o vaší infrastruktuře.

Nebo napište na info@devsecops.cz. Údaje zpracujeme podle zásad ochrany soukromí.