트래픽 이동

트래픽 이동 (Traffic Shifting)

이 태스크는 마이크로서비스의 한 버전에서 다른 버전으로 트래픽을 이동하는 방법을 보여줘요.

출처: Istio 문서

본문

이 태스크는 마이크로서비스의 한 버전에서 다른 버전으로 트래픽을 이동하는 방법을 보여줘요.

일반적인 사용 사례는 마이크로서비스의 이전 버전에서 새 버전으로 트래픽을 점진적으로 마이그레이션하는 거예요. Istio에서는 트래픽의 일정 비율을 한 목적지에서 다른 목적지로 리다이렉트하는 일련의 라우팅 규칙을 설정해서 이 목표를 달성해요.

이 태스크에서는 트래픽의 50%를 reviews:v1로, 50%를 reviews:v3로 보낼 거예요. 그런 다음 트래픽의 100%를 reviews:v3로 보내서 마이그레이션을 완료할 거예요.

Istio는 Kubernetes Gateway API를 지원하며, 향후 트래픽 관리의 기본 API로 만들려고 하고 있어요. 아래 지침을 통해 메시에서 트래픽 관리를 설정할 때 Gateway API를 쓸지 Istio 설정 API를 쓸지 선택할 수 있어요. 선호에 따라 Gateway API 탭이나 Istio APIs 탭 중 하나의 지침을 따르면 돼요.

참고로 Kubernetes Gateway API CRD는 대부분의 Kubernetes 클러스터에 기본으로 설치되지 않으므로, Gateway API를 사용하기 전에 해당 CRD가 설치되어 있는지 확인해야 해요:

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.0/experimental-install.yaml

시작하기 전에

가중치 기반 라우팅 적용

아직 하지 않았다면 서비스 버전 정의(define the service versions) 지침을 먼저 따라요.

  1. 시작하려면, 다음 명령을 실행해서 모든 트래픽을 v1 버전으로 라우팅해요:

    Istio APIs

    Zip

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

    Gateway API

    Zip

    $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v1.yaml@
    
  2. 브라우저에서 Bookinfo 사이트를 열어요. URL은 http://$GATEWAY_URL/productpage인데, 여기서 $GATEWAY_URL은 Bookinfo 문서에서 설명한 대로 인그레스의 외부 IP 주소예요. 페이지의 reviews 부분이 새로고침을 몇 번 하든 별점(rating stars) 없이 표시되는 것을 볼 수 있을 거예요. Istio가 reviews 서비스의 모든 트래픽을 reviews:v1 버전으로 라우팅하도록 설정했고, 이 버전의 서비스는 별점 서비스에 접근하지 않기 때문이에요.

  3. 다음 명령으로 트래픽의 50%를 reviews:v1에서 reviews:v3로 옮겨요:

    Istio APIs

    Zip

    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml@
    

    Gateway API

    Zip

    $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-50-v3.yaml@
    
  4. 새 규칙이 전파될 때까지 몇 초 기다린 다음 규칙이 교체됐는지 확인해요:

    Istio APIs

    $ kubectl get virtualservice reviews -o yaml
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    ...
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1
          weight: 50
        - destination:
            host: reviews
            subset: v3
          weight: 50
    

    Gateway API

    $ kubectl get httproute reviews -o yaml
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    ...
    spec:
      parentRefs:
      - group: ""
        kind: Service
        name: reviews
        port: 9080
      rules:
      - backendRefs:
        - group: ""
          kind: Service
          name: reviews-v1
          port: 9080
          weight: 50
        - group: ""
          kind: Service
          name: reviews-v3
          port: 9080
          weight: 50
        matches:
        - path:
            type: PathPrefix
            value: /
    status:
      parents:
      - conditions:
        - lastTransitionTime: "2022-11-10T18:13:43Z"
          message: Route was valid
          observedGeneration: 14
          reason: Accepted
          status: "True"
          type: Accepted
    ...
    
  5. 브라우저에서 /productpage를 새로고침하면 이제 약 50% 정도의 확률로 빨간색 별점이 표시되는 걸 볼 수 있을 거예요. reviews의 v3 버전은 별점 서비스에 접근하지만 v1 버전은 접근하지 않기 때문이에요. 현재 Envoy 사이드카 구현에서는 제대로 된 분산을 보려면 /productpage를 여러 번(아마 15회 이상) 새로고침해야 할 수도 있어요. v3로 트래픽의 90%를 라우팅하도록 규칙을 수정하면 빨간 별점을 더 자주 볼 수 있어요.

  6. reviews:v3 마이크로서비스가 안정적이라고 판단되면, 이 virtual service를 적용해 트래픽의 100%를 reviews:v3로 라우팅할 수 있어요:

    Istio APIs

    Zip

    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-v3.yaml@
    

    Gateway API

    Zip

    $ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-v3.yaml@
    
  7. /productpage를 여러 번 새로고침해요. 이제 모든 리뷰에 빨간색 별점이 항상 표시되는 걸 볼 수 있을 거예요.

무슨 일이 있었는지 이해하기

이 태스크에서는 Istio의 가중치 라우팅 기능을 사용해 reviews 서비스의 트래픽을 이전 버전에서 새 버전으로 마이그레이션했어요. 참고로 이것은 인스턴스 스케일링으로 트래픽을 관리하는 컨테이너 오케스트레이션 플랫폼의 배포 기능을 사용하는 버전 마이그레이션과는 아주 다르다는 점을 알아두세요.

Istio를 사용하면 reviews 서비스의 두 버전이 서로 간 트래픽 분산에 영향을 주지 않으면서 독립적으로 스케일 업/다운될 수 있어요.

오토스케일링과 함께하는 버전 라우팅에 대한 더 자세한 내용은 Canary Deployments using Istio 블로그 글을 확인해 보세요.

정리

  1. 애플리케이션 라우팅 규칙을 제거해요:

    Istio APIs

    Zip

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

    Gateway API

    $ kubectl delete httproute reviews
    
  2. 후속 태스크를 더 탐색할 계획이 없다면 Bookinfo cleanup 지침을 참고해서 애플리케이션을 종료해요.

더 알아보기 (Learn more)