전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

먼저 VirtualService와 destinationrule에 대해 조금 더 이해해 봅시다.

자세한 내용은 아래를 참조하시고, 간략하게 설명하면 아래와 같습니다.

- VirtualService: URI, HTTP Header등을 이용한 Rule에 따라 트래픽을 라우팅해 줌
  - 라우팅 조건 지정: uri, scheme, method, authority, headers, port, sourceLabels, gateways, queryParams 이용
  - 라우팅 대상 지정: destionation 서비스명/PORT번호/subset, 재시도 횟수, 라우팅 비중 정의. subset정의 시 destinationrule필요.

- destinationrule: 대상 서비스에 대한 제반 rule 정의
  - rule종류: connectionPool, L/B, outlierDetection, tls
  - 전체에 적용할 정책과 subset(version)별로 적용할 정책을 정의할 수 있음

1) VirtualService: URI, HTTP Header등을 이용한 Rule에 따라 트래픽을 라우팅해 줌
- 한 VS에 여러개 rule 정의하여 분기 가능
- 외부와 in/out처리(ingress, egress)를 위해 Gateway와 함께 사용 가능
- 대상 서비스에 대한 제반 rule을 지정하기 위해 destinationrule과 함께 사용 가능
- 구성
  참고: https://istio.io/docs/reference/config/networking/virtual-service/#HTTPMatchRequest
  - host: rule이 적용될 HOST로서 IP, FQDN(Fully Qualified Domain Name), k8s SERVICE name 지정
  - match: rule 지정(uri, scheme, method, authority, headers, port, sourceLabels, gateways, queryParams 이용).
  - routing
    - route:
      - destination: target service, port, subset
      - retries: 재시도 정의
      - weight: 라우팅 비중 정의
    - rewrite: 요청된 request uri를 rewrite하고 routing할 때 사용. route와 rewrite는 같이 사용할 수 없다.
    - redirect: redirect시킬때 사용
  - fault: 에러를 일부러 발생시키기 위해 사용 
  	- delay
    	- percentage: 몇%의 request에 대해 delay할지 지정
        	- value
        - fixedDelay: 몇초 또는 몇ms동안 delay시킬지 지정
    - abort: 
    	- percentage: 몇%의 request에 대해 abort할지 지정
        	- value
        - httpStatus: 리턴할 코드(예: 404, 503)

2) Destinationrule: 대상 서비스에 대한 제반 rule 정의
  - rule종류: connectionPool, L/B, outlierDetection, tls
  - 전체에 적용할 정책과 subset(version)별로 적용할 정책을 정의할 수 있음
  - 구성
    참고: https://istio.io/docs/reference/config/networking/destination-rule/
    - host: 적용할 service명
    - TrafficPolicy
      - connectionPool
        - tcp: maxConnection, connectTimeout, tcpKeepalive
        - http: http1MaxPendingRequests, http2MaxRequest, maxRequestsPerConnection, maxRetries, idleTimeout, h2UpgradePolicy
      - loadBalancer
        - simple: ROUND_ROBIN, LEAST_CONN, RANDOM, PASSTHROUGH
        - consistentHash: httpHeaderName, httpCookie, useSourceIp, minimumRingSize
        - localityLbSetting: source traffic의 지역에 따른 L/B. {region}/{zone}/{sub-zone}형식의 label 이용.
          - distribute: from, to. from zone을 to sub-zone으로 어떻게 분배할지 비율 지정.
          - failover: from, to. from region 라우팅 실패 시 failover할 to region지정.
          - enabled: true OR false. locality L/B 사용여부.
      - outlierDetection: circuit break를 위한 에러 발 조건 정의
        - interval: 몇분동안
        - consecutiveErrors: 몇번 에러가 발생하면
        - baseEjectionTime: 몇분동안 502, 503, 504 error를 발생시킬지 정의
      - tls: SSL/TLS관련 정책 정의
        - mode: DISABLE/SIMPLE/MUTUAL/ISTIO_MUTUAL
        - clientCertificate: client-side TLS인증서 파일 경로
        - privateKey: client private key 인증서 파일 경로
        - caCertificates: server 인증서 파일 경로
        - subjectAltNames: 서버 name list
        - sni: TLS handshake중에 서버에 제공할 sni문자열
      - portTrafficPolicy: 포트별 정책 정의
        - port: 포트 번호
        - trafficPolicy: 이 포트에만 적용할 정책 정의
          - loadBalancer
          - connectionPool
          - outlierDetection
          - tls
    - subsets: label이용한 version 목록 정의
      - name: version명
      - labels: label 값
        - version
      - trafficPolicy: 이 버전에만 적용할 trafficPolicy 정의
        - loadBalancer
        - connectionPool
        - outlierDetection
        - tls
    - exportTo: rule을 적용할 namespace- 현재 namespace는 '.', 전체 namespace는 '*'임. 생략하면 전체 namespace에 적용됨.

 

