Istio 트래픽 관리

이전글: Istio 준비하기 -  https://hibuz.com/istio-getting-started/

Istio의 트래픽 관리는 애플리케이션의 사이드카로 배포되는 Envoy 프록시에 의존합니다. 메시 서비스가 주고 받는 모든 트래픽 (data plane traffic)은 Envoy를 통해 프록시 되므로 애플리케이션 변경하지 않고도 메시 주변의 트래픽을 쉽게 전달하고 제어 할 수 있습니다.

개요

Kubernetes 에서 트래픽 관리는 Ingress → Service → Pod 로 단순한 반면 Istio에서는 Gateway, VirtualService, DestinationRule 을 사용해서 정교하게 트래픽 제어가 가능합니다.

Gateway

클러스터 외부로 부터 어떤 트래픽을 받을지에 대한 서비스메시 엣지를 구성합니다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # 기본 IngressGateway에 설정
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

VirtualService

들어온 트래픽을 어떻게 라우팅 할지 규칙들을 정의하며 DestinationRule과 함께 Istio의 핵심요소입니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway # 선택한 gateway로 부터 트래픽을 받도록 설정
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage # 라우팅 대상
        port:
          number: 9080

DestinationRule

워크로드를 버전별로 그룹화된 서비스의 서브셋으로 관리하고, 선호하는 로드밸런싱 모델, 보안, 회로차단기 설정 같은 트래픽 정책과 관련된 규칙을 정의합니다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3

사전준비

Bookinfo 애플리케이션에서 사용할 VirtualService와 DestinationRule을 전체 서비스에 적용합니다.

  1. 기본 destination rules 전체 적용
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created

# 적용 확인
$ kubectl get destinationrule
NAME          HOST          AGE
details       details       18s
productpage   productpage   18s
ratings       ratings       18s
reviews       reviews       18s

참고: DestinationRule 설정 오류 확인

Kiali 대시보드
# Details Deployment 생성(version: v2)
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo-details-v2.yaml

# v2로 라우팅 적용하면 detail에서 service registry에 없는 서비스 호출 실패
$ kubectl apply -f samples/bookinfo/networking/virtual-service-details-v2.yaml
details DestinationRule에서 v2 subset 삭제 or details v2 배포
# ratings v2용 mongodb 생성
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo-db

# raging v2(ratings-db) deployment 생성
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo-ratings-v2


# 라우팅을 review:v3 -> rating:v2(mongodb)로 변경
$ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-db.yaml
ratings DestinationRule에서 v2, v2-mysql, v2-mysql-vm subset 삭제 or v2(mongodb) 배포
조치 결과

2. 기본 virtual services 전체 적용

# 적용 전
$ kubectl get virtualservice
NAME       GATEWAYS               HOSTS   AGE
bookinfo   ["bookinfo-gateway"]   ["*"]   57m

$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created

# 적용 후
$ kubectl get virtualservice
NAME          GATEWAYS               HOSTS             AGE
bookinfo      ["bookinfo-gateway"]   ["*"]             64m
details                              ["details"]       14s
productpage                          ["productpage"]   14s
ratings                              ["ratings"]       14s
reviews                              ["reviews"]       14s

3. 적용 상태 확인

참고

Traffic Management
Describes the various Istio features focused on traffic routing and control.