Інʼєкція збоїв
Це завдання показує, як ініціювати збої для перевірки стійкості вашого застосунку.
Перш ніж почати
Налаштуйте Istio, дотримуючись інструкцій у керівництві з встановлення.
Розгорніть демонстраційний застосунок Bookinfo разом із типовими правилами призначення.
Ознайомтеся з обговоренням інʼєкцій збоїв у концепціях Управління трафіком.
Застосуйте маршрутизацію версій застосунку, виконавши або завдання маршрутизації запитів, або виконайте наступні команди:
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
За допомогою наведеної вище конфігурації потік запитів буде виглядати так:
productpage
→reviews:v2
→ratings
(лише для користувачаjason
)productpage
→reviews:v1
(для всіх інших)
Інʼєкція збою затримки HTTP
Щоб протестувати мікросервіси застосунку Bookinfo на стійкість, введіть затримку в 7 секунд між мікросервісами reviews:v2
та ratings
для користувача jason
. Це тестування виявить помилку, яку навмисно було додано в застосунок Bookinfo.
Зверніть увагу, що сервіс reviews:v2
має жорстко закодований тайм-аут зʼєднання в 10 секунд для викликів до сервісу ratings
. Навіть з урахуванням введеної затримки в 7 секунд, ви все одно очікуєте, що потік даних пройде без помилок.
Створіть правило інʼєкції збою, щоб затримати трафік від тестового користувача
jason
.$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.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
Почекайте кілка секунд для того, щоб нове правило поширилося на всі podʼи.
Тестування конфігурації затримки
Відкрийте вебзастосунок Bookinfo у вашому оглядачі.
На сторінці
/productpage
увійдіть як користувачjason
.Ви очікуєте, що головна сторінка Bookinfo завантажиться без помилок приблизно за 7 секунд. Однак виникає проблема: розділ Відгуків показує повідомлення про помилку:
Sorry, product reviews are currently unavailable for this book. (Вибачте, відгуки про продукт наразі недоступні для цієї книги.)
Перегляньте час відповіді сторінки:
- Відкрийте меню Інструменти розробника у вашому вебоглядачі.
- Відкрийте вкладку Мережа (Network)
- Перезавантажте вебсторінку
/productpage
. Ви побачите, що сторінка фактично завантажується приблизно за 6 секунд.
Розуміння того, що сталося
Ви виявили помилку. Жорстко закодовані тайм-аути в мікросервісах призвели до збою сервісу reviews
.
Як і очікувалося, введена вами затримка у 7 секунд не впливає на сервіс reviews
, оскільки тайм-аут між сервісами reviews
і ratings
жорстко закодований на 10 секунд. Однак існує також жорстко закодований тайм-аут між сервісами productpage
і reviews
, який становить 3 секунди + 1 повторна спроба, тобто загалом 6 секунд. В результаті виклик від productpage
до reviews
завершується помилкою передчасно через тайм-аут після 6 секунд.
Такі помилки можуть траплятися в типових корпоративних застосунках, де різні команди розробляють різні мікросервіси незалежно одна від одної. Правила інʼєкції збоїв в Istio допомагають виявляти такі аномалії, не впливаючи на кінцевих користувачів.
Виправлення помилки
Зазвичай проблему вирішують наступним чином:
- Або збільшується тайм-аут між сервісами
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
:$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.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
Тестування конфігурації abort
Відкрийте застосунок Bookinfo у вашому оглядачі.
На сторінці
/productpage
увійдіть як користувачjason
.
Якщо правило успішно поширилося на всі podʼи, сторінка завантажиться миттєво і зʼявиться повідомлення Ratings service is currently unavailable
(Сервіс оцінок наразі недоступний
).
- Якщо ви вийдете з облікового запису користувача
jason
або відкриєте застосунок Bookinfo в анонімному вікні (або в іншому оглядачі), ви побачите, що/productpage
все ще викликаєreviews:v1
(який взагалі не викликаєratings
) для всіх, крімjason
. Тому ви не побачите жодного повідомлення про помилку.
Очищення
Видаліть правила маршрутизації застосунку:
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
Якщо ви не плануєте виконувати подальші завдання, зверніться до інструкції вилучення Bookinfo, щоб завершити роботу застосунку.