Ssoon
[7주차] 요청 경로에서 Istio 확장 : Envoy의 확장 기능 본문
🚀 Istio로 애플리케이션 네트워킹 강화하기
🛠️ Envoy: Istio의 핵심 구성 요소
Envoy란 무엇인가?
- Istio의 서비스 메쉬에서 Envoy는 핵심적인 역할을 합니다. Envoy는 애플리케이션 인스턴스와 함께 배포되는 서비스 프록시로, 서비스 간 요청 경로에 위치하여 네트워크 트래픽을 관리합니다. 예를 들어, 서비스 A가 서비스 B에 요청을 보낼 때, Envoy는 이 요청을 중개하며 라우팅, 로깅, 인증 같은 기능을 처리합니다.
- Envoy는 기본적으로 많은 기능을 제공하지만, 조직의 특정 요구사항을 충족하려면 추가적인 커스터마이제이션이 필요할 수 있습니다. 예를 들어, 특정 헤더를 추가하거나, 외부 인증 서비스와 통합하는 등의 작업이 이에 해당합니다.
Envoy는 Istio의 서비스 프록시로,
애플리케이션 간 네트워크 트래픽을 관리하며 커스터마이제이션이 가능합니다.
🔧 Envoy 확장의 필요성
- Envoy는 강력한 기능을 제공하지만, 모든 시나리오를 기본 설정으로 해결할 수는 없습니다. 특히, 조직마다 고유한 요구사항이나 last-mile 통합이 필요할 때 Envoy를 확장해야 합니다.
- Rate Limiting 또는 외부 Authorization 서비스와 통합: 트래픽 제한이나 외부 인증 시스템과의 연결.
- 헤더 추가, 제거, 수정: 요청이나 응답 헤더를 커스터마이징.
- 요청 페이로드 강화: 다른 서비스를 호출해 데이터를 추가.
- 커스텀 프로토콜 구현: 예를 들어, HMAC 서명/검증.
- 비표준 보안 토큰 처리: 특정 보안 토큰 형식을 지원.
- 이처럼 Envoy는 기본적으로 많은 것을 제공하지만, 특정 요구사항을 충족하려면 추가적인 설정이나 확장이 필요합니다.
Envoy는 다양한 확장 사례를 지원하며,
조직의 고유한 요구사항에 맞게 커스터마이징할 수 있습니다.
🌐 Istio 요청 경로에서 Envoy 확장하기
- Istio의 요청 경로에서 확장이 필요하다는 것은 곧 Envoy를 확장하는 것을 의미합니다. Envoy는 요청이 애플리케이션 간 이동할 때 이를 처리하는 핵심 프록시이기 때문에, 확장은 대부분 Envoy의 설정이나 필터를 통해 이루어집니다.
- 예를 들어, 특정 헤더를 추가하는 간단한 확장을 구현하려면 아래와 같은 Envoy 필터를 사용할 수 있습니다:
name: envoy.filters.http.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inline_code: |
function envoy_on_request(request_handle)
request_handle:headers():add("X-Custom-Header", "MyValue")
end
- 이 코드는 요청이 Envoy를 통과할 때 X-Custom-Header라는 헤더를 추가하는 간단한 Lua 스크립트입니다.
- 이처럼 Envoy는 Lua, WebAssembly(WASM) 같은 확장 메커니즘을 제공하여 유연한 커스터마이제이션을 가능하게 합니다.
Istio의 요청 경로 확장은 Envoy 필터를 통해 이루어지며,
Lua나 WASM으로 유연하게 구현할 수 있습니다.
📌 핵심 요약
- Istio의 가치: Istio는 서비스 메쉬를 통해 애플리케이션 네트워킹을 효율적으로 관리하지만, 조직의 특정 요구를 충족하려면 확장이 필요합니다.
- Envoy의 역할: Envoy는 Istio의 핵심 프록시로, 서비스 간 트래픽을 관리하며 다양한 커스터마이제이션을 지원합니다.
- 확장 사례: Rate limiting, 헤더 수정, 커스텀 프로토콜 구현 등 다양한 시나리오에서 Envoy를 확장할 수 있습니다.
- 확장 방법: Envoy 필터(Lua, WASM 등)를 사용해 요청 경로에서 커스텀 로직을 구현합니다.
🚀 Envoy의 확장 기능 탐구
🛠️ Envoy의 확장 가능성
Envoy의 설계 철학
- Envoy는 처음부터 확장성을 고려해 설계되었습니다. 잘 정의된 API 덕분에 개발자들은 Envoy의 핵심 코드를 수정하지 않고도 기능을 추가할 수 있습니다. 특히 필터 확장은 Envoy의 강력한 기능 중 하나로, 다양한 네트워크 요구사항을 충족하도록 프록시를 커스터마이징할 수 있습니다.
- Envoy의 확장성은 Istio와 같은 프로젝트뿐만 아니라 Gloo Edge 같은 오픈소스 프로젝트에서도 활용됩니다. 이를 통해 조직은 특정 요구사항에 맞는 커스텀 Envoy 빌드를 만들 수 있습니다.
Envoy는 확장 가능한 API와 필터를 통해
다양한 네트워크 요구사항을 충족할 수 있습니다.
🔍 Envoy의 필터 체인 이해하기
Envoy의 기본 구성 요소
- Envoy는 listeners, routes, clusters라는 주요 개념으로 구성됩니다. 이 중 listener는 Envoy가 네트워크 트래픽을 수신하는 시작점입니다. 아래 그림은 요청이 Envoy를 통해 처리되는 과정을 보여줍니다.
- Listener는 네트워크 인터페이스의 포트를 열어 들어오는 트래픽을 수신합니다. Envoy는 L3/L4 프록시로, 네트워크 연결에서 바이트 스트림을 읽어 이를 처리합니다. 이 과정에서 필터가 핵심 역할을 합니다.
Envoy의 listener는 트래픽을 수신하며,
필터 체인을 통해 바이트 스트림을 처리합니다.
네트워크 필터와 필터 체인
- Envoy의 가장 기본적인 필터는 네트워크 필터로, 바이트 스트림을 인코딩하거나 디코딩하는 역할을 합니다. 네트워크 필터는 순서대로 실행되는 필터 체인을 형성하며, 이를 통해 프록시의 기능을 구현합니다.
- Envoy는 다양한 프로토콜을 지원하는 네트워크 필터를 기본 제공합니다. 예를 들어:
- MongoDB
- Redis
- Thrift
- Kafka
- HttpConnectionManager
- 특히 HttpConnectionManager (HCM) 는 가장 널리 사용되는 필터로, 바이트 스트림을 HTTP 요청(HTTP/1.1, HTTP/2, gRPC, HTTP/3 등)으로 변환합니다.
네트워크 필터는 바이트 스트림을 처리하며,
HttpConnectionManager는 HTTP 요청으로 변환합니다.
HttpConnectionManager와 HTTP 필터
- HttpConnectionManager는 HTTP 요청을 처리하는 강력한 네트워크 필터입니다. HTTP 헤더, 본문, 트레일러를 추상화하고, 액세스 로깅, 요청 재시도, 헤더 조작, 요청 라우팅 같은 기능을 제공합니다.
- HCM은 자체적으로 HTTP 필터 체인을 구성하여 HTTP 요청을 처리합니다. 아래는 Envoy가 제공하는 주요 HTTP 필터의 예입니다:
- CORS: Cross-Origin Resource Sharing
- CSRF: Cross-Site Request Forgery 방지
- ExternalAuth: 외부 인증
- RateLimit: 요청 제한
- Fault Injection: 장애 주입
- gRPC/JSON Transcoding
- Gzip: 데이터 압축
- Lua: 스크립트 기반 커스터마이제이션
- RBAC: 역할 기반 접근 제어
- Tap: 요청 캡처
- Router: 요청 라우팅
- WebAssembly (Wasm): 확장 모듈
- HTTP 필터 체인은 Router 필터로 끝나야 하며, 이 필터는 요청을 업스트림 클러스터로 전달합니다.
Router 필터는 타임아웃, 재시도 같은 설정을 지원합니다.
HttpConnectionManager는 HTTP 필터 체인을 통해 요청을 처리하며,
Router 필터로 요청을 클러스터에 전달합니다.
커스텀 필터 개발
- Envoy는 사용자가 직접 커스텀 필터를 작성할 수 있도록 지원합니다. 예를 들어, Lua나 WebAssembly(WASM)를 사용해 필터를 추가하거나, C++로 커스텀 Envoy 빌드를 만들 수 있습니다. Istio와 Gloo Edge 같은 프로젝트는 Envoy 위에 커스텀 필터를 추가해 기능을 확장합니다.
- 예를 들어, Lua 필터를 사용해 헤더를 추가하는 코드는 다음과 같습니다:
name: envoy.filters.http.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inline_code: |
function envoy_on_request(request_handle)
request_handle:headers():add("X-Custom-Header", "MyValue")
end
- 다만, C++로 커스텀 빌드를 만들면 유지보수가 복잡해질 수 있으므로, Lua나 WASM 같은 경량화된 옵션을 사용하는 것이 일반적입니다.
Envoy는 Lua, WASM, C++를 통해 커스텀 필터를 추가할 수 있으며,
유지보수를 고려해 경량화된 옵션을 권장합니다.
📌 핵심 요약
- Envoy의 확장성: Envoy는 확장 가능한 API와 필터 체인을 통해 다양한 네트워크 요구사항을 지원합니다.
- 필터 체인: Listener는 네트워크 트래픽을 수신하고, 네트워크 필터와 HTTP 필터 체인을 통해 요청을 처리합니다.
- HttpConnectionManager: 바이트 스트림을 HTTP 요청으로 변환하며, HTTP 필터 체인을 통해 CORS, RateLimit 같은 기능을 제공합니다.
- Router 필터: HTTP 필터 체인의 마지막 단계로, 요청을 업스트림 클러스터로 전달합니다.
- 커스텀 필터: Lua, WASM, C++를 사용해 커스텀 필터를 추가할 수 있으며, 경량화된 옵션이 유지보수에 유리합니다.
🚀 Envoy와 Istio의 확장 필터로 기능 강화하기
🛠️ 확장을 위한 Envoy HTTP 필터
확장용 필터란?
- Envoy의 HTTP 필터는 HttpConnectionManager(HCM)를 통해 HTTP 요청과 응답을 처리하며, 커스텀 로직을 추가할 수 있는 강력한 도구입니다. C++로 필터를 작성해 Envoy 바이너리에 빌드하는 방법도 있지만, 이는 복잡하고 유지보수가 어렵습니다. 대신, 다음 세 가지 HTTP 필터를 사용하면 Envoy 바이너리를 수정하지 않고도 기능을 확장할 수 있습니다:
- External Processing: 외부 서비스 호출을 통해 요청 처리.
- Lua: Lua 스크립트를 사용해 요청/응답을 커스터마이징.
- WebAssembly (WASM): WASM 모듈을 통해 확장 코드 실행.
- 이 필터들은 외부 서비스 호출, 스크립트 실행, 또는 커스텀 코드를 통해 HCM의 HTTP 처리 능력을 강화합니다. 예를 들어, Rate-Limiting 필터는 외부 서비스를 호출해 트래픽 제한을 구현하며, 외부 인증(External Authorization)도 비슷한 방식으로 동작합니다.
Envoy의 External Processing 필터는 현재 코드베이스에 존재하지만, 기능이 제한적입니다.
대신 Rate-Limiting 같은 특정 외부 서비스 호출 방식을 사용하는 것이 일반적입니다.
Lua, WASM, 외부 서비스 호출을 통해 Envoy의 HTTP 필터를 확장할 수 있으며,
C++ 없이도 유연한 커스터마이징이 가능합니다.
🔧 Istio 데이터 플레인 커스터마이징
Envoy 필터 설정과 EnvoyFilter 리소스
- Istio의 데이터 플레인은 Envoy 프록시로 구성되며, 이를 커스터마이징하려면 Envoy의 필터를 직접 설정해야 합니다. Istio는 이를 위해 EnvoyFilter 리소스를 제공합니다. EnvoyFilter는 Envoy의 필터 체인을 세밀하게 조정할 수 있는 Istio API 입니다.
- Istio의 데이터 플레인을 확장하는 주요 방법은 다음과 같습니다:
- EnvoyFilter 리소스를 사용한 HTTP 필터 설정: Envoy의 HTTP 필터를 직접 구성.
- Rate-Limit 서버 호출: 외부 Rate-Limiting 서비스와 통합.
- Lua 스크립트 구현: Lua HTTP 필터에 스크립트를 로드해 커스텀 로직 추가.
- WASM 모듈 구현: WASM HTTP 필터에 모듈을 로드해 확장 기능 실행.
- 예를 들어, Lua 필터를 사용해 요청에 커스텀 헤더를 추가하는 EnvoyFilter 설정은 다음과 같습니다:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: lua-filter
spec:
workloadSelector:
labels:
app: my-app
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
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"
inline_code: |
function envoy_on_request(request_handle)
request_handle:headers():add("X-Custom-Header", "MyValue")
end
이 설정은 my-app 애플리케이션의 인바운드 트래픽에 Lua 필터를 추가해 요청에 X-Custom-Header를 삽입합니다.
Istio의 EnvoyFilter 리소스를 사용해 Envoy의 HTTP 필터를 설정하고,
Lua, WASM, Rate-Limiting 등으로 데이터 플레인을 확장할 수 있습니다.
📌 핵심 요약
- 확장용 HTTP 필터: Lua, WASM, External Processing 필터를 통해 Envoy의 HTTP 기능을 확장할 수 있으며, C++ 없이도 유연한 커스터마이징이 가능합니다.
- Rate-Limiting과 외부 서비스: Rate-Limiting 필터를 통해 외부 서비스와 통합하거나, 외부 인증 같은 기능을 구현할 수 있습니다.
- Istio의 EnvoyFilter: EnvoyFilter 리소스를 사용해 Envoy의 필터 체인을 설정하고, Lua 스크립트나 WASM 모듈로 데이터 플레인을 커스터마이징합니다.
- 실용적 예시: Lua 필터를 사용해 헤더 추가 같은 간단한 커스텀 로직을 구현할 수 있습니다.
'Istio Hands-on Study [1기]' 카테고리의 다른 글
[7주차] 요청 경로에서 Istio 확장 : 외부 콜아웃으로 요청 속도 제한 (0) | 2025.04.23 |
---|---|
[7주차] 요청 경로에서 Istio 확장 : EnvoyFilter 리소스로 Envoy 필터 구성 (0) | 2025.04.23 |
[7주차] 조직에서 Istio 확장 : 멀티 클러스터, 멀티 네트워크, 멀티 Control Plane 의 Service Mesh 개요 (0) | 2025.04.23 |
[7주차] 조직에서 Istio 확장 : 멀티 클러스터 Service Mesh 개요 (0) | 2025.04.23 |
[7주차] 조직에서 Istio 확장 : 멀티 클러스터 Service Mesh 이점 (0) | 2025.04.23 |
Comments