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.