=== CMD: kubectl apply -f manifest.yaml === pod/client created deployment.apps/paralleltiming-echo created service/paralleltiming-echo created === CMD: kubectl -n istio-vt-t79 wait --for=condition=available deploy/paralleltiming-echo --timeout=60s === deployment.apps/paralleltiming-echo condition met === CMD: kubectl -n istio-vt-t79 wait --for=condition=Ready pod/client --timeout=60s === pod/client condition met === CMD 1: kubectl apply -f manifest.yaml (already applied above; re-noting) === (applied earlier - see top of this file) === CMD 2: POD=$(kubectl -n istio-vt-t79 get pod -l app=paralleltiming-echo -o jsonpath='{.items[0].metadata.name}') === POD=paralleltiming-echo-55f7966f47-5srfr === CMD 3: T0=$(date +%s); kubectl -n istio-vt-t79 delete pod $POD --wait=true; T1=$(date +%s); echo total_termination_seconds=$((T1-T0)) === pod "paralleltiming-echo-55f7966f47-5srfr" deleted from istio-vt-t79 namespace total_termination_seconds=61 === DIAGNOSTIC: unexpected result investigation === Primary spec run (commands 1-3) gave total_termination_seconds=61, which is neither close to the serial-sum hypothesis (35s) nor the parallel/max hypothesis (20-30s) per pass_criteria. Investigated root cause with extra (non-spec) diagnostics below. --- Event check on first terminated pod --- $ kubectl -n istio-vt-t79 get events (filtered for paralleltiming, Killing/FailedPreStopHook) paralleltiming-echo-55f7966f47-5srfr Killing "Stopping container app" paralleltiming-echo-55f7966f47-5srfr Killing "Stopping container istio-proxy" paralleltiming-echo-55f7966f47-5srfr FailedPreStopHook "PreStopHook failed" --- Root cause check: does the app image have a shell? --- $ kubectl -n istio-vt-t79 exec -c app -- sh -c "echo hi" error: ... OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown => CONFIRMED: hashicorp/http-echo:0.2.3 is a minimal/scratch-style image with NO shell. The manifest's preStop hook (["sh","-c","sleep 15"]) FAILS INSTANTLY (exec error), it never actually sleeps 15s. This is a test-fixture defect, not an Istio behavior. --- Re-run #2 (fresh pod) with per-container state polling every ~1s during termination --- POD=paralleltiming-echo-55f7966f47-9tzmd elapsed(kubectl delete --wait)=61.1s Delete triggered at approx 2026-07-05T00:23:25.49Z (poll loop timestamp, next tick after 1s sleep) Poll of containerStatuses[*].state every ~1s shows BOTH containers "running" continuously until timestamp 1783211066.24 (poll tick), at which point: app: terminated {exitCode:137, reason:"Error", finishedAt:"2026-07-05T00:24:25Z"} istio-proxy: terminated {exitCode:0, reason:"Completed", finishedAt:"2026-07-05T00:23:45Z"} Delta analysis (relative to delete-trigger ~00:23:25.49Z): istio-proxy finishedAt 00:23:45Z -> ~19.5s elapsed ~= terminationDrainDuration (20s), clean exit (code 0) app finishedAt 00:24:25Z -> ~59.5s elapsed ~= terminationGracePeriodSeconds (60s), SIGKILL (code 137) => MECHANISM CONFIRMED: 1. istio-proxy (Envoy/pilot-agent) received SIGTERM at pod-delete time (no preStop hook of its own) and completed its internal graceful drain in ~20s, matching proxy.istio.io/config terminationDrainDuration=20s, exiting cleanly (code 0) INDEPENDENTLY of the app container's state. 2. app container's preStop hook failed instantly (missing shell in image) so it never actually slept 15s; more importantly the http-echo binary does not trap/ handle SIGTERM (classic PID-1-without-init-handler issue), so it kept running until kubelet's terminationGracePeriodSeconds (60s) expired and force-killed it (SIGKILL, exit 137). 3. Because istio-proxy fully exited at ~20s WHILE the app container was still very much alive (running) until ~60s, this is direct, unambiguous proof that Envoy's drain and the app container's shutdown/termination proceed IN PARALLEL/independently -- if they were serial (e.g. Envoy waiting on app container exit first), Envoy could not have exited at t=20s while app was still running. 4. However, the specific NUMERIC pass_criteria in the spec (total pod-delete wall time in ~20-30s window) is NOT met -- observed total (~61s) is dominated by an unrelated confound (broken preStop fixture + app not handling SIGTERM => full TGPS + SIGKILL), not by the intended preStop(15s)-vs-drain(20s) race. The chosen test fixture (hashicorp/http-echo:0.2.3, TGPS=60s) does not correctly exercise the intended comparison for the *aggregate* total_termination_seconds metric, even though the underlying architecture (parallel container shutdown) IS independently confirmed by the per-container timestamp evidence above.