# client — 트래픽 소스(sidecar 주입됨). 이 파드의 istio-proxy(outbound cluster)가 관측 지점이다.
#
#  fortio 를 idle server 로 상주시켜 두고, run-scenario.sh 가 여기서 `fortio load` 를 exec 한다
#  (dns-lab 킷과 동일 패턴). S6 도 `fortio load http://blackhole.lab.internal/` 로 exec.
#
#  ★ proxyStatsMatcher — 이 랩의 핵심 계측 스위치:
#    Istio 기본 stats matcher 는 cardinality 절감을 위해 cluster 단위 upstream_cx_*/rq_* 와
#    circuit_breakers.* 게이지를 억제한다(dns-lab 에서 실증된 함정). 아래 3개 regex 로 명시 포함:
#      .*backend.*         → backend 클러스터의 upstream_cx_overflow / rq_pending_overflow /
#                            cx_max_requests / cx_idle_timeout / cx_max_duration_reached 등
#      .*blackhole.*       → S6 connectTimeout 관측(blackhole 클러스터 upstream_cx_connect_timeout)
#      .*circuit_breakers.* → cx_open / rq_pending_open / rq_open / rq_retry_open 게이지
#    이 스위치가 없으면 발동 카운터가 stats 에 아예 안 나와 "발동 안 함"으로 오판한다.
apiVersion: apps/v1
kind: Deployment
metadata: { name: client, namespace: conn-lab, labels: { app: client } }
spec:
  replicas: 1
  selector: { matchLabels: { app: client } }
  template:
    metadata:
      labels: { app: client }
      annotations:
        proxy.istio.io/config: |
          # DNS 프록시 — S6 필수: blackhole.lab.internal 은 ServiceEntry(resolution:STATIC) 라
          # 클러스터 DNS 에 없다. fortio 는 "커넥트 전에" 먼저 DNS 조회를 하는데, 이게 NXDOMAIN 이면
          # 트래픽이 Envoy 에 닿기도 전에 abort 된다. sidecar DNS capture+auto-allocate 를 켜면
          # sidecar 가 이 조회를 가로채 VIP(240.240.0.0/16)를 돌려주고 → 그 커넥션을 blackhole
          # 클러스터로 라우팅 → STATIC endpoint 로 커넥트 시도 → connectTimeout 발동.
          proxyMetadata:
            ISTIO_META_DNS_CAPTURE: "true"
            ISTIO_META_DNS_AUTO_ALLOCATE: "true"
          proxyStatsMatcher:
            inclusionRegexps:
            - ".*backend.*"
            - ".*blackhole.*"
            - ".*circuit_breakers.*"
    spec:
      containers:
        - name: fortio
          image: fortio/fortio:latest
          args: ["server"]           # idle 상주 → `kubectl exec deploy/client -c fortio -- fortio load ...`
          ports: [{ containerPort: 8080 }]
