Search

Istio Tasks; Traffic Management - Fault Injection

준비

환경은 Request Routing 실습을 마친 상태에서 한다.
다음처럼 virtualservice를 구성해놓고 한다:
productpage → reviews:v2 → ratings (only for user jason)
productpage → reviews:v1 (for everyone else)

HTTP 지연 결함 주입하기

$ k -n default apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
Shell
복사
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
YAML
복사
지난 virtualservice/ratings 를 수정하여 사용자가 jason 일 경우, 요청이 항상(percent.value=100) 7초 지연되도록 한다. 별점 데이터를 가져오는 부분에 지연 결함을 주입한다:
❯ k diff -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml diff -u -N /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-4092857910/networking.istio.io.v1alpha3.VirtualService.default.ratings /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-784706082/networking.istio.io.v1alpha3.VirtualService.default.ratings --- /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-4092857910/networking.istio.io.v1alpha3.VirtualService.default.ratings 2023-12-28 18:54:38.526857368 +0900 +++ /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-784706082/networking.istio.io.v1alpha3.VirtualService.default.ratings 2023-12-28 18:54:38.527187206 +0900 @@ -5,7 +5,7 @@ kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"ratings","namespace":"default"},"spec":{"hosts":["ratings"],"http":[{"route":[{"destination":{"host":"ratings","subset":"v1"}}]}]}} creationTimestamp: "2023-12-27T15:00:58Z" - generation: 1 + generation: 2 name: ratings namespace: default resourceVersion: "13509" @@ -14,6 +14,19 @@ hosts: - ratings http: + - fault: + delay: + fixedDelay: 7s + percentage: + value: 100 + match: + - headers: + end-user: + exact: jason + route: + - destination: + host: ratings + subset: v1 - route: - destination: host: ratings
Diff
복사
jason 으로 로그인하여 요청할 경우 6초 후 쯤, 리뷰 부분만 렌더가 안되면서 오류가 발생한다. 개발자도구 > 네트워크 탭에서 확인하면 productpage 요청이 6초 후에 그냥 200을 반환해버린다.

버그?

속사정은 이러하다고 하다:
As expected, the 7s delay you introduced doesn’t affect the reviews service because the timeout between the reviews and ratings service is hard-coded at 10s. However, there is also a hard-coded timeout between the productpage and the reviews service, coded as 3s + 1 retry for 6s total. As a result, the productpage call to reviews times out prematurely and throws an error after 6s.
reviewsratings timeout 10초
productpagereviews timeout 6초(3초 x 2, 재시도 1회)
6초(경로상 제일 짧은 timeout) < 7초(ratings 응답 지연 결함 주입)라서 에러 발생
다르게 말하면 다운스트림의 timeout이 더 클 경우 발생할 수 있는 장애이다.
istio 문서는 이걸 “버그”라고 해석한다. 내 생각엔:
(좁은 해석)6 < 10 이기 때문에 reviewsratings timeout은 동작할 일이 없다는 것
(넓은 해석)istio 같은 메시로 중앙에서 timeout 같은걸 관리하지 않고, 앱에서 개별 구현하는 것 자체
음… 어느 정도 공감할 수 있다. 각자 앱이 timeout을 따로 가져가면 MSA에선 파악하고 개선하는데 어려울 것이다. 다만, istio의 역할이 그걸 검출하는데 그치는지, 또는 이런 네트워크 설정을 중앙화 하려는 의도까지 있는지는 더 사용하며 파악해야겠다.

HTTP 중단(abort) 결함 주입하기

$ k apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
Shell
복사
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
Shell
복사
❯ k diff -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml diff -u -N /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-1251412856/networking.istio.io.v1alpha3.VirtualService.default.ratings /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-1496497287/networking.istio.io.v1alpha3.VirtualService.default.ratings --- /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-1251412856/networking.istio.io.v1alpha3.VirtualService.default.ratings 2023-12-30 15:54:11.470663577 +0900 +++ /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-1496497287/networking.istio.io.v1alpha3.VirtualService.default.ratings 2023-12-30 15:54:11.470906703 +0900 @@ -5,7 +5,7 @@ kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"ratings","namespace":"default"},"spec":{"hosts":["ratings"],"http":[{"fault":{"delay":{"fixedDelay":"7s","percentage":{"value":100}}},"match":[{"headers":{"end-user":{"exact":"jason"}}}],"route":[{"destination":{"host":"ratings","subset":"v1"}}]},{"route":[{"destination":{"host":"ratings","subset":"v1"}}]}]}} creationTimestamp: "2023-12-27T15:00:58Z" - generation: 2 + generation: 3 name: ratings namespace: default resourceVersion: "287516" @@ -15,8 +15,8 @@ - ratings http: - fault: - delay: - fixedDelay: 7s + abort: + httpStatus: 500 percentage: value: 100 match:
Diff
복사
이번엔 ratings 에서 사용자가 jason 일 경우 응답이 항상 500에러를 발생하게 결함을 주입한다.
ratings 가 렌더되어야 할 곳에 500에러에 대한 메시지가 나온다.
kiali에서도 500에러가 발생한걸 확인할 수 있다.

습득 교훈

MSA에서 개별 구성된 네트워크 설정(e.g. timeout) 오류로 장애나 버그로 이어질 수 있다.
istio는 그런 것을 검출할 수 있도록 결함 주입 기능이 있다.