본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

OCI상에서 ISTIO를 활용하여 구현한 Service Mesh - #2. 이스티오 작동 방식

Oracle Cloud Infrastructure (OCI) 에서 이스티오(ISTIO)를 활용한 서비스 메쉬(Service Mesh)에 대한 기술 정리 및 이를 데모로 구현한 내용을 정리합니다.

글 순서

1. Overview

2. 이스티오 작동 방식

3. 이스티오 데모 - 사전 준비

4. 이스티오 데모 - 쿠버네티스 대쉬보드 설치/설정

5. 이스티오 데모 - 이스티오 설치, 엔보이 프록시 주입

6. 이스티오 데모 - 샘플 어플리케이션 (Bookinfo) 배포

7. 이스티오 데모 - 카나리 배포

8. 이스티오 데모 - 결함 주입(Fault Injection)

9. 이스티오 데모 - 서비스 시각화 (프로메테우스)

10. 이스티오 데모 - 서비스 시각화 (그라파나)

11. 이스티오 데모 - 서비스 시각화 (키알리)

12. 이스티오 데모 - 서비스 시각화 (예거)

 

REFERENCES

아래 도서 및 사이트를 참조하여 작성한 문서입니다.

  • 도메인 주도 설계로 시작하는 마이크로 서비스 개발 (위키북스)
  • 쿠버네티스 완벽 가이드 (길벗)
  • Istio로 시작하는 서비스 메시 (에이콘)
  • Isitio Documentation

 

이스티오 트래픽 플로우

마이크로서비스 간 통신은 아래와 같이 엔보이를 반드시 통과하게 되어 있으므로 메트릭을 수집하고 트래픽을 제어할 수 있게 됩니다. 위 이스티오 아키텍처 그림 기준으로 살펴보겠습니다.

클라이언트

 > 엔보이 (서비스 A가 속한 파드)

 > 서비스 A

 > 엔보이 (서비스 A가 속한 파드)

 > 엔보이 (서비스 B가 속한 파드)

 > 서비스 B

 > 엔보이 (서비스 B가 속한 파드)

 

이스티오 라우팅 작동 방식

이스티오에서 서비스 요청에 대한 라우팅은 VirtualService와 DestinationRule 컴포넌트를 통해 이루어집니다.

  • 서비스 A는 도메인 이름을 이용해서 서비스 B에 연결을 시도
  • 서비스 B의 FQDN은 Virtual Service로 연결되어 요청에 대한 처리 여부를 결정
  • Destination Rule은 최종 쿠버네티스 서비스를 결정하기 위한 매핑 수행
  • 트래픽이 서비스 B의 해당 버전으로 라우팅

 

Gateway

Gateway는 외부에서 생성된 모든 요청에 서비스 엑세스를 제공하는 역할을 합니다. 대부분의 경우 게이트웨이는 쿠버네티스 로드밸런서와 함께 구성됩니다. 로드밸런서는 쿠버네티스 클러스터 외부에서 엑세스할 수 있는 퍼블릭 IP주소가 있으며, 로드 밸런서는 요청을 받으면 요청에 일치하는 이스티오 게이트웨이에 이를 위임합니다. 그 다음 게이트웨이는 이스티오 트래픽 라우팅을 사용해 요청을 적절한 서비스로 전송합니다.

 

VirtualService

VirtualService로 트래픽 라우팅 규칙을 정의합니다. 아래 설정파일에서는 v1과 v2 서브셋 사이에 트래픽을 분배하고 있습니다. 4개의 요청마다 3개를 이전 버전으로, 1개를 새 버전으로 보냅니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: webservice-wtdist-vs
spec:
  hosts:
    - webservice
  http:
  - route:
    - destination:
        host: webservice
        subset: v2
      weight: 25
    - destination:
        host: webservice
        subset: v1
      weight: 75

 

DestinationRule

VirtualService에서 정한 라우팅 규칙에 대해 해당 트래픽을 DestinationRule로 어떻게 보낼 것인지 결정합니다. 아래 설정파일에서는 두개의 서브셋(v1, v2)의 connectionpool을 구성하고, 풀링된 자원의 최대 수와 연결 타임아웃을 설정했습니다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: webapp-destination
spec:
  host: webservice # interpreted as reviews.foo.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
  subsets:
  - name: v2
    labels:
      version: v6.2
  - name: v1
    labels:
      version: v5.0

 

<END>