IT개발

서비스 메시(Service Mesh)의 내부 구조와 Envoy 커스텀 필터 개발

우리모두 개발자되기 2025. 4. 27. 13:40

 

서비스 메시(Service Mesh)의 내부 구조와 Envoy 커스텀 필터 개발

마이크로서비스 아키텍처(MSA)가 보편화되면서, 서비스 간 통신을 안정적이고 일관성 있게 관리하는 것이 점점 더 중요해졌습니다. 이때 등장한 핵심 기술이 바로 **서비스 메시(Service Mesh)**입니다. 서비스 메시는 복잡한 네트워크 트래픽을 제어하고 관찰할 수 있게 해주는 인프라 계층으로, 개발자와 운영자가 비즈니스 로직을 변경하지 않고도 트래픽을 세밀하게 관리할 수 있게 해줍니다.

본 글에서는 서비스 메시의 내부 구조, 그리고 서비스 메시에 핵심 역할을 하는 Envoy 프록시커스텀 필터 개발 방법까지 심층적으로 다루겠습니다.


1. 서비스 메시란 무엇인가?

서비스 메시는 애플리케이션 서비스 간의 통신을 추상화하여, 인증(Authentication), 암호화(Encryption), 로드 밸런싱(Load Balancing), 모니터링(Observability), 정책 적용(Policy Enforcement) 등을 일관되게 처리하는 인프라 계층입니다.

주요 기능

  • 트래픽 관리: 요청 라우팅, 리트라이, 타임아웃, 회로 차단
  • 서비스 관측성: 메트릭, 로깅, 트레이싱 수집
  • 보안 기능 강화: 서비스 간 mTLS 통신, 인증/인가
  • 정책 및 권한 제어: 접근 제어, Rate Limit 적용

대표적인 서비스 메시 솔루션은 다음과 같습니다.

  • Istio
  • Linkerd
  • Consul Connect
  • Kuma
  • AWS App Mesh

이 중에서도 Istio는 Envoy 프록시를 사이드카로 활용하여 가장 널리 사용되고 있습니다.


2. 서비스 메시의 내부 구조

서비스 메시 아키텍처는 크게 **데이터 플레인(Data Plane)**과 **컨트롤 플레인(Control Plane)**으로 나뉩니다.

2.1 데이터 플레인(Data Plane)

데이터 플레인은 실제 서비스 간 통신을 가로채고 제어하는 계층입니다. 일반적으로 사이드카 프록시(Sidecar Proxy) 형태로 애플리케이션 인스턴스마다 배포됩니다. 데이터 플레인의 역할은 다음과 같습니다.

  • 모든 인바운드/아웃바운드 트래픽 제어
  • 인증/암호화 적용(mTLS)
  • 트래픽 라우팅, 리트라이, 장애 전파
  • 모니터링 데이터 수집(메트릭, 로그, 트레이스)

데이터 플레인의 대표적인 구현체가 바로 Envoy Proxy입니다.

2.2 컨트롤 플레인(Control Plane)

컨트롤 플레인은 데이터 플레인의 설정을 관리하고 중앙집중적으로 정책을 배포하는 역할을 합니다.

  • 서비스 디스커버리
  • 인증서 관리 및 배포
  • 정책 관리 및 전파
  • 상태 모니터링과 헬스 체크

Istio에서는 Pilot(라우팅), Citadel(보안), Galley(구성 관리) 등이 컨트롤 플레인 역할을 수행합니다.

2.3 서비스 메시 동작 흐름

  1. 클라이언트 요청이 사이드카 프록시로 전달됨
  2. 프록시는 요청을 검사하고, 필요한 정책 적용
  3. 대상 서비스의 사이드카 프록시로 요청 전달
  4. 응답 또한 프록시를 거쳐 클라이언트로 반환
  5. 모든 트래픽은 자동으로 모니터링, 로깅, 트레이싱 수집

3. Envoy Proxy의 핵심 개념

Envoy는 고성능, 경량화된 프록시로 서비스 메시 데이터 플레인의 표준으로 자리 잡았습니다. 주요 특징은 다음과 같습니다.

  • 비차단(non-blocking) 아키텍처: 고성능 네트워크 처리
  • gRPC 및 HTTP/2 지원: 최신 프로토콜 호환성
  • 동적 구성 API: xDS APIs를 통한 실시간 설정 변경
  • 강력한 플러그인 구조: 필터(Filter) 체인 기반 확장성

Envoy는 요청/응답을 다수의 **필터 체인(Filter Chain)**을 통해 가공하고 조작합니다.


4. Envoy 커스텀 필터 개발

