12 KiB
title | description | weight | keywords | aliases | owner | test | |||
---|---|---|---|---|---|---|---|---|---|
Інʼєкція збоїв | Це завдання показує, як ініціювати збої для перевірки стійкості вашого застосунку. | 20 |
|
|
istio/wg-networking-maintainers | yes |
Це завдання показує, як ініціювати збої для перевірки стійкості вашого застосунку.
Перш ніж почати
-
Налаштуйте Istio, дотримуючись інструкцій у керівництві з встановлення.
-
Розгорніть демонстраційний застосунок Bookinfo разом із типовими правилами призначення.
-
Ознайомтеся з обговоренням інʼєкцій збоїв у концепціях Управління трафіком.
-
Застосуйте маршрутизацію версій застосунку, виконавши або завдання маршрутизації запитів, або виконайте наступні команди:
{{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@ {{< /text >}}
-
За допомогою наведеної вище конфігурації потік запитів буде виглядати так:
productpage
→reviews:v2
→ratings
(лише для користувачаjason
)productpage
→reviews:v1
(для всіх інших)
Інʼєкція збою затримки HTTP
Щоб протестувати мікросервіси застосунку Bookinfo на стійкість, введіть затримку в 7 секунд між мікросервісами reviews:v2
та ratings
для користувача jason
. Це тестування виявить помилку, яку навмисно було додано в застосунок Bookinfo.
Зверніть увагу, що сервіс reviews:v2
має жорстко закодований тайм-аут зʼєднання в 10 секунд для викликів до сервісу ratings
. Навіть з урахуванням введеної затримки в 7 секунд, ви все одно очікуєте, що потік даних пройде без помилок.
-
Створіть правило інʼєкції збою, щоб затримати трафік від тестового користувача
jason
.{{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@ {{< /text >}}
-
Переконайтесь, що правило створено:
{{< text bash yaml >}} $ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... 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 {{< /text >}}
Почекайте кілка секунд для того, щоб нове правило поширилося на всі podʼи.
Тестування конфігурації затримки
-
Відкрийте вебзастосунок Bookinfo у вашому оглядачі.
-
На сторінці
/productpage
увійдіть як користувачjason
.Ви очікуєте, що головна сторінка Bookinfo завантажиться без помилок приблизно за 7 секунд. Однак виникає проблема: розділ Відгуків показує повідомлення про помилку:
{{< text plain >}} Sorry, product reviews are currently unavailable for this book. (Вибачте, відгуки про продукт наразі недоступні для цієї книги.) {{< /text >}}
-
Перегляньте час відповіді сторінки:
- Відкрийте меню Інструменти розробника у вашому вебоглядачі.
- Відкрийте вкладку Мережа (Network)
- Перезавантажте вебсторінку
/productpage
. Ви побачите, що сторінка фактично завантажується приблизно за 6 секунд.
Розуміння того, що сталося
Ви виявили помилку. Жорстко закодовані тайм-аути в мікросервісах призвели до збою сервісу reviews
.
Як і очікувалося, введена вами затримка у 7 секунд не впливає на сервіс reviews
, оскільки тайм-аут між сервісами reviews
і ratings
жорстко закодований на 10 секунд. Однак існує також жорстко закодований тайм-аут між сервісами productpage
і reviews
, який становить 3 секунди + 1 повторна спроба, тобто загалом 6 секунд. В результаті виклик від productpage
до reviews
завершується помилкою передчасно через тайм-аут після 6 секунд.
Такі помилки можуть траплятися в типових корпоративних застосунках, де різні команди розробляють різні мікросервіси незалежно одна від одної. Правила інʼєкції збоїв в Istio допомагають виявляти такі аномалії, не впливаючи на кінцевих користувачів.
{{< tip >}}
Зверніть увагу, що тест інʼєкції збоїв обмежений випадками, коли користувач, який увійшов у систему, є jason
. Якщо ви увійдете як інший користувач, ви не відчуєте жодних затримок.
{{< /tip >}}
Виправлення помилки
Зазвичай проблему вирішують наступним чином:
- Або збільшується тайм-аут між сервісами
productpage
іreviews
, або зменшується тайм-аут між сервісамиreviews
іratings
. - Виправлений мікросервіс зупиняється та перезапускається.
- Підтверджується, що сторінка
/productpage
повертає відповідь без помилок.
Однак, ви вже маєте виправлення у версії v3
сервісу reviews
. У сервісі reviews:v3
тайм-аут між reviews
і ratings
зменшений з 10 секунд до 2,5 секунд, щоб він був сумісний з (меншим за) тайм-аутом низхідних запитів від productpage
.
Якщо ви перемістите весь трафік до reviews:v3
, як описано в завданні перемикання трафіку, ви зможете змінити правило затримки на будь-яке значення менше за 2.5 секунди, наприклад, 2 секунди, і підтвердити, що потік даних пройде без помилок.
Інʼєкція збою HTTP abort
Ще один спосіб перевірити стійкість мікросервісів — це інʼєкція збою HTTP abort. У цьому завданні ви впровадите HTTP abort для мікросервісів ratings
для тестового користувача jason
.
У цьому випадку ви очікуєте, що сторінка завантажиться миттєво і відобразить повідомлення Ratings service is currently unavailable
(Сервіс оцінок наразі недоступний
).
-
Створіть правило впровадження помилок для надсилання HTTP-скасування для користувача
jason
:{{< text bash >}} $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@ {{< /text >}}
-
Переконайтесь, що правило створено:
{{< text bash yaml >}} $ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: hosts:
- ratings http:
- fault:
abort:
httpStatus: 500
percentage:
value: 100
match:
- headers: end-user: exact: jason route:
- destination: host: ratings subset: v1
- route:
- destination: host: ratings subset: v1 {{< /text >}}
Тестування конфігурації abort
-
Відкрийте застосунок Bookinfo у вашому оглядачі.
-
На сторінці
/productpage
увійдіть як користувачjason
.
Якщо правило успішно поширилося на всі podʼи, сторінка завантажиться миттєво і зʼявиться повідомлення Ratings service is currently unavailable
(Сервіс оцінок наразі недоступний
).
- Якщо ви вийдете з облікового запису користувача
jason
або відкриєте застосунок Bookinfo в анонімному вікні (або в іншому оглядачі), ви побачите, що/productpage
все ще викликаєreviews:v1
(який взагалі не викликаєratings
) для всіх, крімjason
. Тому ви не побачите жодного повідомлення про помилку.
Очищення
-
Видаліть правила маршрутизації застосунку:
{{< text bash >}} $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ {{< /text >}}
-
Якщо ви не плануєте виконувати подальші завдання, зверніться до інструкції вилучення Bookinfo, щоб завершити роботу застосунку.