# VirtualService — 2단 라우팅으로 edition.cnn.com 외부 호출을 egress gateway에 강제 경유. # 1단) mesh(sidecar) → egress gateway(subset cnn). 메시 mTLS 래핑/SNI는 DR이 담당. # 2단) egress gateway(server egress-cnn, 15443 listener) → 외부 edition.cnn.com:443 # # ⚠️ leg별 라우트 타입이 다른 이유(핵심): # 1단은 sidecar가 종단 안 함(앱 SNI로 라우팅 결정) → tls/sniHosts. # 2단은 게이트웨이가 ISTIO_MUTUAL로 메시 mTLS를 *종단*함. 종단된 listener에 tls/sniHosts # 라우트를 걸면 network filter가 안 생겨 listener가 통째로 omit된다("0 chains"). # 종단 후 내부(앱 TLS) 바이트를 그대로 흘리려면 tcp 라우트(tcp_proxy)로 받아야 한다. # → 게이트웨이는 외부 메시 mTLS만 풀고 SPIFFE 검증, 내부 앱 TLS는 cnn:443까지 end-to-end. apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: egress-cnn namespace: mesh-test spec: hosts: - edition.cnn.com gateways: - mesh # sidecar에서 발생하는 트래픽 (1단) - egress-cnn # egress gateway에서 발생하는 트래픽 (2단) tls: # 1단: sidecar → egress gateway (subset cnn, DR이 ISTIO_MUTUAL+sni 적용) # match port 443 = 앱이 cnn:443로 연결. destination port 15443 = egress gw 수신. - match: - gateways: [mesh] port: 443 sniHosts: [edition.cnn.com] route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local subset: cnn port: number: 15443 tcp: # 2단: egress gateway가 메시 mTLS 종단 후 → 내부 앱 TLS를 tcp_proxy로 cnn:443에 전달. # 종단 listener라 SNI는 이미 소비됨 → 포트 매칭만(이 listener에 호스트 1개라 충분). - match: - gateways: [egress-cnn] port: 15443 route: - destination: host: edition.cnn.com port: number: 443 weight: 100