Istio에서 EnvoyFilter는 Envoy 프록시 설정을 세부적으로 다루기 위해 제공되는 Custom Resource Definition(CRD)입니다. 일반적인 Istio 리소스(가령 VirtualService, DestinationRule 등)만으로는 해결하기 어려운 고급 설정이나 Envoy 레벨의 세세한 튜닝이 필요한 경우 EnvoyFilter를 통해 Envoy 설정을 커스터마이징할 수 있습니다.
추가적인 Envoy 설정 주입
HTTP, TCP, Listener 등 Envoy의 다양한 필드(필터 체인, 필터, 클러스터 등)에 대해 세부적으로 수정할 수 있습니다.
WASM(WebAssembly) 필터 주입
EnvoyFilter를 사용하면 WebAssembly 플러그인을 Envoy 프로세스에 주입할 수 있어, Envoy가 기본적으로 제공하지 않는 로직(모니터링, 로깅, 라우팅 등)을 확장할 수 있습니다.
커스텀 로깅 및 모니터링
기존 Istio 모니터링 도구(Prometheus, Zipkin, Jaeger 등) 외에 자체 로그 포맷이나 메트릭 수집 방법을 추가로 구현해야 할 때 EnvoyFilter로 Envoy의 로그 포맷이나 샘플링 정책 등을 수정할 수 있습니다.
특정 트래픽에 대한 정책 예외 처리
예를 들어, 특정 요청 경로나 호스트에 대해서는 상이한 설정(시간 제한, 재시도 설정, Rate limiting 정책 등)을 적용하고 싶을 때 EnvoyFilter로 세밀하게 설정할 수 있습니다.
일반적으로 EnvoyFilter 리소스는 다음과 같은 주요 필드를 갖습니다:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-envoy-filter
spec:
workloadSelector:
labels:
app: my-service
configPatches:
- applyTo: HTTP_FILTER # HTTP 필터에 패치 적용
match:
context: SIDECAR_INBOUND # 사이드카의 인바운드 트래픽
listener:
portNumber: 8080
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
patch:
operation: INSERT_BEFORE # 해당 위치 전(before)에 새 필터 삽입
value:
name: "envoy.filters.http.my_custom_filter"
typed_config:
"@type": "type.googleapis.com/udpa.type.v1.TypedStruct"
type_url: "type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"
value:
config:
name: "my-wasm-filter"
rootId: "my-root-id"
vmConfig:
vmId: "my-vm"
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/envoy-filter-config/my_custom_filter.wasm"
예를 들어 Envoy에서 새롭게 추가된 필터나 기능을 Istio가 공식적으로 지원하기 이전에 사용하고 싶을 때 EnvoyFilter를 사용해 선제적으로 적용할 수 있습니다.
HTTP/1.1, HTTP/2, gRPC, TCP 외에 추가적인 프로토콜(예: MQTT)에서 Envoy의 기본 라우팅 로직을 변경하거나 확장하려면 EnvoyFilter로 직접 Envoy 구성을 수정할 수 있습니다.