HTTP 라우팅 — 요청을 올바른 클러스터로 보내는 길잡이
HTTP 라우팅 — 요청을 올바른 클러스터로 보내는 길잡이
Envoy에는 고급 라우팅 작업을 수행하는 HTTP 라우터 필터(router filter)가 내장돼 있어요. 엣지 트래픽(전통적인 리버스 프록시 요청 처리)을 다루는 데도, host/authority HTTP 헤더로 특정 업스트림 서비스 클러스터에 도달하는 service-to-service 메시를 만드는 데도 유용하죠. 포워드 프록시로도 설정할 수 있어서, 메시 클라이언트가 자기 HTTP 프록시를 Envoy로 지정하고 참여할 수 있어요. 큰 그림에서 라우터는 들어온 HTTP 요청을 업스트림 클러스터에 매칭하고, 그 클러스터 호스트로의 커넥션 풀을 가져와 요청을 전달해요.
출처: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/http/http_routing
라우터 필터가 지원하는 기능
라우터 필터는 다양한 기능을 지원해요.
- 가상 호스트와 클러스터(Virtual hosts and clusters): 도메인/authority를 라우팅 규칙 집합에 매핑해요. 가상 클러스터는 가상 호스트 레벨에서 지정되고, 표준 클러스터 레벨 통계 위에 추가 통계를 만들며 정규식 매칭을 쓸 수 있어요.
- 경로·프리픽스·헤더 매칭: 대소문자 구분/무시 프리픽스와 정확 경로, 정규식 경로 매칭, 임의 헤더에 따른 라우팅을 지원해요.
- 쿠키 매칭:
Cookie헤더를 수동으로 파싱하지 않고 특정 HTTP 쿠키를 기준으로 매칭할 수 있어요. - 경로·프리픽스·호스트 재작성: 정규식과 캡처 그룹으로 프리픽스나 경로를 재작성하고, 명시적 호스트 재작성과 선택된 업스트림 호스트의 DNS 이름 기반 자동 호스트 재작성도 지원해요.
- 요청 리다이렉트: 라우트 레벨에서 경로/호스트 리다이렉트, 가상 호스트 레벨에서 TLS 리다이렉트를 지원해요.
- 요청 타임아웃·재시도·헤징: 재시도와 타임아웃을 HTTP 헤더나 라우트 설정으로 지정할 수 있어요. 요청(시도당) 타임아웃에 대한 응답으로 재시도 헤징(hedging)도 제공돼요.
- 트래픽 이동·분할: 런타임 값으로 트래픽을 한 클러스터에서 다른 클러스터로 옮기거나, 가중치/퍼센트 기반 라우팅으로 여러 클러스터에 트래픽을 분할할 수 있어요.
- 정책 기반 라우팅: 프라이어리티(priority)나 해시 폴리시(hash policy)에 따른 라우팅이 가능해요.
- 직접 응답(Direct responses): 업스트림으로 프록싱하지 않고 라우트 레벨에서 미리 준비한 HTTP 응답을 보낼 수 있어요.
- 절대 URL: 비-TLS 포워드 프록시에서 절대 URL을 지원해요.
라우트 스코프(Scoped routing)
스코프 라우팅은 도메인과 라우트 규칙의 탐색 공간에 제약을 걸 수 있게 해줘요. Route Scope는 키(key)를 라우트 테이블과 연결하는데, 각 요청마다 HTTP 커넥션 매니저가 스코프 키를 동적으로 계산해 라우트 테이블을 고릅니다. Scoped RDS(SRDS) API는 각각 독립적인 라우팅 설정을 정의하는 Scope 리소스 집합과, 요청별 스코프를 찾는 키 생성 알고리즘을 정의하는 ScopeKeyBuilder로 구성돼요.
예를 들어 Addr 헤더 값을 ;로 분리하고, 각 요소를 =로 나눠 키-값 쌍을 만든 다음 x-foo-key 키의 첫 값을 스코프 키로 쓰도록 설정할 수 있어요. Addr 값이 foo=1;x-foo-key=bar;x-bar-key=something-else라면 bar가 해당 라우트 설정을 찾을 스코프 키가 돼요.
계산된 키의 프래그먼트 수가 ScopedRouteConfiguration의 프래그먼트 수와 같아야 매칭되고, 순서대로 비교돼요. 만들어진 키에 빠진 프래그먼트(NULL 처리)가 있으면 어떤 스코프에도 매칭되지 않아 해당 요청의 라우트 항목을 찾을 수 없어요.
프라이어리티 라우팅
Envoy는 라우트 레벨의 프라이어리티 라우팅을 지원해요. 현재 프라이어리티 구현은 우선순위 레벨별로 서로 다른 커넥션 풀과 서킷 브레이킹 설정을 사용해서, HTTP/2 요청이어도 업스트림 호스트로 두 개의 물리 연결이 사용될 수 있어요.
직접 응답(Direct responses)
Envoy는 업스트림으로 프록싱하지 않는 미리 구성된 HTTP 응답("직접" 응답) 전송을 지원해요. Route에서 직접 응답을 지정하는 방법은 두 가지인데, 응답 바디를 지정하면 인라인이든 파일이든 기본적으로 4KB로 제한돼요. Envoy가 바디 전체를 메모리에 들고 있기 때문에, 4KB 기본값은 프록시 메모리 사용량이 지나치게 커지지 않도록 막아주는 장치예요.
제네릭 매칭 기반 라우팅
Envoy는 라우트 테이블을 지정할 때 제네릭 매치 트리(generic match tree)를 지원해요. 원래 매칭 엔진보다 표현력이 뛰어나서, 임의 헤더에 대해 아선형(sublinear) 매칭을 할 수 있어요. (원래 매칭 엔진은 일부 경우에만 :authority에 대해 가능했어요.)