=== kubectl apply -f manifest.yaml === pod/client created deployment.apps/echo created service/echo created === wait client Ready === pod/client condition met === rollout status deploy/echo === deployment "echo" successfully rolled out NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 2/2 Running 0 4s 10.255.126.27 k8s-worker2 echo-5767bbcc56-k4z8p 2/2 Running 0 4s 10.255.126.28 k8s-worker2 === CLIENT_START capture === CLIENT_START=2026-07-04T22:57:54Z === sanity curl before scale === 200 === start background warm curl loop === background loop started, pid tracking not needed (fire and forget per spec) === scale deploy/echo to 3 === deployment.apps/echo scaled === poll clusters endpoint for outbound|80||echo count (10x, 1s interval) === poll 1: count=199 poll 2: count=199 poll 3: count=199 poll 4: count=199 poll 5: count=199 poll 6: count=199 poll 7: count=199 poll 8: count=199 poll 9: count=199 poll 10: count=199 === raw /clusters sample (grep outbound|80||echo, unique endpoint IPs) === 10.255.126.25 10.255.126.28 10.255.126.8 10.255.159.164 10.255.194.105 10.255.194.111 10.255.194.121 10.255.194.75 === distinct cluster names matching outbound|80||echo === outbound|80||echo-graceful.istio-vt-t04.svc.cluster.local outbound|80||echo.istio-verify.svc.cluster.local outbound|80||echo.istio-vt-t16.svc.cluster.local outbound|80||echo.istio-vt-t21.svc.cluster.local outbound|80||echo.istio-vt-t22.svc.cluster.local === current echo pods === NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 2/2 Running 0 69s 10.255.126.27 k8s-worker2 echo-5767bbcc56-k4z8p 2/2 Running 0 69s 10.255.126.28 k8s-worker2 echo-5767bbcc56-lwl6d 2/2 Running 0 51s 10.255.194.75 k8s-worker1 echo-5767bbcc56-vgwtp 2/2 Running 0 51s 10.255.159.164 k8s-master1 === rollout status (check if already complete) === deployment "echo" successfully rolled out === NOTE: spec grep pattern "outbound|80||echo" is unanchored and matched === === other namespaces echo clusters too (mesh-wide visibility, ALLOW_ANY + no discoverySelectors). === === Supplementary precise poll: unique endpoint count for OUR cluster specifically === 10.255.126.28 10.255.159.164 10.255.194.75 === rollout status deploy/echo (spec command) === deployment "echo" successfully rolled out === waiting for warm curl loop background job to finish (checking log line count) === check 1: lines=0 check 2: lines=0 check 3: lines=0 check 4: lines=0 check 5: lines=0 check 6: lines=0 check 7: lines=0 check 8: lines=0 check 9: lines=0 check 10: lines=0 check 11: lines=0 check 12: lines=0 check 13: lines=0 check 14: lines=0 check 15: lines=0 check 16: lines=0 check 17: lines=0 check 18: lines=0 check 19: lines=0 check 20: lines=0 check 21: lines=0 check 22: lines=0 check 23: lines=0 check 24: lines=0 check 25: lines=0 check 26: lines=0 check 27: lines=0 check 28: lines=0 check 29: lines=0 check 30: lines=0 === CORRECTION: initial background loop via subshell was killed by tool-call shell teardown (0 curl processes found in pod). Redoing with proper background job control. === === scale echo back to 1 to re-establish clean pre-scale baseline === deployment.apps/echo scaled deployment "echo" successfully rolled out NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 2/2 Running 0 3m32s 10.255.126.27 k8s-worker2 echo-5767bbcc56-k4z8p 2/2 Terminating 0 3m32s 10.255.126.28 k8s-worker2 echo-5767bbcc56-lwl6d 2/2 Running 0 3m14s 10.255.194.75 k8s-worker1 echo-5767bbcc56-vgwtp 2/2 Terminating 0 3m14s 10.255.159.164 k8s-master1 CLIENT_START(re-baseline)=2026-07-04T22:57:54Z === scale deploy/echo to 3 (real run, warm curl loop active in background) === deployment.apps/echo scaled === poll clusters endpoint (10x,1s) - spec grep (loose, mesh-wide) AND precise (our ns only) === poll 1: loose_grep_count=192 precise_endpoint_count(our_ns)=1 poll 2: loose_grep_count=192 precise_endpoint_count(our_ns)=1 poll 3: loose_grep_count=192 precise_endpoint_count(our_ns)=1 poll 4: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 5: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 6: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 7: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 8: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 9: loose_grep_count=228 precise_endpoint_count(our_ns)=3 poll 10: loose_grep_count=228 precise_endpoint_count(our_ns)=3 === background task output (curl loop stdout/stderr from Bash tool) === EXIT_CODE=0 === rollout status deploy/echo (spec command, confirm stable) === deployment "echo" successfully rolled out === warm_curl.log inside pod: sort | uniq -c === command terminated with exit code 1 === sort/uniq -c warm_curl.log (spec command output) === 100 200 === warm_curl.err (curl stderr - empty expected) === (empty = no curl-level errors) === client pod startTime after scale (compare to CLIENT_START=2026-07-04T22:57:54Z) === 2026-07-04T22:57:54Z === client pod restart counts (sidecar + app container) === curl: restarts=0 istio-proxy: restarts=0 === istioctl proxy-config endpoint client.istio-vt-t21 --cluster outbound|80||echo.istio-vt-t21.svc.homelab.local (spec, literal FQDN) === ENDPOINT STATUS OUTLIER CHECK CLUSTER (line count below) 1 === NOTE: literal svc.homelab.local cluster name yielded 0 endpoints - Istio internal cluster naming uses svc.cluster.local suffix regardless of actual cluster DNS domain (side-observation, not core to T21 claims) === === retry with actual observed cluster name (svc.cluster.local) === ENDPOINT STATUS OUTLIER CHECK CLUSTER 10.255.126.36:8080 HEALTHY OK outbound|80||echo.istio-vt-t21.svc.cluster.local 10.255.159.166:8080 HEALTHY OK outbound|80||echo.istio-vt-t21.svc.cluster.local 10.255.194.75:8080 HEALTHY OK outbound|80||echo.istio-vt-t21.svc.cluster.local (line count including header) 4 === final pod state === NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 2/2 Running 0 5m14s 10.255.126.27 k8s-worker2 echo-5767bbcc56-b9ltp 2/2 Running 0 75s 10.255.126.36 k8s-worker2 echo-5767bbcc56-lwl6d 2/2 Running 0 4m56s 10.255.194.75 k8s-worker1 echo-5767bbcc56-x2g84 2/2 Running 0 75s 10.255.159.166 k8s-master1 === SUMMARY === - warm_curl.log: 100/100 requests = 200 (hitless during 1->3 scale) - client pod startTime unchanged: 2026-07-04T22:57:54Z before and after scale (sidecar/client never restarted) - precise per-namespace endpoint count via /clusters admin endpoint transitioned 1 -> 1 -> 1 -> 3 across ~4s of 1s-interval polling during the scale event (captured live transition) - istioctl proxy-config endpoint final state: 3 HEALTHY endpoints for outbound|80||echo.istio-vt-t21.svc.cluster.local - SIDE-NOTE: cluster naming internally uses svc.cluster.local suffix even though actual cluster DNS domain is homelab.local (per harness-notes); spec's literal svc.homelab.local cluster name returned 0 endpoints, required using the actual observed cluster.local-suffixed name - SIDE-NOTE: spec's grep 'outbound|80||echo' pattern (unanchored) matched other concurrently-running test namespaces' echo clusters (istio-vt-t04, istio-vt-t16, istio-vt-t22, istio-verify) due to full mesh-wide config push (ALLOW_ANY + no discoverySelectors); a namespace-qualified filter was used for accurate observation - dynamic_warming_clusters transient state (EDS not-yet-confirmed) was NOT separately captured via config_dump warming-state inspection - consistent with harness-notes prediction that k8s EDS updates may be too fast for polling to catch this specific transient; the hitless-transition core claim is nonetheless empirically confirmed via the curl loop + startTime + endpoint-count evidence