Virtual Service는 Istio 서비스 메시 내에서 특정 호스트명(Host)으로 접근하는 트래픽에 대한 트래픽 라우팅 규칙을 정의하는 Custom Resource Definition(CRD)입니다.
다시 말해 “어떤 요청이 들어왔을 때 어디로 보내야 하는가?”를 결정하는 트래픽 라우팅 가이드라인이라고 할 수 있습니다. 이를 통해 마이크로서비스 환경에서 서비스 버전을 점진적으로 롤아웃하거나, 특정 사용자 그룹에게만 새로운 기능을 제공하는 등 다양한 시나리오를 구현할 수 있습니다.
Istio Virtual Service는 서비스 메시 환경에서 트래픽을 정교하게 제어하고 관리할 수 있는 핵심 리소스입니다. 이를 통해 개발팀은 마이크로서비스 아키텍처 하에서 신속하고 안전한 배포 전략을 수립할 수 있으며, 다양한 트래픽 패턴, 장애 상황, 성능 테스트에 유연하게 대응할 수 있습니다.
마이크로서비스 아키텍처를 도입하면 서비스 간 통신 경로가 매우 복잡해집니다. 단순히 도메인 기반의 라우팅이 아니라, 요청자(User Agent), HTTP 헤더, 요청 경로(Path), 쿠키 값 등 다양한 조건에 따라 트래픽을 분배하고 관리해야 할 경우가 많습니다. Virtual Service는 이러한 복잡한 조건을 설정 파일로 선언적으로 정의하여, 서비스 메시가 이를 자동으로 처리하도록 합니다.
새로운 버전을 일부 사용자에게만 노출시킨다거나, 특정 비율로 트래픽을 나눠서 새로운 버전이 안정적인지 테스트하는 A/B 테스트 및 카나리 배포(Canary Deployment)가 점점 중요해지고 있습니다. Virtual Service를 활용하면, 트래픽을 특정 백엔드 서비스의 새로운 버전으로 라우팅할지, 기존 버전으로 보낼지 손쉽게 결정할 수 있습니다.
Istio Virtual Service는 단순히 요청을 어디로 보낼지 결정하는 것을 넘어, 로드 밸런싱 전략(라운드 로빈, 난수 선택, 최저 대기 시간 등), 페일오버(Failover) 정책, 지연 시간(Latency) 또는 에러 응답률을 인위적으로 추가하는 Fault Injection 등의 고급 기능도 제공합니다. 이를 통해 대규모 마이크로서비스 환경에서도 안정적인 서비스 품질과 신뢰성을 확보할 수 있습니다.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-virtual-service
spec:
hosts:
- my-service.example.com
gateways:
- my-gateway
http:
- match:
- uri:
prefix: "/v2"
route:
- destination:
host: my-service
subset: v2
- route:
- destination:
host: my-service
subset: v1
새로운 서비스 버전을 10%의 트래픽만 유입되도록 설정한다면 다음과 같이 구성이 가능합니다.