실습을 위해 bookinfo의 예제를 다시 초기 상태로 돌립니다.

$ kubectl delete -f ~/istio-1.4.6/samples/bookinfo/networking/virtual-service-all-v1.yaml

$ kubectl delete -f ~/istio-1.4.6/samples/bookinfo/networking/destination-rule-all.yaml

이제 브라우저를 열고 productpage를 접근하고, refresh를 하면 rating부분이 계속 달라질겁니다.

예) http://bookinfo.169.56.102.242.nip.io/productpage

실습을 위해 디렉토리를 만들고 이동합니다. 

$ mkdir -p ~/tmp/bookinfo/trafficmgmt/routing

$ cd ~/tmp/bookinfo/trafficmgmt/routing

1) 실습1: 특정 Version으로만 라우팅 시키기

- VirtualService를 vs-reviews-v1.yaml파일로 만듭니다. 

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

 

 - destinationrule을 dr-reviews.yaml파일로 만듭니다.

trafficPolicy에서 L/B방식을 ROUND_ROBIN으로 정의합니다. version v1인 Pod가 여러개인 경우 연결될때 ROUND ROBIN방식으로 라우팅되게 됩니다.  

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

- 적용 후 웹브라우저에서  확인합니다. 계속 refresh했을때 별점 부분이 안 나타날겁니다.

$ kubectrl apply -f vs-reviews-v1.yaml

$ kubectl apply -f dr-reviews.yaml

- 이번에는 reviews의 v2버전으로 연결해 봅니다.

$ cp vs-reviews-v1.yaml vs-reviews-v2.yaml

$ vi vs-reviews-v2.yaml 하고 subset의 값을 v2로 변경합니다.

$ kubectrl apply -f vs-reviews-v2.yaml

- 웹 브라우저에서 확인합니다. 계속 refresh했을때 검은색 별점 부분이 나타나면 됩니다.


2) 실습2: 로그인한 user에 따라 다르게 라우팅

- vs-reviews-header.yaml파일을 만듭니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: ondal
    route:
    - destination:
        host: reviews
        subset: v3
  - route:
    - destination:
        host: reviews
        subset: v2

- 적용합니다. 

$ kubectl apply -f vw-reviews-header.yaml

- ondal ID로 로그인하고, 빨간색 별점이 나오는지 확인합니다. 

- 다른 id로 로그인했을때, 검은색 별점이 나오는지 확인합니다. 


3) 실습3: 버전별로 라우팅 비중 주기

- vs-reviews-weight.yaml파일을 만들고 적용합니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 10
    - destination:
        host: reviews
        subset: v2
      weight: 40
    - destination:
        host: reviews
        subset: v3
      weight: 50

$ kubectl apply -f vs-reviews-weight.yaml

- 웹브라우저에서 refresh했을때 비중대로 라우팅이 되는지 확인합니다. 수십번 정도 한 후 kiali에서도 확인해 봅니다.

 

'Cloud > istio' 카테고리의 다른 글

04. Getting started  (0) 2020.03.06
99. Trouble shooting  (0) 2020.03.03
03. istio sidecar injection  (0) 2020.03.03
02. istio 설치  (0) 2020.03.03
01. istio 란 ?  (0) 2020.02.04
댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]