EnvoyFilter를 사용하여 Envoy Proxy가 처리하는 HTTP 요청에 커스텀 헤더를 삽입하는 방법을 실습한다.
적용 전후 결과를 비교하여 EnvoyFilter 적용 효과를 검증한다.
사전 준비는 다음과 같이 진행한다.
# 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 네임스페이스에 httpbin과 sleep 파드가 정상적으로 떠 있어야 한다.
EnvoyFilter를 적용하기 전에 현재 상태를 확인한다.
kubectl exec deploy/sleep -- curl -sS http://httpbin:8000/headers
요청 결과에는 기본적인 HTTP 헤더들만 포함되어 있으며, 커스텀 헤더는 보이지 않는다.
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 필터를 추가한다.x-custom-header: added-by-envoyfilter 헤더를 삽입한다.작성한 리소스를 적용한다.
kubectl apply -f envoyfilter-add-header.yaml
EnvoyFilter가 적용된 후 다시 요청을 보내 결과를 확인한다.
kubectl exec deploy/sleep -- curl -sS http://httpbin:8000/headers
응답 결과에 다음과 같은 커스텀 헤더가 추가되어야 한다.
"x-custom-header": "added-by-envoyfilter"
EnvoyFilter를 통해 요청에 원하는 헤더를 삽입하는 데 성공했음을 확인한다.
| 구분 | 결과 |
|---|---|
| 적용 전 | 기본 헤더만 존재 |
| 적용 후 | x-custom-header: added-by-envoyfilter 추가됨 |
이번 실습을 통해 EnvoyFilter를 사용하여 Envoy Proxy의 트래픽 흐름을 세밀하게 조작할 수 있음을 확인했다.
또한 workloadSelector를 활용해 특정 워크로드에만 필터를 적용하는 방법과 Lua 스크립트를 통한 요청 변조 방식을 익혔다.