# [변형 B] resolution: DNS_ROUND_ROBIN → Envoy LOGICAL_DNS # # A record에서 "필요할 때 1개 IP"만 골라 논리적 endpoint 1개로 취급한다. 새 커넥션은 # 최신 DNS 결과로 맺되, "기존 커넥션은 절대 drain 하지 않는다". # ⇒ GSLB가 IP1→IP2로 바꿔도 기존 롱세션은 유지되고, 신규만 IP2로 간다(Mode1 대조군). # ⇒ 트레이드오프: 물고 있던 IP가 나중에 죽어도 Envoy가 모른 채 유지 → 뒤늦게 끊긴다(Mode3). # # ⚠ (정정, 2026-07-10) 예전엔 여기 "A record가 multi-IP면 CDS NACK"라고 적었으나, 2026-07-09 # 실측(docs/test-reports/2026-07-09_211314-dns-logical-multia.md)으로 오류였음이 확인됐다. # 런타임 DNS가 실제로 여러 IP를 응답해도 LOGICAL_DNS는 NACK 없이 첫 IP만 골라 계속 쓴다 # (cluster 멤버는 첫 IP 하나뿐, 나머지는 조용히 무시 — 통신은 정상). "논리 endpoint 1개" # 제약이 실제로 걸리는 지점은 SE.spec.endpoints에 endpoint를 여러 개 명시할 때뿐이고, 그때도 # CDS가 아니라 istiod admission webhook이 `kubectl apply` 단계에서 거부한다 # (51-serviceentry-logical-2endpoints.yaml 참조). 그래도 Mode1/Mode3의 flip을 "단일 IP → # 단일 IP"로만 하는 이유는 여전히 유효하다 — LOGICAL은 여러 IP를 받아도 첫 IP만 쓰므로 # 멀티 IP 전환의 의미(GSLB 분산·페일오버)를 애초에 관찰할 수 없기 때문이다. # exportTo:["."] 로 가시성을 dns-lab 내부로 한정해 gateway 전역 노출 자체는 계속 피한다. # # ⚠ 40-serviceentry-strict.yaml 과 host가 같아 동시 적용 불가 — 정확히 하나만 apply. apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: gslb-logical namespace: dns-lab spec: exportTo: ["."] hosts: ["gslb.lab.internal"] location: MESH_EXTERNAL ports: - { number: 80, name: http, protocol: HTTP } - { number: 443, name: https, protocol: HTTP } resolution: DNS_ROUND_ROBIN