서비스 메시를 특정 비즈니스 요구사항에 맞게 최적화하기 위해서는 커스텀 필터를 개발할 필요가 있습니다.

4.1 필터(Filter)란?

Envoy의 필터는 요청/응답을 가로채고, 가공하거나 차단할 수 있는 확장 지점입니다. 주요 필터 종류는 다음과 같습니다.

  • Listener Filter: TCP 연결 수준 처리
  • Network Filter: 바이트 스트림 수준 처리
  • HTTP Filter: HTTP 요청/응답 수준 처리

대부분의 경우 HTTP 필터를 커스터마이징하여 특정 인증, 로깅, 모니터링 작업을 추가합니다.

4.2 필터 개발 환경 준비

Envoy는 C++로 작성되어 있으며, 필터 개발 시 다음 환경이 필요합니다.

  • Bazel 빌드 시스템
  • Envoy 소스코드
  • Protobuf 컴파일러

빌드 준비 예시

git clone https://github.com/envoyproxy/envoy.git
cd envoy
bazel build //source/exe:envoy-static

4.3 간단한 커스텀 HTTP 필터 예제

간단한 HTTP 필터를 개발해 보겠습니다. 요청 헤더에 특정 값을 추가하는 필터입니다.

MyCustomFilter.h

#pragma once

#include "envoy/http/filter.h"

namespace Envoy {
namespace Http {

class MyCustomFilter : public StreamFilter {
public:
  MyCustomFilter();
  ~MyCustomFilter() override = default;

  FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers, bool end_stream) override;
  void setDecoderFilterCallbacks(StreamDecoderFilterCallbacks& callbacks) override;

private:
  StreamDecoderFilterCallbacks* decoder_callbacks_;
};

} // namespace Http
} // namespace Envoy

MyCustomFilter.cc

#include "MyCustomFilter.h"

namespace Envoy {
namespace Http {

MyCustomFilter::MyCustomFilter() {}

void MyCustomFilter::setDecoderFilterCallbacks(StreamDecoderFilterCallbacks& callbacks) {
  decoder_callbacks_ = &callbacks;
}

FilterHeadersStatus MyCustomFilter::decodeHeaders(RequestHeaderMap& headers, bool) {
  headers.addCopy(Http::LowerCaseString("x-custom-header"), "InjectedByEnvoy");
  return FilterHeadersStatus::Continue;
}

} // namespace Http
} // namespace Envoy

4.4 필터 등록 및 구성

Envoy에 필터를 등록하려면 플러그인 시스템에 메타정보를 추가해야 합니다.

필터 등록 예시

REGISTER_FACTORY(MyCustomFilterFactory, NamedHttpFilterConfigFactory);

envoy.yaml 설정 예시

http_filters:
  - name: envoy.filters.http.my_custom_filter
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.my_custom_filter.v3.MyCustomFilterConfig

이렇게 하면 Envoy가 부팅될 때 커스텀 필터를 자동으로 로드하여 적용하게 됩니다.


5. 커스텀 필터 실전 활용 사례

5.1 사용자 인증/인가

  • JWT 토큰을 직접 파싱하여 인증 검증
  • Role 기반 접근 제어(RBAC) 정책 적용

5.2 고급 로깅/모니터링

  • 사용자별 트랜잭션 ID 삽입
  • 요청/응답 메타데이터 수집 및 전송

5.3 서비스 품질 개선

  • 슬로우 클라이언트 감지 후 연결 차단
  • DDoS 공격 패턴 식별 및 IP 블락

5.4 데이터 변조 방지

  • 민감한 정보(예: 주민번호, 카드번호) 마스킹

이처럼 Envoy 커스텀 필터를 활용하면 서비스 메시를 단순한 트래픽 관리 도구가 아니라, 강력한 네트워크 보안 및 품질 제어 플랫폼으로 진화시킬 수 있습니다.


6. 결론

서비스 메시는 현대 소프트웨어 아키텍처에서 필수적인 통신 인프라로 자리 잡았습니다. 서비스 메시는 단순한 프록시 레벨의 트래픽 제어를 넘어서, 보안, 관찰성, 정책 적용까지 포괄하는 전방위적인 관리 체계를 제공합니다. 그 중심에는 Envoy Proxy가 있으며, Envoy의 유연한 확장성 덕분에 커스텀 필터를 통해 다양한 비즈니스 요구사항에 맞춘 최적화를 실현할 수 있습니다.

서비스 메시를 제대로 이해하고 Envoy 커스텀 필터를 능숙하게 다루게 된다면, 대규모 분산 시스템을 더욱 안정적이고 효율적으로 운영할 수 있을 것입니다.