Adapter 패턴은 여러 언어·프레임워크로 작성된 컨테이너 애플리케이션을
“외부에서 볼 때는 하나의 표준 인터페이스처럼” 보이게 만드는 패턴입니다.
Adapter 패턴은 Sidecar 패턴의 한 종류이지만, 목적이 매우 명확합니다.
복잡하고 제각각인 애플리케이션 내부를 숨기고,
외부 시스템(모니터링, 로깅 등)이 소비할 수 있는 통일된 형식으로 바꿔 주는 것
즉, 컨테이너 안에서 어떤 언어를 사용하든, 어떤 방식으로 로그·메트릭을 남기든 상관없이
Adapter 컨테이너가 대신 데이터를 읽고, 변환하며, 표준 포맷으로 내보내는 역할을 합니다.
요즘 시스템 구조는 보통 다음과 같은 형태를 띱니다.

예를 들어 다음과 같은 상황이 있을 수 있습니다.

이 상태에서 “전체 시스템을 하나의 통합된 모니터링 뷰로 보고 싶다”라는 요구가 들어오면,
레거시 서비스가 많을수록 이는 사실상 불가능에 가까운 작업이 됩니다.
이때 애플리케이션 코드를 직접 수정하지 않고 문제를 해결할 수 있는 방법이 바로 Adapter 패턴입니다.

Adapter 패턴의 핵심 아이디어는 매우 단순합니다.
각 Pod에 Adapter 컨테이너를 하나 더 붙이고,
이 컨테이너가 애플리케이션의 커스텀 데이터(로그, 메트릭 등)를 읽어서 외부 시스템이 이해할 수 있는 표준 포맷으로 변환해 줍니다.
조금 더 구체적으로 구성 요소를 나눠 보면 다음과 같습니다.

/logs/random.log에 랜덤 숫자와 수행 시간을 기록.책에서는 랜덤 숫자 생성기 애플리케이션을 예시로 Adapter 패턴을 설명합니다.
애플리케이션은 랜덤 숫자를 생성하고, 해당 숫자를 생성하는 데 걸린 시간을 로그 파일에 남깁니다.
이 수행 시간을 Prometheus로 모니터링하고 싶습니다.
하지만
/metrics 같은 엔드포인트도 없습니다.위 요구사항을 만족하기 위해 다음과 같은 구조로 설계합니다.

LOG_FILE=/logs/random.log를 사용합니다./logs/random.log에 “생성된 숫자 + 걸린 시간(ms)” 형식으로 로그를 남깁니다./logs 디렉터리는 emptyDir 볼륨으로 정의합니다.LOG_FILE=/logs/random.log를 사용합니다./logs 디렉터리를 같은 emptyDir 볼륨으로 마운트합니다./metrics 요청이 들어오면random.log를 읽고,prometheus-adapter가 제공하는 HTTP 엔드포인트(예: :8000/metrics)를설계를 간단히 YAML로 표현하면 다음과 같습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: random-generator
spec:
replicas: 1
selector:
matchLabels:
app: random-generator
template:
metadata:
labels:
app: random-generator
spec:
volumes:
- name: log-volume
emptyDir: {}
containers:
# 메인 애플리케이션 컨테이너
- name: random-generator
image: your-registry/random-generator:1.0
env:
- name: LOG_FILE
value: /logs/random.log
volumeMounts:
- name: log-volume
mountPath: /logs
# Prometheus Adapter 컨테이너
- name: prometheus-adapter
image: your-registry/prometheus-adapter:1.0
env:
- name: LOG_FILE
value: /logs/random.log
- name: PORT
value: "8000"
ports:
- containerPort: 8000
name: metrics
volumeMounts:
- name: log-volume
mountPath: /logs
로그 수집/정규화 영역에서도 Adapter 패턴은 매우 유용하게 활용될 수 있습니다.
다음과 같은 환경을 생각해 볼 수 있습니다.
각 컨테이너가 로그를 제각각 남깁니다.
어떤 곳은 JSON 형식, 어떤 곳은 단순 텍스트,어떤 곳은 타임스탬프 형식조차 제각각입니다.
이때 중앙 로그 수집기(예: ELK, Loki, Splunk 등)는통일된 형식의 로그를 받을수록 처리와 분석이 쉬워집니다.
이런 상황에서 Pod 안에 로그 Adapter 컨테이너를 하나 더 두고 다음과 같이 동작시킵니다.

이렇게 구성하면,
Adapter 패턴은 사실 Sidecar 패턴의 특수한 형태라고 볼 수 있습니다.
두 패턴 모두 다음과 같은 공통점을 가집니다.
하지만 역할과 목적 측면에서는 차이가 분명합니다.
정리하면, Sidecar가 “옆에서 도와주는 친구”라면, Adapter는 “외부 세계와의 인터페이스를 대신 맡는 통역가”에 가깝습니다.
다음과 같은 상황이라면 Adapter 패턴 적용을 적극적으로 고려해 볼 수 있습니다.
이러한 경우 Adapter 컨테이너 하나만 추가해도, 레거시 코드를 수정하지 않고도 표준화된 인터페이스를 확보할 수 있고전체 시스템에 대한 모니터링/로깅/통합 뷰를 훨씬 쉽게 구성할 수 있습니다.
쿠버네티스 v1.34 기준으로 보았을 때, Adapter 패턴과 직접적으로 맞닿아 있는 기능들을
“Adapter/Sidecar를 어떻게 설계·운영할 것인가”라는 관점에서 정리해 보겠습니다.
v1.34에서는 컨테이너 재시작 동작을 좀 더 세밀하게 제어할 수 있어, Adapter와 메인 컨테이너의 관계를 다음과 같이 설계할 수 있습니다.
결국 “Adapter 컨테이너가 죽었을 때, 시스템 입장에서 무엇을 의미하는가?”를 먼저 정의하고,
그 의미에 맞게 재시작 전략을 함께 설계하는 것이 중요합니다.
v1.34에서는 CEL(공통 표현 언어) 기반 Mutating Admission Policy가 도입되어,
외부 웹훅 없이도 API 서버 내부에서 변이(Mutation) 로직을 적용할 수 있습니다.
Adapter 패턴 관점에서 보면 다음과 같은 활용이 가능합니다.