Ssoon
[7주차] Service Mesh : Traffic Management : Request Routing 본문
쿠버네티스 네트워크 스터디 3기
[7주차] Service Mesh : Traffic Management : Request Routing
구구달스 2024. 10. 15. 23:11CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 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 시 출력 내용 확인
'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글
[7주차] Service Mesh : Traffic Management : Traffic Shifting (0) | 2024.10.15 |
---|---|
[7주차] Service Mesh : Traffic Management : Fault Injection (0) | 2024.10.15 |
[7주차] Service Mesh : Bookinfo 실습 & Istio 기능 (0) | 2024.10.15 |
[7주차] Service Mesh : Istio 통한 외부 노출 (0) | 2024.10.15 |
[7주차] Service Mesh : Istio 설치 (Sidecar mode) (0) | 2024.10.15 |
Comments