마이크로서비스의 수가 늘어날수록, 서비스 간 통신을 관리하는 것이 점점 어려워진다. 각 서비스마다 Retry 로직을 구현하고, mTLS 인증서를 관리하고, Circuit Breaker 설정을 넣는다면? 100개의 서비스가 있다면 100군데에 중복 코드가 생긴다.
서비스 메시는 이 문제를 애플리케이션 코드 바깥으로 꺼내는 방식으로 해결한다. 각 서비스 옆에 Sidecar Proxy를 붙이고, 모든 네트워크 트래픽이 이 Proxy를 거치도록 한다. 개발자는 비즈니스 로직에만 집중하고, Retry, Timeout, Circuit Breaker, mTLS, 트레이싱 같은 공통 네트워크 관심사는 서비스 메시가 처리한다.
서비스 메시 = 서비스 간 통신(East-West 트래픽)을 전담하는 인프라 계층
서비스 수가 적을 때는 문제가 보이지 않는다. 하지만 수십 개 이상의 서비스가 서로 얽히기 시작하면 다음 문제들이 현실로 다가온다.
기존 방식의 문제 (Before)
서비스 메시 도입 후 (After)
각 Pod/서비스 옆에 붙는 Sidecar Proxy (주로 Envoy)가 Data Plane을 구성한다. 실제 패킷이 오가는 구간이다. 모든 서비스 통신은 App → Sidecar → (네트워크) → Sidecar → App 경로로 흐른다. App은 자신이 Sidecar를 통해 통신하고 있다는 사실을 모른다.
Istio, Linkerd, Consul 등이 Control Plane 역할을 한다. Sidecar Proxy들에게 설정과 정책을 배포하고, 인증서를 발급하며, 라우팅 규칙과 Telemetry 설정을 관리한다.
서비스 메시는 자체 인증 기관(CA) 을 운영하여 각 서비스에 인증서를 자동 발급한다. 서비스 간 통신 시 이 인증서로 상호 TLS(mTLS) 인증을 수행한다. 즉, 클라이언트와 서버 양쪽이 서로의 신원을 검증한다. 이것이 Zero Trust 네트워크의 기반이 된다.

| 방향 | 설명 | 주요 컴포넌트 | 설계 집중 포인트 |
|---|---|---|---|
| North-South | 외부 ↔ 클러스터 내부 | Cloud LB, Ingress Controller, API Gateway, WAF | 보안, 인증, API 관리 |
| East-West | 서비스 ↔ 서비스 내부 | K8s Service, DNS, Service Mesh, CNI | 디스커버리, 로드밸런싱, mTLS |
대부분의 트래픽은 East-West, 즉 서비스들끼리의 내부 통신이다. 서비스 메시가 특히 중요한 이유가 여기에 있다.
서비스 메시는 L7 수준에서 트래픽을 인식하기 때문에 Canary 배포, A/B 테스트, 서킷 브레이커 같은 고급 트래픽 제어가 가능하다.
Kubernetes의 네트워크 모델은 다음 세 가지 원칙을 따른다.
이 모델을 실제로 구현하는 것이 CNI(Container Network Interface) 플러그인이다.
Pod IP의 문제와 Service의 역할
Pod IP는 스케일링, 재시작, 재배치 시마다 바뀐다. 따라서 특정 Pod IP를 직접 호출하는 것은 불안정하다. Kubernetes의 Service 리소스가 안정적인 가상 IP(ClusterIP)를 제공하고, 이 IP로 들어오는 트래픽을 뒤에 있는 Pod들에게 로드밸런싱해준다.
CNI는 Pod 생성/삭제 시 IP 할당, 라우팅 설정, 가상 네트워크를 구성한다.
| CNI | 기반 기술 | 특징 |
|---|---|---|
| Calico | L3 (BGP 라우팅) | 성능 우수, NetworkPolicy 지원 강점, 대규모 운영에 적합 |
| Flannel | L2 (VXLAN Overlay) | 단순하고 가볍지만 NetworkPolicy 미지원 |
| Cilium | eBPF | 고성능 데이터 플레인, L7 가시성, 차세대 CNI |
| Amazon VPC CNI | AWS VPC | EKS에서 Pod에 VPC IP 직접 할당, AWS 서비스와 자연스러운 통합 |
| 타입 | 접근 범위 | 주요 용도 |
|---|---|---|
| ClusterIP | 클러스터 내부 | 서비스 ↔ 서비스 통신 (기본값) |
| NodePort | 각 Node의 특정 포트 | 외부 접근이 필요하나 단순한 경우 |
| LoadBalancer | 외부 (클라우드 LB) | 외부에 공개하는 서비스 |
DNS 기반 서비스 접근: http://payment-service.default.svc.cluster.local
/api/orders → order-service, /api/payments → payment-service전통적인 네트워크 보안은 "내부 네트워크는 안전하다"는 가정을 전제로 했다. 방화벽으로 외부를 차단하면 내부에서의 통신은 신뢰했다. 하지만 클라우드 네이티브 환경에서 이 가정은 위험하다. 내부 서비스가 침해되거나 잘못 설정될 경우 내부 네트워크에서 자유롭게 이동할 수 있기 때문이다.
Zero Trust 원칙: "Trust Nothing by Default"
Zero Trust를 완전히 구현하면, 어느 서비스가 어느 서비스를 어떤 방법으로 호출할 수 있는지가 모두 코드(YAML/Manifest)로 명시된다. 네트워크 보안이 인프라 팀의 암묵적 지식이 아니라 감사 가능한(Auditable) 코드가 된다.
요약: 서비스 메시는 마이크로서비스 환경에서 서비스 간 통신의 복잡성을 코드 밖으로 꺼내어 인프라 레이어에서 통합 관리하는 패턴이다. Retry, mTLS, 트레이싱, Canary 배포 같은 공통 관심사가 모든 서비스에 일관되게 적용된다. 이를 제대로 활용하려면 클라우드 네이티브 네트워킹의 기본(CNI, Service, Ingress, Zero Trust)을 함께 이해해야 한다.