[Resilience] Istio EnvoyFilter

y001·2025년 4월 27일

Istio 실전 스터디

목록 보기
21/26

1. 실습 목표

EnvoyFilter를 사용하여 Envoy Proxy가 처리하는 HTTP 요청에 커스텀 헤더를 삽입하는 방법을 실습한다.
적용 전후 결과를 비교하여 EnvoyFilter 적용 효과를 검증한다.


2. 실습 환경

  • Kubernetes 클러스터 (Istio 1.17 이상 설치)
  • 샘플 애플리케이션(httpbin, sleep) 배포

사전 준비는 다음과 같이 진행한다.

# httpbin 배포 (HTTP 서버 역할)
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.17/samples/httpbin/httpbin.yaml

# sleep 배포 (클라이언트 역할)
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.17/samples/sleep/sleep.yaml

# 배포 완료 확인
kubectl get pods

default 네임스페이스에 httpbinsleep 파드가 정상적으로 떠 있어야 한다.


3. EnvoyFilter 적용 전 기본 상태 확인

EnvoyFilter를 적용하기 전에 현재 상태를 확인한다.

kubectl exec deploy/sleep -- curl -sS http://httpbin:8000/headers

요청 결과에는 기본적인 HTTP 헤더들만 포함되어 있으며, 커스텀 헤더는 보이지 않는다.


4. EnvoyFilter 작성 및 적용

EnvoyFilter를 생성하여 httpbin 서비스에 커스텀 헤더를 추가하는 기능을 삽입한다.

envoyfilter-add-header.yaml 파일을 작성한다.

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: add-custom-header
  namespace: default
spec:
  workloadSelector:
    labels:
      app: httpbin
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        portNumber: 8000
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.lua
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
          inlineCode: |
            function envoy_on_request(request_handle)
              request_handle:headers():add("x-custom-header", "added-by-envoyfilter")
            end

설정 핵심은 다음과 같다.

  • workloadSelector를 통해 httpbin 파드만 대상으로 지정한다.
  • configPatches로 HTTP Connection Manager 필터 체인에 Lua 필터를 추가한다.
  • Lua 코드를 사용하여 모든 HTTP 요청에 x-custom-header: added-by-envoyfilter 헤더를 삽입한다.

작성한 리소스를 적용한다.

kubectl apply -f envoyfilter-add-header.yaml

5. EnvoyFilter 적용 후 결과 확인

EnvoyFilter가 적용된 후 다시 요청을 보내 결과를 확인한다.

kubectl exec deploy/sleep -- curl -sS http://httpbin:8000/headers

응답 결과에 다음과 같은 커스텀 헤더가 추가되어야 한다.

"x-custom-header": "added-by-envoyfilter"

EnvoyFilter를 통해 요청에 원하는 헤더를 삽입하는 데 성공했음을 확인한다.


6. 마무리하면서

구분결과
적용 전기본 헤더만 존재
적용 후x-custom-header: added-by-envoyfilter 추가됨

이번 실습을 통해 EnvoyFilter를 사용하여 Envoy Proxy의 트래픽 흐름을 세밀하게 조작할 수 있음을 확인했다.
또한 workloadSelector를 활용해 특정 워크로드에만 필터를 적용하는 방법과 Lua 스크립트를 통한 요청 변조 방식을 익혔다.

0개의 댓글