#!/usr/bin/env bash # T35 - replicas>=2 masks single-pod-kill disruption; replicas=1 does not. set -euo pipefail NS="istio-vt-t35" DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cleanup() { kubectl delete namespace "$NS" --wait=false --ignore-not-found } trap cleanup EXIT kubectl create namespace "$NS" kubectl label namespace "$NS" istio-injection=enabled kubectl apply -f "$DIR/manifest.yaml" kubectl -n "$NS" wait --for=condition=available deploy/masking-single deploy/masking-double --timeout=90s kubectl -n "$NS" wait --for=condition=Ready pod/client --timeout=90s # --- replicas=2 case: kill one pod, expect masking (no visible failures) --- ( kubectl -n "$NS" exec client -c curl -- sh -c 'for i in $(seq 1 60); do curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://masking-double.'"$NS"'.svc.homelab.local/; sleep 0.2; done' > /tmp/mask_double.log & ) sleep 1 POD_D=$(kubectl -n "$NS" get pod -l app=masking-double -o jsonpath='{.items[0].metadata.name}') kubectl -n "$NS" delete pod "$POD_D" --grace-period=0 --force sleep 13 echo "--- masking-double (replicas=2) result ---" sort /tmp/mask_double.log | uniq -c # --- replicas=1 case: kill the only pod, expect a clear cluster of failures --- ( kubectl -n "$NS" exec client -c curl -- sh -c 'for i in $(seq 1 60); do curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://masking-single.'"$NS"'.svc.homelab.local/; sleep 0.2; done' > /tmp/mask_single.log & ) sleep 1 POD_S=$(kubectl -n "$NS" get pod -l app=masking-single -o jsonpath='{.items[0].metadata.name}') kubectl -n "$NS" delete pod "$POD_S" --grace-period=0 --force sleep 13 echo "--- masking-single (replicas=1) result ---" sort /tmp/mask_single.log | uniq -c