# [작업 D] resolution: DNS, protocol: TLS, VS/DR 없음 → SNI passthrough(L4/TCP) 경로.
#
#  A·B(HTTP 경로, 40/41 SE + 42 VS + 43 DR)는 client가 평문 HTTP로 호출하고 sidecar가
#  TLS origination(L7)을 수행 → Envoy가 요청/응답 경계(HTTP conn pool, HTTP route)를 본다.
#  이 SE는 그 반대 극단이다: client가 **직접** https로 호출(SNI를 자기 손으로 세팅)하고
#  이 host엔 VirtualService/DestinationRule을 아예 붙이지 않는다. port protocol을 HTTP가
#  아니라 TLS로 선언했기 때문에 Istio는 이 트래픽을 HTTP로 승격할 방법이 없고, 자동으로
#  SNI 기반 TCP passthrough(istio-autopassthrough 게이트웨이와 같은 메커니즘 — outbound
#  listener의 tls_inspector가 ClientHello의 SNI를 읽어 그 값과 일치하는 filter chain으로
#  raw TCP proxy)로만 처리한다. Envoy 입장에선 요청 경계가 없는 바이트 스트림뿐이라
#  **HTTP route도, route-level retry policy도 존재하지 않는다** — 이 격차(A·B의 L7 보호가
#  passthrough에서도 유지되는가)를 실측하는 것이 작업 D의 목적. cluster는 STRICT_DNS이 되지만
#  http protocol options는 붙지 않는 순수 TCP 클러스터가 된다 — 증거는 리포트에
#  `istioctl proxy-config cluster --fqdn gslb-pt.lab.internal -o json`로 남긴다.
#
#  별도 hostname(gslb-pt.lab.internal) 사용 — 기존 gslb.lab.internal(40/41 SE, 42 VS, 43 DR)
#  경로는 완전히 불간섭(같은 backend IP를 가리키지만 SE/cluster는 별개). lab-dns의 hosts
#  zone 목록에 이 도메인을 추가해야 authoritative하게 응답한다(10-lab-dns.yaml Corefile —
#  additive 변경, 기존 zone 동작 불변. 단 Corefile 변경 자체는 CoreDNS 재시작이 필요했다).
#
#  exportTo:["."] → dns-lab 내부로만 가시화(다른 namespace/gateway로의 전역 노출을 막는 위생적
#  스코핑 관행, 기존 패턴과 동일 — "CDS NACK 차단" 때문은 아니다. 2026-07-10 정정:
#  런타임 복수 A레코드는 NACK을 유발하지 않는다는 게 실측으로 확인됐다,
#  docs/test-reports/2026-07-09_211314-dns-logical-multia.md 참조).
#
#  ⚠ 실측 함정(2026-07-09 작업D에서 발견) — gslb-pt.lab.internal 의 DNS 응답 IP를
#  backend-a/b **Service ClusterIP**로 주면 이 SE가 무의미해진다! Istio sidecar는 이미
#  알고 있는 in-mesh Service ClusterIP마다 그 IP:port 전용 리스너("10.250.x.x_443", ALL
#  match → 그 Service 고유 cluster로 직행)를 만든다. outbound 캡처는 "원본 목적지 IP"
#  기준이라, client가 어떤 이름으로 붙었든(SNI 무관) 목적지가 그 ClusterIP면 이 전용
#  리스너가 0.0.0.0:443의 SNI 캐치올보다 먼저 매치돼 이 SE의 cluster(outbound|443||
#  gslb-pt.lab.internal)는 아예 타지 않는다(실측: curl 200 성공했지만 upstream_cx_total
#  Δ0 — 트래픽이 backend-a Service 자체 cluster로 샜다). 기존 gslb.lab.internal(HTTP)
#  경로가 이 문제를 안 겪는 이유는 client가 포트 **80**으로 붙기 때문(backend-a Service엔
#  80이 없어 충돌 리스너가 없음) — 443을 그대로 쓰는 이 passthrough 경로는 반드시
#  **backend pod IP**(status.podIP, Service ClusterIP 아님)를 gslb-pt.lab.internal의
#  A record로 써야 SNI 캐치올(0.0.0.0:443)로 정상 낙하한다. pod IP는 재시작마다 바뀌므로
#  scale 0→1 이후엔 재조회해 hosts 파일을 다시 써야 한다.
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: gslb-passthrough
  namespace: dns-lab
spec:
  exportTo: ["."]
  hosts: ["gslb-pt.lab.internal"]
  location: MESH_EXTERNAL
  ports:
    - { number: 443, name: tls, protocol: TLS }
  resolution: DNS
