- Published on
Istio Ambient vs Sidecar — 2026년 서비스메시 아키텍처 선택 가이드
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 들어가며
- 사이드카 모델의 비용 — 무엇이 문제였나
- Ambient 아키텍처 해부
- 데이터 경로 비교 — 패킷은 어떻게 흐르는가
- 기능 패리티 현황 — 2026년 기준
- 리소스·성능 비교 — 산수로 따져보기
- 마이그레이션 전략 — 네임스페이스 단위 점진 전환
- 설치 실전
- Cilium과의 관계 — 충돌인가 공존인가
- 사이드카가 여전히 맞는 경우
- 의사결정 트리
- 트러블슈팅
- 도입 체크리스트
- 마치며
- 참고 자료
들어가며
서비스메시를 운영해 본 팀이라면 한 번쯤 이런 질문을 받아봤을 것입니다. "파드가 500개인데 왜 Envoy 컨테이너가 500개 더 떠 있나요?" 사이드카 모델은 서비스메시의 표준 아키텍처였지만, 그 대가는 결코 작지 않았습니다. 모든 파드에 프록시를 하나씩 붙이는 방식은 리소스를 두 배 가까이 소비하고, 메시 업그레이드 때마다 전체 워크로드 재시작을 강요하며, 주입(injection) 설정 실수 하나로 배포 전체를 멈추게 만들었습니다.
Istio Ambient 모드는 이 문제에 대한 구조적인 답입니다. 2024년 말 Istio 1.24에서 GA(General Availability)에 도달한 이후, 2026년 현재 Ambient는 신규 메시 구축의 기본 선택지로 자리 잡아가고 있습니다. 하지만 "Ambient가 무조건 정답"이라는 단순한 결론은 위험합니다. 사이드카가 여전히 더 적합한 워크로드가 분명히 존재하고, 두 모드를 혼합 운영해야 하는 전환기가 대부분의 조직에서 1년 이상 지속되기 때문입니다.
이 글에서는 사이드카 모델의 비용을 숫자로 짚어보고, Ambient 아키텍처(ztunnel, waypoint, HBONE)를 해부한 뒤, 두 모드의 데이터 경로를 패킷 흐름 수준에서 비교합니다. 마지막으로 네임스페이스 단위 점진 전환 전략과 의사결정 트리, 트러블슈팅 방법까지 실무 관점에서 정리합니다.
사이드카 모델의 비용 — 무엇이 문제였나
리소스가 두 배로 든다
사이드카 모델에서는 모든 애플리케이션 파드에 istio-proxy(Envoy) 컨테이너가 주입됩니다. Envoy 사이드카 하나의 메모리 사용량은 설정 규모에 따라 다르지만, 메시 전체의 서비스 디스커버리 정보를 들고 있어야 하므로 클러스터가 커질수록 함께 커집니다. 간단한 산수를 해보겠습니다.
가정:
- 클러스터 내 파드 수: 500개
- 사이드카 1개당 메모리: 평균 120MiB (서비스 1,000개 규모 메시 기준)
- 사이드카 1개당 CPU request: 100m
사이드카 모델 총 오버헤드:
메모리 = 500 x 120MiB = 60,000MiB = 약 58.6GiB
CPU request = 500 x 100m = 50 vCPU (request 기준 노드 점유)
노드가 16GiB 메모리라면:
사이드카 메모리만으로 노드 약 4대 분량을 소비
CPU request 50 vCPU는 스케줄링 가능 용량을 그만큼 잠식
여기서 중요한 것은 실제 사용량보다 request 예약분입니다. 사이드카에 보수적인 request를 주면 클러스터 스케줄링 용량이 잠식되고, 너무 작게 주면 트래픽 피크 때 프록시가 OOMKilled되어 애플리케이션까지 함께 죽습니다. Sidecar 리소스 튜닝은 그 자체로 하나의 운영 업무였습니다.
업그레이드가 고통스럽다
사이드카는 파드 안에 들어 있으므로, 프록시 버전을 올리려면 파드를 재시작해야 합니다. 즉 Istio 컨트롤 플레인을 1.25에서 1.26으로 올리는 작업은 단순히 istiod를 교체하는 것으로 끝나지 않고, 메시에 속한 모든 워크로드의 롤링 재시작을 동반합니다.
사이드카 업그레이드 절차 (canary revision 방식):
1. istiod 1.26을 revision 태그로 신규 설치 (기존 1.25와 병행)
2. 네임스페이스 라벨을 새 revision으로 변경
3. 해당 네임스페이스의 모든 Deployment를 rollout restart
4. 전 네임스페이스 반복 — 파드 5,000개 클러스터라면 수 시간~수 일
5. 구버전 istiod 제거
문제점:
- 재시작이 불가능하거나 비싼 워크로드(StatefulSet, 배치, 세션 유지)가 발목을 잡음
- 재시작 누락 파드는 구버전 프록시로 잔류 → 버전 스큐(skew) 발생
- 업그레이드 주기가 분기 1회 이상이면 이 비용이 상시 운영 부담이 됨
주입은 생각보다 자주 깨진다
사이드카 주입은 mutating webhook으로 동작합니다. 네임스페이스 라벨, 파드 어노테이션, webhook 설정, revision 태그가 모두 맞아떨어져야 하고, 하나라도 어긋나면 "어떤 파드는 메시 안, 어떤 파드는 메시 밖"인 상태가 됩니다. 이 상태에서 STRICT mTLS를 켜면 주입 안 된 파드의 통신이 전부 끊깁니다. 또한 Job이 사이드카 때문에 종료되지 않는 문제(메인 컨테이너는 끝났는데 istio-proxy가 살아 있어 Job이 Completed가 되지 않는 현상)는 사이드카 시대의 대표적인 만성 질환이었습니다. Kubernetes 네이티브 사이드카 컨테이너(initContainer의 restartPolicy Always)가 이를 완화했지만, 근본적으로 "프록시가 파드 생명주기에 끼어든다"는 구조 자체의 문제였습니다.
Ambient 아키텍처 해부
Ambient 모드의 핵심 아이디어는 프록시를 파드에서 떼어내 인프라 레이어로 내리는 것입니다. 그리고 L4와 L7을 분리해, 모든 워크로드가 L7 프록시 비용을 강제로 내지 않도록 합니다.
두 개의 레이어: ztunnel과 waypoint
+----------------------------------------------------------------------+
| Kubernetes 클러스터 |
| |
| Node A Node B |
| +------------------------------+ +-----------------------------+ |
| | Pod: app-a Pod: app-b | | Pod: app-c | |
| | (사이드카 없음) (사이드카 없음)| | (사이드카 없음) | |
| | | | | | | | |
| | v v | | v | |
| | +------------------------+ | | +-----------------------+ | |
| | | ztunnel (DaemonSet) |==|====|==| ztunnel (DaemonSet) | | |
| | | L4: mTLS, TCP 텔레메트리| | HBONE | L4: mTLS, L4 인가 | | |
| | +------------------------+ | | +-----------------------+ | |
| +------------------------------+ +-----------------------------+ |
| |
| L7 기능이 필요한 네임스페이스에만 선택적으로: |
| +------------------------------------+ |
| | waypoint proxy (Envoy, Deployment) | |
| | L7: HTTP 라우팅, 재시도, L7 인가, | |
| | HTTP 텔레메트리 | |
| +------------------------------------+ |
| |
| +----------------+ |
| | istiod (제어부) | --- xDS/인증서 ---> ztunnel, waypoint |
| +----------------+ |
+----------------------------------------------------------------------+
- ztunnel(zero-trust tunnel): 노드마다 하나씩 뜨는 DaemonSet입니다. Rust로 작성된 경량 프록시로, Envoy가 아닙니다. 역할은 의도적으로 L4에 한정됩니다 — 워크로드 간 mTLS 암호화, SPIFFE 신원 기반 L4 인가, TCP 수준 텔레메트리. ztunnel은 노드 위 모든 메시 파드의 트래픽을 대신 암호화하지만, HTTP를 파싱하지 않으므로 메모리 사용량이 파드 수가 아니라 연결 수에 비례하는 수준으로 작습니다.
- waypoint proxy: L7 기능(HTTP 헤더 기반 라우팅, 재시도, 타임아웃, L7 AuthorizationPolicy, HTTP 메트릭)이 필요한 네임스페이스 또는 서비스 어카운트 단위로 배포하는 Envoy 기반 프록시입니다. Kubernetes Gateway API의 Gateway 리소스로 선언하며, 일반 Deployment이므로 HPA로 독립적으로 스케일할 수 있습니다.
이 분리가 Ambient의 경제성을 만듭니다. 실제 운영에서 L7 정책이 필요한 서비스는 전체의 일부입니다. 나머지 대다수는 "mTLS와 기본 텔레메트리만 있으면 충분"한데, 사이드카 모델은 이들에게도 풀 Envoy 비용을 부과했습니다. Ambient는 L4를 기본 제공(ztunnel)하고 L7은 쓰는 만큼만(waypoint) 비용을 내는 구조입니다.
HBONE — 메시 내부 터널 프로토콜
Ambient에서 노드 간 트래픽은 HBONE(HTTP-Based Overlay Network Environment) 터널로 흐릅니다. HBONE은 HTTP/2 CONNECT 메서드를 사용해 mTLS 연결 위에 원본 TCP 스트림을 캡슐화하는 프로토콜로, 포트 15008을 사용합니다.
HBONE 터널 구조 (포트 15008):
+-------------------------------------------------------+
| TCP (노드 A ztunnel -> 노드 B ztunnel, 목적지 :15008) |
| +---------------------------------------------------+|
| | mTLS (SPIFFE 신원 상호 검증, 클라이언트/서버 인증서) ||
| | +-----------------------------------------------+ ||
| | | HTTP/2 | ||
| | | CONNECT 요청: 목적지 파드 IP:포트 지정 | ||
| | | +-------------------------------------------+| ||
| | | | 원본 애플리케이션 TCP 바이트스트림 || ||
| | | +-------------------------------------------+| ||
| | +-----------------------------------------------+ ||
| +---------------------------------------------------+|
+-------------------------------------------------------+
HTTP/2의 스트림 다중화 덕분에 같은 노드 쌍 사이의 여러 워크로드 연결이 하나의 mTLS 연결을 공유할 수 있어, 연결 수와 핸드셰이크 비용이 줄어듭니다. 또한 CONNECT 헤더에 원래 목적지와 신원 정보가 실리므로, 수신 측 ztunnel은 패킷을 열어보지 않고도 L4 인가 판단을 내릴 수 있습니다.
트래픽 리다이렉션 — 사이드카와 무엇이 다른가
사이드카 모델은 파드 네트워크 네임스페이스 안에서 iptables REDIRECT로 트래픽을 istio-proxy로 돌렸습니다. Ambient는 istio-cni 노드 에이전트가 파드의 네트워크 네임스페이스 안에 리다이렉션 규칙을 설치하되, 트래픽을 같은 노드의 ztunnel 소켓으로 전달합니다. 파드 스펙은 전혀 변경되지 않으므로 재시작 없이 메시 편입/이탈이 가능합니다. 네임스페이스에 라벨 하나를 붙이는 것이 전부입니다.
# 네임스페이스를 ambient 메시에 편입 — 파드 재시작 불필요
kubectl label namespace payments istio.io/dataplane-mode=ambient
# 메시에서 제외
kubectl label namespace payments istio.io/dataplane-mode-
데이터 경로 비교 — 패킷은 어떻게 흐르는가
사이드카 모드의 요청 경로
[사이드카 모드] app-a (Node A) -> app-b (Node B) HTTP 호출
app-a 컨테이너
| (1) localhost 아웃바운드, iptables가 가로챔
v
app-a 파드의 istio-proxy (Envoy) <- L4+L7 처리 (홉 1)
| (2) mTLS 암호화, 라우팅/재시도/텔레메트리
v
(노드 간 네트워크, mTLS)
|
v
app-b 파드의 istio-proxy (Envoy) <- L4+L7 처리 (홉 2)
| (3) mTLS 복호화, 인가 검사, L7 텔레메트리
v
app-b 컨테이너
프록시 홉: 2 (양쪽 모두 항상 L7 파싱)
Ambient 모드의 요청 경로 — L4만 필요한 경우
[Ambient, waypoint 없음] app-a (Node A) -> app-b (Node B) TCP/HTTP 호출
app-a 컨테이너
| (1) 아웃바운드, istio-cni 규칙이 노드 ztunnel로 리다이렉트
v
Node A ztunnel <- L4 처리 (홉 1)
| (2) HBONE 터널 수립 (mTLS, HTTP/2 CONNECT, :15008)
v
Node B ztunnel <- L4 처리 (홉 2)
| (3) 복호화, L4 인가 검사 후 파드로 전달
v
app-b 컨테이너
프록시 홉: 2 (단, 둘 다 경량 L4 — HTTP 파싱 없음)
Ambient 모드의 요청 경로 — waypoint 경유
[Ambient + waypoint] app-a -> app-b (app-b 네임스페이스에 waypoint 있음)
app-a 컨테이너
v
Node A ztunnel ── HBONE ──> waypoint 파드 (Envoy) <- L7 처리
| HTTP 라우팅, 재시도,
| L7 인가, 텔레메트리
v
── HBONE ──> 목적지 노드 ztunnel
v
app-b 컨테이너
프록시 홉: 3 (ztunnel -> waypoint -> ztunnel)
핵심: waypoint는 "목적지 측" 리소스 — 목적지 서비스의 정책을 집행
여기서 중요한 설계 원칙 하나를 짚어야 합니다. Ambient에서 waypoint는 목적지(서비스 생산자) 측에 속합니다. 사이드카 모델에서는 클라이언트 측 프록시가 라우팅과 재시도를 수행했지만, Ambient에서는 목적지 서비스를 소유한 팀이 자기 서비스의 L7 정책을 자기 waypoint에서 집행합니다. 정책 소유권이 명확해지는 장점이 있지만, 사이드카에서 클라이언트 측 정책에 의존하던 설정(예: 호출자별 다른 타임아웃)은 재설계가 필요할 수 있습니다.
기능 패리티 현황 — 2026년 기준
Ambient가 GA에 도달한 이후 릴리스를 거듭하며 사이드카와의 기능 격차는 빠르게 줄었습니다. 2026년 기준 제가 확인한 범위의 현황입니다(정확한 상태는 사용 중인 버전의 공식 문서에서 재확인하시기 바랍니다).
| 기능 | 사이드카 | Ambient | 비고 |
|---|---|---|---|
| mTLS (메시 내 암호화) | 지원 | 지원 | ztunnel이 L4에서 제공 |
| L4 AuthorizationPolicy | 지원 | 지원 | ztunnel에서 집행 |
| L7 AuthorizationPolicy | 지원 | 지원 | waypoint 필요 |
| HTTP 라우팅/카나리 | 지원 | 지원 | waypoint 필요 |
| 재시도/타임아웃/서킷브레이커 | 지원 | 지원 | waypoint 필요 |
| RequestAuthentication (JWT) | 지원 | 지원 | waypoint 필요 |
| 멀티클러스터 | 성숙 | 진행 중 | Ambient 멀티클러스터는 알파→베타 단계로 발전 중 |
| VM 워크로드 편입 | 지원 | 제한적 | 사이드카가 우위인 영역 |
| EnvoyFilter 커스터마이징 | 지원 | 부분적 | waypoint 대상으로만 일부 적용 가능 |
| Sidecar 리소스(스코프 축소) | 지원 | 불필요 | ztunnel은 온디맨드 구성으로 대체 |
요약하면, 단일 클러스터에서 mTLS + L4/L7 정책 + 트래픽 관리라는 핵심 시나리오는 패리티에 도달했습니다. 격차가 남은 곳은 멀티클러스터 성숙도, VM 편입, EnvoyFilter 수준의 깊은 커스터마이징입니다.
리소스·성능 비교 — 산수로 따져보기
앞의 500 파드 예제를 Ambient로 다시 계산해 보겠습니다.
가정:
- 파드 500개, 노드 20대
- ztunnel 1개당 메모리: 평균 50MiB (연결 수에 따라 변동, L4만 처리)
- L7 정책이 필요한 네임스페이스: 5개
- waypoint 1개당: replica 2, 각 200MiB (Envoy, HPA로 확장)
Ambient 총 오버헤드:
ztunnel = 20노드 x 50MiB = 1,000MiB ≈ 1GiB
waypoint = 5ns x 2replica x 200MiB = 2,000MiB ≈ 2GiB
합계 ≈ 3GiB
사이드카 모델: ≈ 58.6GiB (앞서 계산)
절감: 약 95% (이 시나리오 기준)
물론 이 산수는 Ambient에 유리한 시나리오입니다. 정직하게 반대 방향도 따져봐야 합니다.
- 지연 시간: L4 경로(ztunnel만 경유)는 사이드카보다 빠르거나 비슷합니다. 그러나 waypoint 경유 경로는 홉이 3개라서, 사이드카(홉 2)보다 길어질 수 있습니다. waypoint가 다른 노드에 있으면 노드 간 왕복이 추가됩니다.
- 장애 반경: 사이드카는 프록시 장애가 해당 파드 하나에 국한됩니다. ztunnel이 죽으면 그 노드의 모든 메시 트래픽이 영향을 받습니다. ztunnel은 그만큼 단순하고 안정적으로 설계되었지만, 노드 단위 장애 도메인이라는 사실은 운영 설계(PodDisruptionBudget, 우선순위 클래스, 모니터링)에 반영해야 합니다.
- 노이지 네이버: 한 노드 위 여러 테넌트의 트래픽이 같은 ztunnel을 공유하므로, 극단적인 트래픽을 내는 워크로드가 같은 노드 워크로드의 메시 경로에 영향을 줄 수 있습니다.
마이그레이션 전략 — 네임스페이스 단위 점진 전환
사이드카에서 Ambient로의 전환은 빅뱅이 아니라 네임스페이스 단위 점진 전환이 정석입니다. Istio는 같은 메시 안에서 사이드카 워크로드와 Ambient 워크로드의 혼합 운영을 지원하며, 두 모드 간 통신도 mTLS로 상호 운용됩니다.
권장 전환 순서:
단계 0: 사전 점검
- Istio를 Ambient 지원 안정 버전으로 업그레이드
- istio-cni, ztunnel 컴포넌트 설치 (기존 사이드카 트래픽에 영향 없음)
- EnvoyFilter 사용처 전수 조사 — Ambient 비호환 항목 식별
단계 1: 저위험 네임스페이스 1개 선정 (내부 도구, 스테이징)
- 해당 ns 워크로드의 사이드카 주입 라벨 제거 + rollout restart
- istio.io/dataplane-mode=ambient 라벨 부여
- L7 정책이 있었다면 waypoint 배포 후 정책 재바인딩
- 1~2주 관찰: mTLS 메트릭, 오류율, p99 지연
단계 2: 트래픽 패턴이 단순한(L4 위주) 네임스페이스 확대
- waypoint 없이 ztunnel만으로 운영되는 영역부터
단계 3: L7 정책이 복잡한 핵심 서비스
- waypoint 용량 산정(HPA), 정책 동작 검증 후 전환
단계 4: 사이드카 잔존 영역 확정
- VM 연동, EnvoyFilter 의존 워크로드는 사이드카 유지 결정 가능
- 혼합 운영을 공식 상태로 문서화
전환 중 가장 흔한 실수는 사이드카 주입 라벨을 남겨둔 채 ambient 라벨을 붙이는 것입니다. 한 네임스페이스에서 두 모드가 동시에 켜지면 안 되므로, 전환 스크립트에서 라벨 상태를 반드시 원자적으로 관리해야 합니다.
# 전환 전 상태 확인 — 두 라벨이 공존하면 안 됨
kubectl get namespace payments -o jsonpath='{.metadata.labels}'
# 사이드카 주입 해제 (revision 라벨 사용 시 해당 라벨 제거)
kubectl label namespace payments istio-injection-
# 파드에서 사이드카 제거
kubectl rollout restart deployment -n payments
# 재시작 완료 후 ambient 편입
kubectl label namespace payments istio.io/dataplane-mode=ambient
설치 실전
Helm으로 Ambient 프로파일 설치
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
# 1) CRD 및 베이스
helm install istio-base istio/base -n istio-system --create-namespace --wait
# 2) istiod — ambient 프로파일
helm install istiod istio/istiod -n istio-system \
--set profile=ambient --wait
# 3) CNI 노드 에이전트 — 트래픽 리다이렉션 담당
helm install istio-cni istio/cni -n istio-system \
--set profile=ambient --wait
# 4) ztunnel DaemonSet
helm install ztunnel istio/ztunnel -n istio-system --wait
istioctl을 선호한다면 한 줄로도 가능합니다.
istioctl install --set profile=ambient --skip-confirmation
waypoint 배포
waypoint는 Kubernetes Gateway API의 Gateway 리소스로 선언합니다. istioctl 헬퍼를 쓰거나 YAML을 직접 적용합니다.
# 네임스페이스용 waypoint 생성 + 해당 ns 트래픽이 waypoint를 쓰도록 편입
istioctl waypoint apply -n payments --enroll-namespace
# 위 명령과 동등한 선언적 YAML
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: waypoint
namespace: payments
labels:
istio.io/waypoint-for: service # service | workload | all
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
---
# 네임스페이스가 이 waypoint를 사용하도록 라벨링 (enroll-namespace와 동일 효과)
# kubectl label ns payments istio.io/use-waypoint=waypoint
특정 서비스만 waypoint를 경유시키고 싶다면 Service 객체에 istio.io/use-waypoint 라벨을 붙입니다. 네임스페이스 라벨보다 세밀한 단위가 우선합니다.
Cilium과의 관계 — 충돌인가 공존인가
Cilium을 CNI로 쓰는 클러스터에서 Ambient를 올릴 수 있는지는 자주 받는 질문입니다. 결론부터 말하면 가능하지만 역할 분담을 명확히 해야 합니다.
- CNI 호환: istio-cni는 CNI 플러그인 체인에 끼어드는 방식이므로 Cilium 위에서 동작합니다. 단, Cilium 설정에서 호환에 필요한 옵션(예: 소켓 기반 로드밸런싱의 호스트 네임스페이스 한정 — socketLB.hostNamespaceOnly)을 조정해야 하는 사례가 알려져 있으므로, 두 프로젝트의 호환성 문서를 버전에 맞게 확인해야 합니다.
- 겹치는 영역: Cilium도 자체적으로 mTLS류 암호화(WireGuard/IPsec), L4 네트워크 정책, L7 가시성(Hubble)을 제공합니다. Istio Ambient와 기능이 겹치는 부분이 있으므로, "암호화는 어느 레이어가 담당하는가", "L4 정책은 NetworkPolicy인가 AuthorizationPolicy인가"를 팀 차원에서 한 가지로 정해야 이중 정책으로 인한 디버깅 지옥을 피할 수 있습니다.
- 실용적 분담안: Cilium은 CNI/네트워크 정책/노드 수준 가시성, Istio Ambient는 워크로드 신원 기반 mTLS와 L7 트래픽 관리 — 이렇게 레이어로 나누는 구성이 현장에서 가장 무난했습니다.
사이드카가 여전히 맞는 경우
Ambient가 기본값이 되어가는 흐름 속에서도, 다음 조건에서는 사이드카가 여전히 합리적입니다.
- EnvoyFilter로 깊은 커스터마이징을 하는 워크로드 — Lua/WASM 필터, 비표준 프로토콜 처리 등은 사이드카 쪽이 자유롭습니다.
- VM 워크로드가 메시의 1급 시민이어야 하는 환경 — VM 편입은 사이드카 모델의 성숙도가 높습니다.
- 파드 단위 장애 격리가 계약 수준으로 요구되는 경우 — 노드 공유 프록시(ztunnel)가 규제·감사 요건상 받아들여지지 않는 조직이 있습니다.
- 클라이언트 측 L7 정책에 깊이 의존하는 아키텍처 — 호출자별 라우팅/재시도 로직을 단기간에 재설계하기 어려운 경우.
- 멀티클러스터 고급 토폴로지를 당장 운영 중인 경우 — Ambient 멀티클러스터가 본인 요구 수준의 성숙도에 도달했는지 버전별로 검증이 필요합니다.
의사결정 트리
신규 메시 구축인가?
├─ 예 → EnvoyFilter/VM/고급 멀티클러스터 요구가 있는가?
│ ├─ 없음 → Ambient로 시작 (권장 기본값)
│ └─ 있음 → 해당 워크로드만 사이드카, 나머지 Ambient 혼합
└─ 아니오 (기존 사이드카 메시 운영 중)
→ 사이드카 운영 고통(리소스/업그레이드)이 큰가?
├─ 크다 → 네임스페이스 단위 점진 전환 시작
│ L4 위주 ns부터 → L7 ns는 waypoint 검증 후
└─ 작다 → 현상 유지 + 신규 ns만 Ambient로 (점진 수렴)
트러블슈팅
ztunnel 상태와 로그 확인
# ztunnel 파드 확인
kubectl get pods -n istio-system -l app=ztunnel -o wide
# 특정 노드 ztunnel 로그 — 워크로드 편입/HBONE 연결 이벤트 확인
kubectl logs -n istio-system ztunnel-abcde --tail=100
# ztunnel이 인지한 워크로드 목록 (istioctl)
istioctl ztunnel-config workloads
istioctl ztunnel-config services
istioctl ztunnel-config certificates # 워크로드 인증서 발급 상태
ztunnel-config workloads 출력에서 PROTOCOL 열이 HBONE이면 해당 워크로드가 메시에 편입된 것이고, TCP면 평문 통과(메시 밖) 상태입니다. "라벨은 붙였는데 mTLS가 안 된다" 류의 문제는 대부분 여기서 갈립니다.
istioctl analyze와 흔한 증상
# 설정 정합성 진단 — 모드 혼용, waypoint 미바인딩 등 검출
istioctl analyze -n payments
# waypoint가 정책/라우트를 받았는지 확인 (waypoint는 Envoy이므로 proxy-config 사용 가능)
istioctl proxy-config routes deploy/waypoint -n payments
| 증상 | 흔한 원인 | 확인 방법 |
|---|---|---|
| 편입 후에도 평문 통신 | dataplane-mode 라벨 오타, istio-cni 미설치 | ztunnel-config workloads의 PROTOCOL 열 |
| L7 정책이 동작 안 함 | waypoint 미배포 또는 use-waypoint 미바인딩 | Gateway 리소스 상태, istioctl analyze |
| 간헐적 연결 끊김 | ztunnel 재시작(OOM), PDB 미설정 | ztunnel 재시작 횟수, 리소스 사용량 |
| Job 파드 행 | (Ambient에서는 해당 없음 — 사이드카 잔존 ns인지 확인) | 네임스페이스 모드 라벨 |
| 사이드카·ambient 혼선 | 한 ns에 주입 라벨과 ambient 라벨 공존 | ns 라벨 전수 점검 |
도입 체크리스트
- Istio 버전이 Ambient GA 이후 안정 버전인지 확인했다
- istio-cni와 기존 CNI(Cilium 등)의 호환 설정을 버전 문서로 검증했다
- EnvoyFilter, VM 편입, 멀티클러스터 의존성을 전수 조사했다
- 전환 대상 네임스페이스의 모드 라벨 상태를 원자적으로 관리하는 절차를 만들었다
- L7 정책이 필요한 네임스페이스를 식별하고 waypoint 용량(HPA)을 산정했다
- ztunnel에 PodDisruptionBudget과 모니터링(재시작, 메모리)을 설정했다
- 혼합 운영 기간의 mTLS 상호 운용을 스테이징에서 검증했다
- 전환 단계별 관찰 지표(오류율, p99, mTLS 비율)와 롤백 절차를 문서화했다
- 노드 공유 프록시 구조가 보안·감사 요건에 부합하는지 검토했다
마치며
사이드카 모델은 서비스메시를 대중화했지만, "모든 파드에 풀 L7 프록시"라는 비용 구조는 메시 도입의 가장 큰 장벽이기도 했습니다. Ambient는 L4(ztunnel)와 L7(waypoint)을 분리해 이 비용을 쓰는 만큼만 내는 구조로 바꿨고, 파드 재시작 없는 메시 편입과 인프라 레이어 업그레이드라는 운영상 이점까지 더했습니다.
2026년의 현실적인 결론은 이렇습니다. 신규 구축은 Ambient를 기본값으로 검토하되, EnvoyFilter·VM·고급 멀티클러스터 같은 사이드카 우위 영역이 있다면 혼합 운영을 두려워하지 마시기 바랍니다. 기존 메시는 네임스페이스 단위로 천천히, 지표를 보면서 옮기면 됩니다. 아키텍처 선택은 한 번의 결정이 아니라 워크로드별 분류 작업에 가깝습니다.