동작 소개 : 클라이언트 PC → Istio ingressgateway 파드 → (Gateway, VirtualService + DestinationRule) → Cluster
- Gateway : 지정한 인그레스 게이트웨이로부터 트래픽이 인입, 프로토콜 및 포트, Hosts, Proxy 등 설정 가능
- VirtualService : 인입 처리할 Hosts 설정, L7 Path 별 라우팅, 목적지에 대한 정책 설정 가능 - Docs
- VirtualService 는 DestinationRule 에서 설정된 Subset을 사용하여 트래픽 컨트롤을 할 수 있다.
- Routing rules : HTTP의 경우 - Match 필드, Destination(Istio/envoy 에 등록된 대상, Subnet에 DestinationRule 활용)
- HTTPRoute: redirect, rewrite, fault(장애 주입), mirror(복제, 기본 100%), corsPolicy(CORS 삽입), headers(헤더 조작)
Request Routing 실습 시작
## 기본 샘플 파일 확인
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# tree
.
├── bookinfo-gateway.yaml
├── certmanager-gateway.yaml
├── destination-rule-all-mtls.yaml
├── destination-rule-all.yaml
├── destination-rule-reviews.yaml
├── egress-rule-google-apis.yaml
├── fault-injection-details-v1.yaml
├── virtual-service-all-v1.yaml
├── virtual-service-details-v2.yaml
├── virtual-service-ratings-db.yaml
├── virtual-service-ratings-mysql-vm.yaml
├── virtual-service-ratings-mysql.yaml
├── virtual-service-ratings-test-abort.yaml
├── virtual-service-ratings-test-delay.yaml
├── virtual-service-reviews-50-v3.yaml
├── virtual-service-reviews-80-20.yaml
├── virtual-service-reviews-90-10.yaml
├── virtual-service-reviews-jason-v2-v3.yaml
├── virtual-service-reviews-test-v2.yaml
├── virtual-service-reviews-v2-v3.yaml
└── virtual-service-reviews-v3.yaml
0 directories, 21 files
## 기본 DestinationRule 적용
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k 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 확인
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k get dr
NAME HOST AGE
details details 25s
productpage productpage 25s
ratings ratings 25s
reviews reviews 25s
kiali 포털에서도 확인
- 4개 서비스 모두 v1 의 서브셋(subset) 에 전송하는 정책 테스트
- vitual-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
---
## istio virtualservice 확인
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k get vs
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 59m
## 모든 마이크로서비스에 대해 v1의 서브셋에 전송되도록 virtualservices 적용
(⎈|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
## 생성된 virtual service 확인
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k get vs
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 64m
details ["details"] 97s
productpage ["productpage"] 97s
ratings ["ratings"] 97s
reviews ["reviews"] 97s
v1으로 subset을 설정하니 v2로 흘러들어가는 트래픽은 없고 v1으로만 트래픽이 흘러가는 것을 확인할 수 있습니다.
- reviews 서비스에 대한 istio vs 설정
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
정책에 따라 jason으로 웹 페이지에서 로그인을 해보면, reviews v2로 트래픽이 전달되어 ratings이 확인되는 것을 확인할 수 있습니다.
이 상태에서 Sign Out하거나, 다른 User로 로그인하면 v2로 흐르는 rule에 해당하는 요청이 없기 때문에 ratings은 확인되지 않습니다.
Fault Injection 실습 시작
end-user 가 jason 는 ratings v1 에 7초 지연 발생, 그외 사용자는 ratings v1 정상 연결
- virtual-service-rationgs-test-delay.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- match:
- headers:
end-user:
exact: jason
fault:
delay:
percentage:
value: 100.0
fixedDelay: 7s
route:
- destination:
host: ratings
subset: v1
- route:
- destination:
host: ratings
subset: v1
- 배포
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k apply -f virtual-service-ratings-test-delay.yaml
virtualservice.networking.istio.io/ratings configured
7초 delay가 걸리면서 Timeout이 발생합니다.
end-user 가 jason 는 ratings v1 에 500 에러 리턴, 그외 사용자는 ratings v1 정상 연결
- virtual-service-ratings-test-abort.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- match:
- headers:
end-user:
exact: jason
fault:
abort:
percentage:
value: 100.0
httpStatus: 500
route:
- destination:
host: ratings
subset: v1
- route:
- destination:
host: ratings
subset: v1
- 배포
(⎈|default:N/A) root@k3s-s:~/istio-1.23.2/samples/bookinfo/networking# k apply -f virtual-service-ratings-test-abort.yaml
virtualservice.networking.istio.io/ratings configured
웹 페이지에서 jason으로 접속 시 error가 발생하는 것을 확인할 수 있고, kiali에서도 500 에러 flag를 확인할 수 있습니다.
'Cloud > Kubernetes' 카테고리의 다른 글
[KANS] Cilium + eBPF (2) (2) | 2024.10.27 |
---|---|
[KANS] Cilium & Hubble (0) | 2024.10.26 |
[KANS] Istio example (bookinfo) (1) | 2024.10.20 |
[KANS] istio install + expose (0) | 2024.10.20 |
[KANS] Gateway API (3) | 2024.10.13 |