Ssoon

[7주차] 요청 경로에서 Istio 확장 : Envoy의 확장 기능 본문

Istio Hands-on Study [1기]

[7주차] 요청 경로에서 Istio 확장 : Envoy의 확장 기능

구구달스 2025. 4. 23. 16:44

🚀 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 필터를 사용해 헤더 추가 같은 간단한 커스텀 로직을 구현할 수 있습니다.
Comments