Istio Service Mesh 환경에서 Virtual Service 리소스를 통한 트래픽 관리

Istio Service Mesh 의 트래픽 라우팅 규칙을 사용하면 서비스 간 트래픽 및 API 호출의 흐름을 쉽게 제어할 수 있습니다.
Istio는 회로 차단기 (circuit breaker), timeout, retry와 같은 서비스 수준 속성의 구성을 간소화하고, 백분율 기반 트래픽 분할을 통해 A/B Testing, Canary Rollout, 단계적 Rollout과 같은 중요한 작업을 쉽게 설정할 수 있습니다.
또한 종속 서비스 또는 네트워크의 장애에 대해 애플리케이션의 복원력을 높이는 데 도움이 되는 기본 제공 안정성 기능도 제공합니다.

목차

1. Istio Service Mesh 의 Traffic Management
2. Istio Service Mesh 의 Virtual Service 란?
 2-1. Virtual Service 를 써야하는 이유
3. Istio Service Mesh Virtual Service 예제
 3-1. Virtual Service – host
 3-2. Virtual Service – match
 3-3. Virtual Service – destination
4. NGINX Ingress Controller Service Mesh 환경에서의 Virtual Service

1. Istio Service Mesh 의 Traffic Management

이 서비스 레지스트리를 사용하여 Envoy 프록시는 트래픽을 관련 서비스로 보낼 수 있습니다.
대부분의 마이크로서비스 기반 애플리케이션에는 로드 밸런싱 영역이라고도 하는 서비스 트래픽을 처리하기 위해 각 서비스 워크로드의 여러 인스턴스가 있습니다.
기본적으로 Envoy 프록시는 영역에서 무작위로 선택한 두 호스트에서 Active 요청이 가장 적은 호스트로 각 요청을 라우팅하는 최소 요청 모델을 사용하여 각 서비스의 로드 밸런싱 영역에 트래픽을 분산하므로 가장 부하가 많은 호스트는 다른 호스트보다 부하가 덜 걸릴 때까지 요청을 받지 않습니다.

Istio의 기본 Service Discovery 및 로드 밸런싱은 Service Mesh를 제공하지만, 이는 Istio가 할 수 있는 모든 것이 아닙니다.
사용자는 대부분 Service Mesh 트래픽에 발생하는 상황을 보다 세밀하게 제어하고 싶어합니다.
A/B Testing의 일환으로 특정 비율의 트래픽을 새 버전의 서비스로 보내거나 특정 서비스 인스턴스 하위 집합의 트래픽에 대해 다른 부하 분산 정책을 적용하고 싶을 수 있습니다.
또한 Service Mesh로 들어오고 나가는 트래픽에 특별한 규칙을 적용하거나 Service Mesh의 외부 종속성을 서비스 레지스트리에 추가하고 싶을 수도 있습니다.
이 모든 작업은 Istio Service Mesh의 Traffic Management API를 사용하여 자체 트래픽 구성을 추가하여 수행할 수 있습니다.

2. Istio Service Mesh 의 Virtual Service 란?

Virtual Service는 Destination rules과 함께 Istio의 트래픽 라우팅 기능의 핵심 구성 요소입니다.
Virtual Service를 사용하면 Istio와 플랫폼에서 제공하는 기본 연결 및 검색을 기반으로 요청이 Istio Service Mesh 내의 서비스로 라우팅되는 방식을 구성할 수 있습니다.
각 Virtual Service는 순서대로 평가되는 일련의 라우팅 규칙으로 구성되며, Istio는 Virtual Service에 대한 각 요청을 Service Mesh 내의 특정 실제 대상과 일치시킬 수 있습니다.
사용 사례에 따라 Service Mesh에는 여러 개의 Virtual Service가 필요하거나 Virtual Service가 필요하지 않을 수 있습니다.

2-1. Virtual Service 를 써야하는 이유

Virtual Service는 Istio의 트래픽 관리를 유연하고 강력하게 만드는 데 핵심적인 역할을 합니다.
이는 클라이언트가 요청을 보내는 위치와 실제로 이를 처리하는 대상 워크로드를 강력하게 분리함으로써 가능합니다. 또한 Virtual Service는 이러한 워크로드로 트래픽을 보내기 위한 다양한 트래픽 라우팅 규칙을 풍부하게 지정할 수 있는 방법을 제공합니다.

이것이 왜 유용할까요? 가상 서비스가 없다면, Envoy는 소개에서 설명한 대로 모든 서비스 인스턴스 간에 최소 요청 부하 분산을 사용하여 트래픽을 분배합니다. 하지만 워크로드에 대해 알고 있는 정보를 바탕으로 이 동작을 개선할 수 있습니다. 예를 들어, 일부 워크로드는 서로 다른 버전을 나타낼 수 있습니다. 이는 A/B Testing에서 유용할 수 있으며, 다른 서비스 버전 간에 트래픽 경로를 백분율로 구성하거나 내부 사용자로부터 오는 트래픽을 특정 인스턴스 집합으로 직접 보내고자 할 때 유용할 수 있습니다.

