안녕하세요! 👋 오늘은 Kubernetes 환경에서 Istio를 사용할 때, 외부 서비스로 나가는 트래픽을 안전하고 효율적으로 관리하는 방법에 대해 아주 상세하게 파헤쳐 보려고 합니다.
제공해주신 코드는 Istio의 꽃이라 할 수 있는 Egress Gateway를 활용하여, 클러스터 내부의 애플리케이션이 외부의 야후 파이낸스(finance.yahoo.com)에 접근하는 시나리오를 담고 있습니다.
그런데 그냥 접근하는 게 아닙니다! 🤫 애플리케이션은 편하게 HTTP로 요청을 보내지만, 클러스터를 빠져나갈 때는 Istio가 자동으로 안전한 HTTPS로 업그레이드해 주는 TLS Origination(TLS 발신) 구성을 다루고 있습니다.
이 구성이 어떻게 작동하는지, 각 YAML 파일이 어떤 역할을 하는지 하나씩 뜯어볼까요? 🔍

🎯 목표 시나리오
- 우리 앱(Pod)은 외부 세상인 http://finance.yahoo.com (포트 80)으로 요청을 보냅니다.
- 이 요청은 클러스터 밖으로 바로 나가지 않고, 문지기 역할인 Istio Egress Gateway로 먼저 전달됩니다.
- Egress Gateway는 이 HTTP 요청을 받아서, HTTPS(TLS) 로 암호화한 뒤 실제 야후 서버(포트 443)로 전송합니다.
이 방식을 통해 애플리케이션은 인증서 관리나 암호화 복잡성 없이 외부와 안전하게 통신할 수 있게 됩니다. 멋지죠? 😎
🧩 코드 상세 분석
제공된 YAML 코드는 총 4개의 Istio 리소스로 구성되어 있습니다. 각각의 퍼즐 조각이 어떻게 맞춰지는지 살펴보겠습니다.
1️⃣ ServiceEntry: "야후! 넌 내 관리 대상이야"
가장 먼저 등장하는 것은 ServiceEntry입니다. Istio 서비스 메시는 기본적으로 자신이 모르는 외부 세상으로의 트래픽을 차단하거나 제대로 관리하지 못할 수 있습니다.
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: yahoo-ext
spec:
hosts:
- finance.yahoo.com
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
- 역할: Istio의 내부 서비스 레지스트리에 외부 서비스(finance.yahoo.com)를 등록합니다.
- location: MESH_EXTERNAL: 이 서비스가 우리 메시(클러스터) 밖에 있다는 것을 명시합니다. 🌐
- ports & resolution: DNS: 야후 파이낸스가 80(HTTP)과 443(HTTPS) 포트를 사용하며, 이 주소를 찾기 위해 DNS 쿼리를 사용해야 한다고 Istio에게 알려줍니다.
- 💡 요약: "Istio야, finance.yahoo.com이라는 외부 친구가 있는데, 얘랑 통신할 때 80번이랑 443번 포트를 쓸 거야. 잘 관리해 줘!"
2️⃣ Gateway: "Egress 문지기, 이쪽 문을 열어라"
다음은 Gateway 리소스입니다. 여기서 말하는 Gateway는 클러스터 밖으로 나가는 전용 출구인 Egress Gateway Pod에 대한 설정을 의미합니다.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: yahoo-egressgateway
namespace: default
spec:
selector:
istio: egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- finance.yahoo.com
- 역할: 실제 트래픽을 처리하는 Egress Gateway (Envoy 프록시)에게 특정 포트를 열고 대기하라고 지시합니다.
- selector: istio: egressgateway: 이 설정이 누구에게 적용될지 정합니다. 라벨이 istio: egressgateway인 파드(실제 Egress Gateway 인스턴스)가 이 설정을 적용받습니다. 🎯
- servers: Egress Gateway에게 "야후 파이낸스(finance.yahoo.com)로 가는 트래픽을 처리하기 위해 80번 포트(HTTP) 를 열어둬"라고 명령합니다.
- 💡 요약: 클러스터의 출구(Egress Gateway)에 야후행 80번 트래픽이 지나갈 수 있는 문을 활짝 열었습니다. 🚪
3️⃣ DestinationRule: "나갈 땐 HTTPS로 옷을 갈아입어라!" (핵심 ⭐)
이 시나리오에서 가장 중요한 부분 중 하나인 TLS Origination을 담당하는 DestinationRule입니다.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: originate-tls-for-yahoo-com
spec:
host: finance.yahoo.com
trafficPolicy:
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE
- 역할: 목적지(finance.yahoo.com)로 트래픽이 나갈 때 어떤 정책을 적용할지 정의합니다.
- portLevelSettings -> port: 443: 목적지의 443 포트로 향하는 트래픽에 대해서만 설정을 적용합니다.
- tls: mode: SIMPLE: 여기가 핵심입니다! 💥 "443 포트로 나갈 때는 일반적인 TLS(HTTPS) 암호화를 시작해라"는 뜻입니다. Egress Gateway는 이 규칙을 보고 HTTP 요청을 HTTPS 요청으로 업그레이드합니다.
- 💡 요약: "야후의 443 포트로 접속할 때는, 반드시 안전한 HTTPS 보안 코트를 입고 나가거라!" 🔒
4️⃣ VirtualService: "트래픽의 네비게이션 경로"
마지막으로 가장 복잡하지만 중요한 VirtualService입니다. 이 녀석은 트래픽이 어디서 와서 어디로 가야 할지 길을 안내하는 네비게이션 역할을 합니다. 여기서는 두 가지 경로를 정의합니다.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: direct-yahoo-through-egress-gateway
spec:
hosts:
- finance.yahoo.com
gateways:
- yahoo-egressgateway
- mesh
http:
# ... (아래에서 상세 설명)
- gateways: [yahoo-egressgateway, mesh]: 이 라우팅 규칙이 두 곳에 적용된다는 의미입니다.
- mesh: 클러스터 내부의 애플리케이션 사이드카들.
- yahoo-egressgateway: 우리가 위에서 설정한 Egress Gateway.
경로 1: 애플리케이션 → Egress Gateway (내부 이동)
- name: mesh
match:
- port: 80
gateways:
- mesh
route:
- destination:
host: istio-egressgateway.istio-system.svc.cluster.local
port:
number: 80
- 설명: 메시 내부(mesh)의 애플리케이션이 finance.yahoo.com의 80 포트로 요청을 보내면 이를 가로챕니다. 그리고 이 트래픽을 실제 야후가 아닌, 클러스터 내부에 있는 Egress Gateway 서비스의 80번 포트로 돌려버립니다(Redirect).
- 💡 요약: "앱들아, 너네가 야후(HTTP) 부르면 내가 일단 Egress Gateway로 보내줄게." ➡️
경로 2: Egress Gateway → 실제 야후 서버 (외부 이동)
- name: yahoo-egressgateway
match:
- port: 80
gateways:
- yahoo-egressgateway
route:
- destination:
host: finance.yahoo.com
port:
number: 443
- 설명: 트래픽이 yahoo-egressgateway에 80 포트로 도착했을 때 적용되는 규칙입니다. 이제 진짜 목적지인 외부의 finance.yahoo.com으로 보내는데, 중요하게도 목적지 포트를 443(HTTPS 포트)으로 변경합니다.
- 💡 요약: "Egress Gateway야, 80번으로 들어온 야후 트래픽은 실제 야후 주소의 443번 포트로 최종 전송해!" ↗️
🚀 전체 트래픽 흐름 한눈에 보기
이제 이 모든 설정이 합쳐져서 실제로 어떤 일이 벌어지는지 정리해 봅시다.
- 애플리케이션 요청: 내부 Pod가 http://finance.yahoo.com (포트 80) 호출. 🗣️
- 사이드카 개입 (VirtualService - 경로 1): Pod 옆에 있는 Envoy 사이드카가 트래픽을 가로채서 istio-egressgateway 서비스(포트 80)로 보냄.
- Egress Gateway 도착 (Gateway): Egress Gateway Pod가 80번 포트를 열어놓고 기다리다가 트래픽을 수신함. 👂
- 외부 라우팅 결정 (VirtualService - 경로 2): Egress Gateway가 트래픽을 실제 finance.yahoo.com의 443 포트로 보내기로 결정함.
- TLS 암호화 (DestinationRule): 443 포트로 나가려다 보니 DestinationRule이 적용됨. "잠깐! 443은 TLS(HTTPS)로 변환해서 나가야 해!"라고 하며 HTTP를 HTTPS로 암호화함. 🔐
- 최종 탈출: 암호화된 HTTPS 요청이 인터넷을 통해 야후 서버로 안전하게 전송됨. ✈️
✨ 마무리
이 구성을 통해 우리는 애플리케이션 코드를 전혀 수정하지 않고도 외부 통신의 보안성을 높였습니다. 애플리케이션은 단순하게 HTTP 통신만 신경 쓰고, 복잡한 인증서 관리나 보안 접속은 인프라 레벨(Istio)에서 중앙 집중적으로 관리하게 된 것이죠.
이것이 바로 서비스 메시를 사용하는 강력한 이유 중 하나입니다! 👍
궁금한 점이 있다면 언제든 댓글로 남겨주세요!
'클라우드 > Istio' 카테고리의 다른 글
| [Istio] 엥? 내 istio-proxy가 어디 갔지? 🧐 - Kubernetes Native Sidecar 완벽 분석 (0) | 2025.12.19 |
|---|---|
| ICA 시험 완벽 대비! 상황별 Istio 리소스 매핑 치트시트 (VS vs DR 종결) (0) | 2025.11.29 |
| [Istio] 우리 집 문단속하기 🚪: 외부 트래픽 전면 차단과 허용 (ALLOW_ANY vs REGISTRY_ONLY) (0) | 2025.11.29 |
| [Istio] 암호화된 트래픽을 열어보지도 않고 라우팅하는 비결: SNI와 PASSTHROUGH 모드 🔒🚦 (0) | 2025.11.29 |
| [Istio] 인그레스 게이트웨이의 보안 핵심: TLS SIMPLE vs MUTUAL 모드 완벽 정리 🛡️ (0) | 2025.11.29 |