티스토리 뷰
먼저 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 |
- Total
- Today
- Yesterday
- AXON
- 디토소비
- API Composition
- 애자일
- 육각형인간
- 스핀프로젝트
- CQRS
- 요즘남편 없던아빠
- 마이크로서비스
- micro service
- agile
- 도파밍
- spotify
- 버라이어티가격
- 돌봄경제
- Event Sourcing
- 호모프롬프트
- 분초사회
- 리퀴드폴리탄
- 스포티파이
- 마이크로서비스 패턴
- SAGA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |