Ssoon

[7주차] Service Mesh : Traffic Management : Request Routing 본문

쿠버네티스 네트워크 스터디 3기

[7주차] Service Mesh : Traffic Management : Request Routing

구구달스 2024. 10. 15. 23:11
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

Request Routing

  • 라우팅할 명시적인 기본 서비스 버전이 없으면 Istio가 라운드 로빈 방식으로 사용 가능한 모든 버전으로 요청을 라우팅됩니다.
  • Request Routing 목표는 모든 트래픽을 마이크로서비스의 v1(버전 1)로 라우팅하는 규칙을 적용하는 것입니다.
  • 나중에 HTTP 요청 헤더의 값을 기반으로 트래픽을 라우팅하는 규칙을 적용합니다.

🧿 DestinationRule 에 대한 정의

host: productpage  : 규칙이 적용될 호스트, 즉 대상 서비스입니다. 여기서는 "productpage" 서비스가 대상입니다.

subsets: 서비스의 특정 버전을 선택하기 위한 서브셋을 정의하는 부분입니다.

 subsets는 Istio에서 DestinationRule 안에 서비스의 특정 버전이나 그룹을 지정할 때 사용됩니다. 이를 통해 트래픽을 서비스의 여러 버전이나 인스턴스들 중에서 선택적으로 분배할 수 있습니다.
  • name: v1 : 서브셋의 이름을 "v1"으로 정의합니다.
  • labels: 특정 버전의 서비스를 구분하기 위해 사용되는 레이블(라벨)을 정의합니다.
    • version: v1 : 버전 레이블이 "v1"인 서비스 인스턴스를 선택합니다.
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# cat destination-rule-all.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
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
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl apply -f 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

🧿 DestinationRule(DR) 리소스 목록을 확인

(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl get dr
NAME          HOST          AGE
details       details       23s
productpage   productpage   23s
ratings       ratings       23s
reviews       reviews       23s

 


🧿 VirtualService(VS) 리소스 목록을 확인

  • GATEWAYS: 이 VirtualService가 사용하는 게이트웨이(Gateway)입니다.
  • HOSTS: 이 VirtualService가 라우팅할 대상 호스트입니다. ("*"는 모든 호스트를 의미)

bookinfo라는 이름의 VirtualService가 있으며, bookinfo-gateway 게이트웨이를 통해 모든 호스트에서 들어오는 트래픽을 처리하도록 설정된 상태입니다.

(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl get vs
NAME       GATEWAYS               HOSTS   AGE
bookinfo   ["bookinfo-gateway"]   ["*"]   73m

🧿 Istio의 VirtualService 정의

  • 클러스터 내부 또는 외부에서 들어오는 트래픽을 어떻게 라우팅할지에 대한 규칙을 정의합니다.
VirtualService Name Host (Service) Destination Host Subset (Version)
productpage productpage productpage v1
reviews reviews reviews v1
ratings ratings ratings v1
details details details v1
  • VirtualService Name: 각 VirtualService의 이름입니다. 각 서비스의 이름은 metadata의 name 필드에 정의되어 있습니다.
  • Host (Service): 이 VirtualService가 트래픽을 관리할 대상 서비스입니다. spec의 hosts에 정의된 서비스 이름입니다.
  • Destination Host: 트래픽이 라우팅될 대상 서비스입니다. 이 값은 route 아래의 destination에서 정의되어 있으며, 트래픽이 해당 호스트로 보내집니다.
  • Subset (Version): 트래픽이 라우팅될 서비스의 특정 버전을 정의합니다. 여기서는 각 서비스의 v1 버전으로 트래픽이 라우팅되도록 설정되어 있습니다.

각 서비스로 들어오는 트래픽은 해당 서비스의  v1 버전(subset) 으로 라우팅됩니다.

(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# cat virtual-service-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl apply -f 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

🧿 VirtualService(VS) 리소스 목록을 확인

  • Name: VirtualService의 이름입니다.
  • Gateways: VirtualService가 사용하는 게이트웨이입니다. bookinfo는 bookinfo-gateway 게이트웨이를 사용하고 있으며, 나머지 서비스는 게이트웨이를 정의하지 않았습니다(클러스터 내부에서만 트래픽 처리 가능).
  • Hosts: 각 VirtualService가 라우팅하는 대상 서비스입니다. bookinfo는 모든 호스트(*)에서 들어오는 트래픽을 처리하고, 나머지는 각각의 서비스(details, productpage, ratings, reviews)로 트래픽을 처리합니다.
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl get virtualservices
NAME          GATEWAYS               HOSTS             AGE
bookinfo      ["bookinfo-gateway"]   ["*"]             73m
details                              ["details"]       22s
productpage                          ["productpage"]   22s
ratings                              ["ratings"]       22s
reviews                              ["reviews"]       22s
  • http://3.36.120.74:30293/productpage 접속 후 Kiali  확인

🧿 reviews 서비스에 대한 Istio의 VirtualService 를 정의

  • reviews 서비스로 들어오는 트래픽을 사용자의 정보에 따라 특정 버전으로 라우팅하는 규칙을 설정합니다.
VirtualService 이름 reviews
호스트 (Hosts) reviews - 이 VirtualService가 트래픽을 라우팅할 대상 서비스입니다.
HTTP 라우팅 규칙 (HTTP Rules) 두 가지 라우팅 규칙으로 구성됩니다.
첫 번째 라우팅 규칙  
- 매치 조건 (Match Condition) HTTP 요청 헤더에서 end-user가 정확히 jason인 경우
- 라우팅 목적지 (Route Destination) reviews 서비스의 v2 서브셋으로 트래픽을 보냄
두 번째 라우팅 규칙  
- 매치 조건 (Match Condition) 없음 (기본 규칙)
- 라우팅 목적지 (Route Destination) reviews 서비스의 v1 서브셋으로 트래픽을 보냄
  • 특정 사용자 라우팅: end-user 헤더가 jason인 사용자의 트래픽은 reviews 서비스의 v2 버전으로 라우팅됩니다.
  • 기본 라우팅: end-user 헤더가 jason이 아닌 모든 트래픽은 reviews 서비스의 v1 버전으로 라우팅됩니다.
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# cat virtual-service-reviews-test-v2.yaml
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: v1
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# kubectl apply -f virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews configured

🧿 기본 라우팅

end-user 헤더가 jason이 아닌 모든 트래픽은 reviews 서비스의 v1 버전으로 라우팅됩니다.


🧿 특정 사용자 라우팅

end-user 헤더가 jason인 사용자의 트래픽은 reviews 서비스의 v2 버전으로 라우팅됩니다.

  • sign out 시 출력 내용 확인

 

Comments