Istio Cheatsheet

Istio CheatsheetKapitel 05 von 10

Istio Performance und Tuning

Stand Istio 1.31 · Edition 2026.10 · Release-Daten geprüft am 20. Oktober 2026

Sidecar-Sizing

Default-Requests 100m / 128Mi (Limits 2000m / 1024Mi): bei hohem RPS zu knapp.
Richtwert (Istio-Benchmark 1.24, 1 KB, 2 Worker, 1000 RPS): Sidecar ≈ 0,2 vCPU + 60 MB, ztunnel ≈ 0,06 vCPU + 12 MB.
Memory wächst mit Listenern/Clustern/Routes, Sidecar-Resource schneidet.

Pilot-Tuning

PILOT_PUSH_THROTTLE: default auto = min(15+5n, 100). PILOT_DEBOUNCE_AFTER: default 100 ms. PILOT_DEBOUNCE_MAX: default 10 s. Bei Push-Storms (viele Pod-Restarts) Debounce hochziehen. Das n im Throttle-Default ist GOMAXPROCS von istiod, im Chart aus dem CPU-Limit (ohne Limit: Node-CPUs). Mehr CPU für istiod oder den Wert explizit setzen.

Ambient Mode (GA seit 1.24)

Kein Sidecar-Inject. ztunnel: Node-DaemonSet, L4 mTLS (HBONE). Waypoint: optional, L7, per istio.io/use-waypoint an Namespace, Service oder Pod; Policies dort per targetRefs, selector-Policies ignoriert der Waypoint. Opt-in: Label istio.io/dataplane-mode=ambient je Namespace oder Pod. Spart RAM bei vielen Pods, kostet Komplexität beim Debugging.

Jobs & CronJobs (Sidecar-Lifecycle)

App vor proxy ready → Connect-Refused. App fertig, Sidecar läuft → Job hängt.

Native Sidecar (GA ab K8s 1.33): Proxy läuft als initContainer mit restartPolicy: Always, sauberer Lifecycle. Default seit Istio 1.27: ENABLE_NATIVE_SIDECARS=auto injiziert nativ, wenn alle Nodes mindestens Kubelet 1.33 melden. Ein älterer Node schaltet es clusterweit ab. Per Pod (Vorrang): sidecar.istio.io/nativeSidecar: "true"|"false".

Pre-Native: holdApplicationUntilProxyStarts gegen Start-Race, trap mit POST :15020/quitquitquit auf EXIT gegen Shutdown-Hänger (feuert auch bei Crash/Signal, nicht nur bei Success).

# Pre-Native-Fallback: Start-Race + Shutdown-Hänger
metadata:
  annotations:
    proxy.istio.io/config: |
      { "holdApplicationUntilProxyStarts": true }
spec:
  containers:
  - name: worker
    command: ["/bin/sh","-c"]
    args:
    - |
      trap 'curl -fsS -XPOST \
        localhost:15020/quitquitquit||true' EXIT
      ./run-task

Graceful Drain: EXIT_ON_ZERO_ACTIVE_CONNECTIONS

Klassischer Sidecar: bei SIGTERM drainiert er nur terminationDrainDuration (Default 5 s), dann Hard-Exit, lang lebende Verbindungen (gRPC-Streams, WebSockets, DB-Pools) werden gekappt (503/Reset beim Rollout/Scale-Down). Native Sidecar (Default seit 1.27): preStop startet den Drain, SIGTERM kommt erst nach Ende der App-Container.

Fix: EXIT_ON_ZERO_ACTIVE_CONNECTIONS=true (via proxyMetadata bzw. proxy.istio.io/config): pilot-agent pollt aktive Envoy-Connections und beendet den Proxy sobald sie 0 erreichen statt nach fixem Timer.

Caveat: hängt eine Verbindung (Client schließt nie), blockt der Proxy bis terminationGracePeriodSeconds → SIGKILL. Grace-Period entsprechend hochsetzen. Mesh-weit via meshConfig.defaultConfig.proxyMetadata.