컨테이너 환경에서 애플리케이션을 개발하다 보면 외부 서비스와의 통신이 복잡해지는 경우가 많습니다. 주소가 동적으로 변하거나, 프로토콜이 불안정하거나, 환경(Dev/Prod)에 따라 연결 대상이 달라져야 할 때가 있죠.
이번 포스팅에서는 메인 컨테이너가 외부 세상과 소통하는 복잡함을 대신 처리해 주는 Ambassador 패턴에 대해 알아보겠습니다.
Ambassador 패턴은 외부의 복잡성을 숨기고 파드(Pod) 외부의 서비스에 접근할 수 있는 통일된 인터페이스를 제공하는 특수한 형태의 사이드카(Sidecar)입니다.
쉽게 말해, 메인 컨테이너 대신 외부 의존성에 접근하는 '프록시(Proxy)' 역할을 수행하여 메인 컨테이너와 외부 연결 로직을 분리(Decouple)하는 패턴입니다.
컨테이너화된 서비스는 고립되어 존재하지 않으며, 종종 안정적으로 접근하기 어려운 타 서비스들과 통신해야 합니다. 이 과정에서 다음과 같은 어려움이 발생합니다.
Ambassador 패턴의 핵심은 외부 서비스에 접근하는 로직을 추상화하고 격리하는 것입니다.
localhost로 요청을 보냅니다.localhost의 특정 포트에서 대기하다가 요청을 받아, 실제 외부 서비스(복잡한 로직 처리)로 전달합니다.1) 다양한 환경 지원 (캐시 서버 연결)
개발 환경에서는 로컬 인메모리 캐시(memcached)를 사용하고, 운영 환경에서는 분산 캐시(etcd 등)를 사용해야 할 수 있습니다.


2) 서비스 디스커버리 및 서킷 브레이커
HTTP와 같이 신뢰할 수 없는 프로토콜을 사용할 때, Ambassador가 대신 서킷 브레이커, 타임아웃, 재시도(Retry) 로직을 수행하거나 레지스트리에서 서비스를 찾는 역할을 맡을 수 있습니다.
다음은 REST 서비스의 로그 데이터를 처리하는 Ambassador 패턴의 예제입니다.
메인 애플리케이션은 로그를 어떻게 처리할지 고민할 필요 없이, 그저 localhost:9009로 전송하기만 하면 됩니다.
apiVersion: v1
kind: Pod
metadata:
name: random-generator
spec:
containers:
# 1. 메인 컨테이너 (애플리케이션)
- image: k8spatterns/random-generator:1.0
name: main
env:
- name: LOG_URL
value: http://localhost:9009 # localhost로 전송
ports:
- containerPort: 8080
protocol: TCP
# 2. Ambassador 컨테이너
- image: k8spatterns/random-generator-log-ambassador
name: ambassador
# 9009 포트에서 리스닝하며 로그를 받아 처리 (외부 노출 X)
기존 Ambassador 패턴의 가장 큰 골칫거리는 '컨테이너 시작 순서(Startup Order)' 였습니다. 쿠버네티스 초기 버전에서는 파드 내 컨테이너들의 시작 순서를 보장하지 않았기 때문에, Ambassador 컨테이너가 준비되기도 전에 메인 애플리케이션이 연결을 시도하여 에러가 발생하는 문제가 종종 있었습니다.
하지만 최신 쿠버네티스(v1.28 알파, v1.29 베타 도입 후 v1.33+ Stable)에서는 SidecarContainers 기능이 기본적으로 활성화되어 이 문제가 깔끔하게 해결되었습니다.
이제 Ambassador 컨테이너를 일반 containers가 아닌, initContainers 항목에 restartPolicy: Always를 추가하여 정의할 수 있습니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다.
localhost로 요청을 보내도 안전합니다.변경된 YAML 예시 (Native Sidecar 적용):
apiVersion: v1
kind: Pod
metadata:
name: random-generator-native
spec:
# Ambassador를 initContainers로 정의하되, 항상 재시작하도록 설정
initContainers:
- name: ambassador
image: k8spatterns/random-generator-log-ambassador
restartPolicy: Always # 핵심: 이 설정으로 인해 사이드카로 동작함
containers:
- name: main
image: k8spatterns/random-generator:1.0
env:
- name: LOG_URL
value: http://localhost:9009
최신 버전의 쿠버네티스를 사용 중이라면, Ambassador 패턴 구현 시 반드시 이 Native Sidecar 방식을 사용하는 것이 권장됩니다.
Ambassador 패턴 vs Sidecar 패턴
장점