Service Mesh 정리
Service Mesh란
Service Mesh란 서비스 사이 통신에서 mTLS·재시도·트래픽 분할·관측을 애플리케이션 코드 밖의 프록시 계층으로 옮긴 구조
- 대상: 서비스 사이(East-West) 트래픽 → 외부 유입은 Ingress·Gateway 몫
- 구성: 트래픽을 실제로 나르는 데이터 플레인과 정책을 배포하는 컨트롤 플레인으로 나뉨
- 전제: 애플리케이션은 평문으로 평소처럼 호출하고, 암호화·재시도는 프록시가 가로채 처리
- 위치: CNI가 만든 파드 사이 경로 위에 얹히는 계층
패킷이 파드 사이를 어떻게 오가는지는 Kubernetes CNI 비교에서 다룬 주제고, 이 글은 그 경로 위에서 누가 TLS를 걸고 재시도를 판단하는지를 보는 쪽.
필요한 이유
같은 기능을 애플리케이션 안에서 해결하려면 언어마다 같은 일을 반복해야 함
| 방식 | 적용 지점 | 한계 |
|---|---|---|
| 라이브러리 | 서비스 코드에 SDK를 넣어 재시도·서킷브레이커 구현 | 언어별로 따로 구현. 정책을 바꾸려면 전 서비스 재배포 |
| API Gateway | 클러스터 진입 지점 한 곳 | 내부 서비스 사이 호출은 지나가지 않아 통제 밖 |
| Service Mesh | 워크로드 옆 또는 노드의 프록시 | 프록시 자체의 리소스와 운영 부담이 새로 생김 |
- 정책을 코드에서 떼어내면 언어가 섞인 클러스터에서도 한 벌로 집행 가능
구조
graph TD
CP["컨트롤 플레인<br/>정책·인증서 배포<br/>서비스 디스커버리"]
A["서비스 A"]
P1["프록시 A"]
P2["프록시 B"]
B["서비스 B"]
CP -. 설정·인증서 .-> P1
CP -. 설정·인증서 .-> P2
A --> P1
P1 -->|mTLS| P2
P2 --> B
- 컨트롤 플레인은 트래픽 경로에 없음 → 컨트롤 플레인이 죽어도 이미 배포된 설정으로 통신은 계속됨
- 데이터 플레인은 실제 패킷을 처리하므로 여기서의 선택이 자원 소비와 장애 반경을 결정
데이터 플레인 배치 방식
Service Mesh를 고르는 일은 사실상 프록시를 어디에 몇 개 두느냐를 고르는 일
| 비교 항목 | 사이드카(Istio) | 앰비언트(Istio) | eBPF 기반(Cilium) |
|---|---|---|---|
| 프록시 개수 | 파드마다 Envoy 1개 | 노드마다 ztunnel 1개 + 네임스페이스마다 waypoint | 노드마다 Envoy 1개 |
| L4 처리 | Envoy | ztunnel(Rust) | eBPF 커널 데이터패스 |
| L7 처리 | Envoy | waypoint(Envoy). 배치했을 때만 | Envoy |
| mTLS·암호화 | Envoy가 mTLS | ztunnel이 mTLS | mTLS는 Mutual Authentication(Beta), 구간 암호화는 IPsec·WireGuard |
| 앱 파드 spec 변경 | 사이드카 주입으로 변경됨 | 불필요 | 불필요 |
| 프록시 업그레이드 | 앱 파드 재시작 동반 | 앱과 무관하게 갱신 | 앱과 무관하게 갱신 |
| 장애 반경 | 파드 하나 | 노드 단위 또는 네임스페이스 단위 | 노드 단위 |
- ztunnel은 HTTP를 종료하지도 헤더를 파싱하지도 않음 → L7 인가·텔레메트리·VirtualService 라우팅이 필요하면 waypoint를 따로 배치해야 함
- Cilium은 L7 정책이 걸린 트래픽만 eBPF가 Envoy로 넘기고 나머지는 커널 경로에 그대로 둠
- 앰비언트는 Istio 1.24에서 GA로 올라섰고 한 메시 안에서 사이드카 모드와 섞어 쓸 수 있음
- Linkerd도 사이드카 계열이지만 배치 방식이 Istio 사이드카와 같은 축이라 여기서는 뺌
기능별 처리 위치
같은 기능이라도 어느 방식이냐에 따라 처리하는 주체가 달라짐
| 기능 | 사이드카 | 앰비언트 | eBPF 기반 |
|---|---|---|---|
| 워크로드 간 암호화 | Envoy mTLS | ztunnel mTLS | IPsec·WireGuard 구간 암호화 |
| L4 인가 | Envoy | ztunnel | eBPF 정책 |
| L7 인가·경로 라우팅 | Envoy | waypoint 필요 | Envoy |
| 재시도·타임아웃·서킷브레이커 | Envoy | waypoint 필요 | Envoy |
| 트래픽 분할(카나리) | Envoy | waypoint 필요 | Envoy |
| L4 텔레메트리 | Envoy | ztunnel | eBPF |
| L7 텔레메트리 | Envoy | waypoint 필요 | Envoy |
- 세 방식 모두 L7까지 가면 결국 Envoy를 거치고, 갈리는 것은 그 Envoy가 몇 개이고 어디 있느냐
- Cilium의 IPsec·WireGuard는 노드 사이 구간을 암호화하는 방식 → 같은 노드 안 파드끼리는 적용되지 않고 워크로드 신원 증명도 아님
도입 판단
| 상황 | 추천 방식 | 추천 사유 |
|---|---|---|
| 서비스 수가 적고 언어가 하나 | 도입 보류 | 라이브러리나 Gateway로 충분. 프록시 운영 부담만 남음 |
| 워크로드 신원 증명까지 규정에 걸림 | 앰비언트 | ztunnel이 워크로드 인증서로 mTLS를 걺 |
| 노드 사이 구간 암호화면 충분 | Cilium | IPsec·WireGuard로 프록시 없이 처리 |
| 서비스별 L7 정책이 세밀함 | 사이드카 또는 waypoint를 붙인 앰비언트 | L7 인가·라우팅은 Envoy가 있어야 가능 |
| 이미 Cilium을 CNI로 운영 중 | Cilium Service Mesh | 별도 컨트롤 플레인 없이 기존 설정을 확장 |
| 파드 밀도가 높아 자원이 빠듯 | 앰비언트 또는 Cilium | 프록시가 파드 수가 아닌 노드 수에 비례 |
| 파드 단위 장애 격리가 중요 | 사이드카 | 프록시가 죽어도 그 파드만 영향 |
결론
- Service Mesh는 mTLS·재시도·트래픽 분할·관측을 코드 밖 프록시로 옮긴 계층이고, CNI가 만든 경로 위에 얹힘
- 방식을 고른다는 것은 프록시를 파드마다 둘지 노드마다 둘지를 고르는 것
- 사이드카는 파드 단위 격리를 주고 파드 수만큼 자원과 재시작 부담을 가져감
- 앰비언트와 eBPF 기반은 노드 단위로 프록시를 줄이는 대신 장애 반경이 노드로 커짐
- L7 기능이 필요 없다면 앰비언트의 ztunnel만으로 mTLS까지 닿으니, 무엇이 필요한지 먼저 정하고 방식을 고를 것