일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 클라우드 네이티브
- Kotlin
- 머신러닝
- java
- decorator 패턴
- kubernetes
- spring microservice
- cloud native
- cloud native java
- 클라우드 네이티브 자바
- 동기화
- Spring
- Microservice
- 익명클래스
- MySQL
- ansible
- ingress
- Adapter 패턴
- devops
- CRD
- Semaphore
- 쿠버네티스
- 코틀린
- Algorithm
- nGrinder
- 헬름
- Stress test
- 마이크로서비스
- MSA
- 자바
- Today
- Total
카샤의 만개시기
쿠버네티스 환경의 효율적인 개발 도구 Telepresence 본문
🚀 Telepresence 완전 정복: intercept, replace, wiretap, ingest 기능 비교
쿠버네티스(Kubernetes) 환경에서 로컬 개발을 실서비스와 통합해 테스트하고 싶으신가요?
Telepresence는 마이크로서비스 개발자들에게 가장 유용한 디버깅 도구 중 하나입니다.
이 글에서는 Telepresence의 핵심 기능 4가지인
✅ intercept
, ✅ replace
, ✅ wiretap
, ✅ ingest
를 최신 버전 기준으로 자세히 설명하고 차이점을 비교합니다.
🧭 Telepresence란?
Telepresence는 로컬 개발 환경과 쿠버네티스 클러스터 간의 양방향 연결을 제공하는 오픈소스 도구입니다.
CI/CD 없이도 로컬 코드를 클러스터 트래픽과 연결해 테스트하거나, 클러스터 환경을 로컬로 복제할 수 있습니다.
📌 Telepresence의 핵심 원리
1. 로컬 프로세스를 클러스터에 “프록시”하는 구조
Telepresence는 로컬 개발자의 코드를 Kubernetes 클러스터 내 특정 Pod 대신 실행되도록 구성합니다. 이때 Telepresence는 원래의 Pod를 “잠시 치우고”, 그 위치에서 로컬로 포워딩되는 프록시 Pod를 배치합니다. 이 프록시 Pod는 다음과 같은 역할을 합니다:
• 클러스터의 다른 서비스들과의 통신은 유지
• 네트워크 요청은 로컬 프로세스로 포워딩
• 로컬 개발자는 클러스터에서 실행되는 것처럼 작동
이로 인해 로컬에서 실행되는 애플리케이션이 클러스터 내 다른 서비스와 실시간으로 통신할 수 있게 됩니다.
2. Two-Way Network Proxying (양방향 네트워크 프록시)
• 클러스터 → 로컬: 클러스터에서 들어오는 요청이 Telepresence의 프록시를 통해 로컬 개발 환경으로 전달됨.
• 로컬 → 클러스터: 로컬 앱이 클러스터의 다른 서비스와 직접 통신 가능.
이 구조는 VPN-like 네트워크 터널을 통해 이루어지며, socat, ssh, iptables 등을 사용한 low-level 네트워크 조작이 포함될 수 있습니다.
🤖 Traffic Manager가 필요한 이유
1. 통신 제어 허브 (Control Plane 역할):
• Telepresence 클라이언트들과 통신하며, 어떤 트래픽을 어떤 개발자에게 라우팅할지를 결정합니다.
• 여러 개발자가 동일한 서비스에 대해 작업 중일 때, 요청 분산 또는 라우팅 정책을 관리합니다.
2. Proxy 대상 Pod 관리:
• 원래의 Pod를 중지하거나 대체하지 않고, sidecar 형태 또는 DNS 조작을 통해 로컬 프로세스를 끼워넣습니다.
3. Preview URL 지원:
• GitHub PR이나 GitLab Merge Request와 같은 이벤트에 맞춰 Preview 환경을 자동으로 구성하는 기능도 제공합니다.
왜 필요할까?
• 트래픽 라우팅이나 격리 없이 단순히 로컬 개발 환경을 Kubernetes에 연결하는 것은 위험하고 복잡함.
• Traffic Manager는 멀티 사용자 개발 환경에서 충돌 방지, 상태 유지, 자동 복구 등의 기능을 가능하게 합니다.
🧩 프록시 패턴인가?
정확히는 프록시 패턴 + 네트워크 터널링 + sidecar injection의 혼합 구조입니다.
- 프록시 패턴: 클러스터 서비스로 들어오는 요청을 가로채서 로컬에 전달
- DNS / Env override: 클러스터 내 서비스 검색을 조작하여 로컬로 트래픽이 흐르도록 설정
- 데이터 평면 + 제어 평면 분리: Traffic Manager가 제어 평면 역할, 실제 트래픽은 프록시 Pod 또는 터널링된 네트워크 경로를 통해 전달
🔧 간단한 흐름 예시
- telepresence connect 실행 → 클러스터와 네트워크 터널 연결
- telepresence intercept <svc> → 대상 서비스의 트래픽을 로컬로 라우팅 설정
- 로컬 프로세스 실행 → 프록시 Pod가 해당 요청을 가로채어 로컬로 전달
- Traffic Manager가 라우팅, 프록시 상태, Preview URL 등을 관리
🔌 Telepresence의 Engagement Mode 4가지
1️⃣ intercept – 서비스 일부 트래픽만 로컬에서 처리
- 클러스터의 서비스는 그대로 유지
- 특정 트래픽만 로컬로 전달받아 디버깅 가능
telepresence intercept user-api --port 8080:8080
📌 참고: 오픈소스 버전에서는 HTTP 메서드나 path 기반 필터링은 불가능합니다 (Enterprise에서는 가능)
2️⃣ replace – 클러스터 서비스 전체를 로컬 앱으로 대체
- 기존 Deployment를 스케일 다운
- 로컬 앱이 클러스터 트래픽을 100% 처리
telepresence intercept user-api --replace --port 8080:8080
⚠️ 실서비스 대체이므로 프로덕션에서는 사용 주의!
3️⃣ wiretap – 로컬에서 클러스터 내부 네트워크에 접근
- 로컬 앱이 클러스터 내 DB, API, 서비스 등에 접근 가능
- DNS도 로컬에서 해석됨
telepresence connect
curl http://orders.default.svc.cluster.local
❗ wiretap은 "클러스터 → 로컬" 트래픽 리디렉션이 아닙니다!
👉 클러스터 내부에 있는 것처럼 로컬에서 접근하는 기능입니다.
4️⃣ ingest – 클러스터 컨테이너의 설정을 로컬로 복제
- 환경 변수, 볼륨, 시크릿 등을 로컬에 복사
- 로컬 애플리케이션이 동일한 실행 환경에서 실행 가능
telepresence ingest orders-api \
--container orders \
--env-file /tmp/orders.env \
--mount /tmp/orders-volumes
source /tmp/orders.env
python app.py
🧪 기능 비교 요약표
기능 | 트래픽 방향 | 목적 | 예시 용도 |
---|---|---|---|
intercept | 클러스터 → 로컬 일부 | 일부 요청만 로컬에서 테스트 | 기능 분기 디버깅 |
replace | 클러스터 → 로컬 전체 | 전체 서비스 로컬 대체 | 통합 테스트 |
wiretap | 로컬 → 클러스터 | 클러스터 네트워크 접근 | DB 연동, API 호출 |
ingest | 클러스터 → 로컬 설정 | 환경변수, 볼륨 복제 | config 재현 |
Telepresence는 마이크로서비스 환경에서 로컬 개발의 생산성과 디버깅 경험을 극대화해주는 도구입니다.
각 모드의 특성을 정확히 이해하고 적절히 조합하면 쿠버네티스 기반 개발 효율을 획기적으로 높일 수 있습니다.
📌 Telepresence 상태 관리 명령어
telepresence list # 현재 인터셉트 상태 확인
telepresence leave # 특정 인터셉트 해제
telepresence quit # 전체 세션 종료
'DevOps > Docker & K8S' 카테고리의 다른 글
Skaffold를 이용한 쿠버네티스 개발부터 디버깅·배포까지 (0) | 2025.07.13 |
---|---|
Kubernetes Ephemeral 컨테이너 완전 정복 🚀 (2) | 2025.07.10 |
Ingress configuration-snippet vs server-snippet (0) | 2021.04.19 |
Kubernetes Operator (0) | 2020.12.07 |
ReplicaSet vs Replication Controller (레플리카세트 vs 레플리케이션 컨트롤러) (0) | 2020.06.18 |