{
  "test_id": "T92",
  "verdict": "pass",
  "environment": {
    "date": "2026-07-05",
    "cluster": "homelab (kubespray bare-metal, k8s v1.30.6, CNI Calico, cluster domain homelab.local)",
    "istio_version": "1.30.0",
    "istioctl": "1.30.0 (client/control-plane/data-plane 일치)",
    "lab_kit": "content/docs/istio/egress/dns-gslb-repro-lab/files/lab/ (setup.sh · flip-test.sh · cleanup.sh · 00~45.yaml)"
  },
  "observed": "번들 랩 킷 files/lab/ 만으로 DNS/GSLB 재현 랩의 전체 생애주기(cleanup→setup→strict mode1→logical mode1→logical mode3→cleanup)를 라이브로 재현했다. setup.sh 는 cluster domain 을 coredns Corefile 에서 homelab.local 로 자동 발견·치환했고 fortio/netshoot sidecar 가 문제없이 rollout돼 2026-07-01 에 밟았던 'cluster.local 하드코딩→sidecar 미기동' 트랩을 처음부터 회피했다. STRICT mode1: keepalive 2커넥션(fortio Sockets 2, 320/320=100% 200) 유지 중 CoreDNS A record 를 backend-a(10.250.4.141)→backend-b(10.250.196.43)로 flip 하자 이 run 내 membership_change +1, upstream_cx_destroy +2(전부 destroy_local=Envoy 능동 drain), upstream_cx_total +2(재연결), endpoint 덤프 A→B 교체, who= 응답 backend 가 flip +3초에 backend-b 로 전환됐다. LOGICAL mode1: 같은 flip 에 이 run 내 델타가 membership_change/upstream_cx_destroy/upstream_cx_total 전부 0 이었고 who=backend-a 가 40초 내내 유지됐다 — 다만 endpoint 덤프와 per-endpoint cx 는 backend-b(새 resolved IP)로 라벨을 갱신해, 실제 body(backend-a)와 어긋나는 §7 관측 함정을 그대로 재현했다. LOGICAL mode3: flip(A→B) 후에도 who=backend-a 가 20초 유지되다가 backend-a 를 kill 한 순간 who=backend-b 로 전환되었고 code!=200 은 0건(무손실), upstream_cx_destroy_with_active_rq=0, 추가 destroy 는 destroy_remote(+2, 죽은 backend-a 가 원격 종료)로 나타났다. cleanup.sh 로 SE/VS/DR→namespace 삭제 후 kubectl get ns dns-lab 이 NotFound, 이미 없는 상태 재실행도 에러 없이 통과(멱등)했다. 3모드 실측값 모두 2026-07-01 기대치와 일치했다.",
  "claims": [
    {
      "doc": "gw__guide-egress-dns-gslb-repro-lab",
      "cid": "KIT",
      "empirical": "supports-claim",
      "note": "번들 킷(files/lab/) 만으로 cleanup→setup→3모드 flip-test→cleanup 전체 생애주기를 독자가 자기 클러스터에서 재현 가능함을 라이브 확인. setup.sh 는 CTX=현재컨텍스트 자동 감지 + cluster DNS/lab-dns ClusterIP + cluster domain 자동 치환으로 이식성 확보(homelab.local 자동 발견). cleanup.sh 는 --ignore-not-found 로 멱등."
    },
    {
      "doc": "gw__guide-egress-dns-gslb-repro-lab",
      "cid": "C1",
      "empirical": "supports-claim",
      "note": "STRICT_DNS(resolution:DNS) flip A→B 시 사라진 host 의 기존 커넥션을 능동 drain. 실측 델타: membership_change +1, upstream_cx_destroy +2(=destroy_local), upstream_cx_total +2, endpoint A→B 교체, who= flip +3초에 backend-b. 기존 세션 끊김(재연결)이 upstream cx 카운터로 관측됨."
    },
    {
      "doc": "gw__guide-egress-dns-gslb-repro-lab",
      "cid": "C2",
      "empirical": "supports-claim",
      "note": "LOGICAL_DNS(resolution:DNS_ROUND_ROBIN) flip A→B 시 기존 세션 보존. 실측: 이 run 내 membership_change/upstream_cx_destroy/upstream_cx_total 델타 전부 0, who=backend-a 40초 유지, fortio 320/320 100%. endpoint 덤프가 backend-b(새 IP)로 라벨만 갱신되고 body 는 backend-a 인 §7 '덤프≠바이트' 관측 함정도 동시 재현."
    },
    {
      "doc": "gw__guide-egress-dns-gslb-repro-lab",
      "cid": "C2-mode3",
      "empirical": "supports-claim",
      "note": "LOGICAL_DNS 는 pinned IP 가 죽어야 재연결. flip(A→B) 후 who=backend-a 20초 유지 → backend-a KILL 순간 who=backend-b 전환, code!=200 0건, destroy_with_active_rq=0, 추가 destroy 는 destroy_remote(+2). liveness 가 DNS 가 아니라 커넥션 단절에 걸려 있음을 실측으로 확인(§8 Mode3, What-you-might-be-missing 세션연속성 vs 최신성 트레이드오프)."
    }
  ],
  "deviations": [
    "STRICT mode1 의 who= 전환 시점이 2026-07-01 원 실측 '+5초' 대비 이번엔 '+3초'. 원인: CoreDNS hosts ttl 5s + reload 2s 창(2~7초) 내의 정상 변동 — flip 파일 쓰기 시점과 Envoy DNS refresh 주기의 위상 차이. 편차 아닌 동일 메커니즘의 타이밍 산포로 판단.",
    "cx 카운터는 Envoy 기동 이래 누적값이라, 같은 fortio pod 로 strict→logical run 을 연속 실행하면 절대값이 이월된다(logical mode1 BEFORE 가 membership_change 3/cx_destroy 4 에서 시작). 판정은 항상 'run 내 3a→3b 델타'로 격리했다.",
    "SE.resolution→STRICT_DNS/LOGICAL_DNS 'type' 필드는 이번 run 에서 istioctl proxy-config cluster 로 재-grep 하지 않음(측정 후 cluster 철거). 단 거동(STRICT=endpoint 교체+membership_change / LOGICAL=논리 endpoint 1개+델타 0)이 type 을 간접 입증하며, 이 매핑(C3)은 문헌 + T49 실측으로 이미 확인됨.",
    "mode2(죽은 IP 유실 + outlier/retry 복구, 44/45 매니페스트)와 LOGICAL 런타임 다중-IP CDS NACK(C4)은 T92 범위 밖 — T92 는 STRICT drain vs LOGICAL preserve 대조(mode1) + LOGICAL 트레이드오프(mode3)에 집중."
  ]
}
