리스너(Listener) — 트래픽이 들어오는 문
리스너(Listener) — 트래픽이 들어오는 문
리스너는 Envoy가 네트워크에서 트래픽을 받아들이는 입구예요. 하나의 Envoy 프로세스에 리스너를 몇 개든 설정할 수 있고, 보통 머신 한 대당 Envoy를 하나만 띄우는 걸 권장해요. 그래야 운영이 단순해지고 통계도 한 곳에서 볼 수 있거든요. 리스너로 들어온 각 연결은 설정된 필터 체인(filter chain)에 따라 처리되면서 다양한 프록시 작업이 이뤄져요.
출처: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/listeners/listeners
TCP 리스너
각 리스너는 독립적으로 filter_chains(필터 체인)를 설정해요. 개별 filter_chain은 filter_chain_match 조건에 따라 선택되고, 하나 이상의 네트워크 레벨(L3/L4) 필터로 구성돼요.
리스너에 새 연결이 도착하면 적절한 filter_chain이 선택되고, 설정된 연결-로컬 필터 스택(filter stack)이 인스턴스화된 뒤 이후 이벤트를 처리하기 시작해요. 이 범용 리스너 아키텍처로 Envoy가 하는 대부분의 프록시 작업을 수행할 수 있어요.
- 레이트 리밋(rate limiting)
- TLS 클라이언트 인증
- HTTP 커넥션 매니저(HTTP connection management)
- MongoDB 스니핑(sniffing)
- raw TCP 프록시
리스너는 선택적으로 몇 개의 리스너 필터(listener filters)도 가질 수 있어요. 이 필터는 네트워크 레벨 필터보다 먼저 처리되며, 연결 메타데이터를 조작해서 이후 필터나 클러스터가 연결을 어떻게 처리할지에 영향을 줄 수 있어요.
리스너는 리스너 디스커버리 서비스(LDS, Listener Discovery Service) API를 통해 동적으로 가져올 수도 있어요.
UDP 리스너
Envoy는 UDP 리스너와 특히 UDP 리스너 필터(UDP listener filters)를 지원해요.
UDP 리스너 필터는 워커(worker) 하나당 한 번 인스턴스화되고 그 워커에 전역적으로 적용돼요. 각 리스너 필터는 워커가 포트에서 받는 UDP 데이터그램(datagram) 하나하나를 처리해요.
실무에서 UDP 리스너는 SO_REUSEPORT 커널 옵션과 함께 설정하는데, 이 옵션을 쓰면 커널이 각 UDP 4-튜플을 항상 같은 워커로 해시해줘요. 덕분에 UDP 리스너 필터가 원하면 "세션" 지향적으로 동작할 수 있어요. 이런 기능의 내장 예시가 UDP 프록시(UDP proxy) 리스너 필터예요.