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을 전체 서비스에 적용합니다.
- 기본 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 설정 오류 확인
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. 적용 상태 확인