3. Istio Service Mesh Virtual Service 예제

다음 가상 서비스는 요청이 특정 사용자로부터 오는지 여부에 따라 요청을 다른 버전의 서비스로 라우팅합니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v3

3-1. Virtual Service – host

host 필드에는 가상 서비스의 호스트, 즉 이러한 라우팅 규칙이 적용되는 사용자 주소 지정이 가능한 대상의 목록이 나열됩니다. 클라이언트가 서비스에 요청을 보낼 때 사용하는 주소입니다.

hosts:
- reviews

Virtual Service host 이름은 IP 주소, DNS 이름 또는 플랫폼에 따라 짧은 이름(예: Kubernetes 서비스의 짧은 이름)일 수 있으며, 이는 명시적이거나 암시적으로 완전한 도메인 이름(FQDN)으로 해석됩니다.
또한 와일드카드(“*”) 접두사를 사용하여 일치하는 모든 서비스에 대해 단일 라우팅 규칙 세트를 생성할 수 있습니다.
Virtual Service host는 실제로 Istio 서비스 레지스트리의 일부일 필요는 없으며, 단순히 가상의 목적지입니다.
이를 통해 Istio Service Mesh 내부에 라우팅 가능한 항목이 없는 가상 호스트의 트래픽을 모델링할 수 있습니다.

3-2. Virtual Service – match

예제의 첫 번째 라우팅 규칙은 match 필드로 시작합니다. 이 경우 이 라우팅이 ‘jason‘ 사용자의 모든 요청에 적용되도록 하려면 headers, end-userexact 필드를 사용하여 적절한 요청을 라우팅하면 됩니다.

- match:
   - headers:
       end-user:
         exact: jason

3-3. Virtual Service – destination

route 섹션의 destination 필드는 이 조건에 맞는 트래픽의 실제 목적지를 지정합니다.
가상 서비스의 host와 달리, destination의 host는 Istio Service Mesh 의 서비스 레지스트리에서 실제로 존재하는 목적지여야 하며, 그렇지 않으면 Envoy가 트래픽을 어디로 보낼지 알 수 없습니다.
이는 프록시가 있는 Istio Service Mesh 서비스거나 서비스 엔트리를 사용하여 추가된 비 Istio Service Mesh 서비스일 수 있습니다.
아래의 경우 Kubernetes에서 실행되고 있으며, 호스트 이름은 Kubernetes 서비스 이름입니다.

route:
- destination:
    host: reviews
    subset: v2

4. NGINX Ingress Controller Service Mesh 환경에서의 Virtual Service

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: devops-istio
spec:
  hosts:
    - "*"
  gateways:
    - nginx-ingress-gateway
  http:
  - match:
    - uri:
        prefix: /svc1
    rewrite:
      uri: "/"
    route:
    - destination:
        host: webapp-svc1.nginx-ingress.svc.cluster.local
  - match:
    - uri:
        prefix: /svc2
    rewrite:
      uri: "/"
    route:
    - destination:
        host: webapp-svc2.nginx-ingress.svc.cluster.local

해당 YAML 파일은 Istio Service Mesh 환경에서 VirtualService 리소스를 정의하여 특정 URI 패턴을 가진 HTTP 요청을 지정된 서비스로 라우팅합니다.

클라이언트가 /svc1로 시작하는 URI로 요청을 보내면, 이 요청은 nginx-ingress-gateway를 통해 수신됩니다. Istio의 VirtualService 규칙에 따라 이 요청의 URI가 /로 재작성되고, webapp-svc1.nginx-ingress.svc.cluster.local 서비스로 라우팅됩니다.

마찬가지로, 클라이언트가 /svc2로 시작하는 URI로 요청을 보내면, 이 요청도 nginx-ingress-gateway를 통해 수신됩니다. URI가 /로 재작성되고, webapp-svc2.nginx-ingress.svc.cluster.local 서비스로 라우팅됩니다.

webapp-svc는 NGINX로 구성된 파드로 이루어져 있는 서비스입니다.

이를 통해 Istio는 특정 URI 패턴에 따라 트래픽을 적절한 내부 서비스로 투명하게 전달합니다.

Istio Service Mesh - nginx 1
Istio Service Mesh - nginx

Istio Service Mesh의 트래픽 흐름을 시각화 할 수 있는 Kiali 도구를 통해 확인하면 다음과 같이 Virtual Service의 라우팅 규칙에 따라 트래픽이 서비스로 전달되는 것을 확인할 수 있습니다.

Istio Service Mesh 환경에 Virtual Service 리소스를 통한 트래픽 관리 - Kiali를 통한 시각화

Istio 와 NGINX Ingress Controller를 사용하여 Service Mesh 환경에서 라우팅 규칙을 통한 트래픽 관리를 하고 싶으신가요?
지금 NGINX STORE에 문의하여 이와 같은 Service Mesh 사용 사례에 대해 상담 받아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required