Тайм-аути запитів
У цьому завданні показано, як налаштувати таймаути запитів в Envoy за допомогою Istio.
Перш ніж почати
Налаштуйте Istio, дотримуючись інструкцій у керівництві з встановлення.
Розгорніть демонстраційний застосунок Bookinfo включаючи версії сервісів.
Тайм-аут запитів
Тайм-аут для HTTP запитів можна вказати, використовуючи поле тайм-ауту в правилі маршрутизації. Стандартно тайм-аут запиту вимкнено, але в цьому завданні ви перевизначите тайм-аут сервісу reviews
встановивши його на пів секунди. Щоб побачити його ефект, ви також вводите штучну затримку у 2 секунди в запитах до сервісу ratings
.
- Направте запити до версії
v2
сервісуreviews
, тобто версії, яка викликає сервісratings
:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
EOF
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
EOF
- Додайте 2-секундну затримку для викликів сервісу
ratings
:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
subset: v1
EOF
Gateway API поки що не підтримує інʼєкції збоїв, тому нам потрібно використовувати Istio VirtualService
для додавання затримки:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
EOF
Відкрийте URL-адресу Bookinfo
http://$GATEWAY_URL/productpage
у вашому оглядачі, де$GATEWAY_URL
—це зовнішня IP-адреса ingress, як пояснено в документації Bookinfo.Ви повинні побачити, що застосунок Bookinfo працює нормально (з показом рейтингу зірками), але є затримка у 2 секунди щоразу, коли ви оновлюєте сторінку.
Тепер додайте тайм-аут запиту в пів секунди для викликів до сервісу
reviews
:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 0.5s
EOF
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
timeouts:
request: 500ms
EOF
Оновіть сторінку Bookinfo.
Тепер ви повинні побачити, що вона повертається за приблизно 1 секунду, замість 2, і відгуки недоступні.
Розуміння того, що відбулося
У цьому завданні ви використовували Istio для встановлення тайм-ауту запитів до мікросервісу reviews
на пів секунди. Стандартно тайм-аут запитів вимкнено. Оскільки сервіс reviews
потім викликає сервіс ratings
при обробці запитів, ви використали Istio для введення 2-секундної затримки у виклики до ratings
, щоб спричинити затримку сервісу reviews
більше ніж пів секунди, і, відповідно, ви могли побачити тайм-аут в дії.
Ви спостерігали, що замість відображення відгуків сторінка продукту Bookinfo (яка викликає сервіс reviews
, щоб заповнити сторінку) показувала повідомлення: “Sorry, product reviews are currently unavailable for this book” (“Вибачте, відгуки про цей товар наразі недоступні”). Це сталося через отримання помилки тайм-ауту від сервісу reviews
.
Якщо ви переглянете завдання з інʼєкції збоїв, ви дізнаєтеся, що мікросервіс productpage
також має власний рівень тайм-ауту (3 секунди) для викликів до мікросервісу reviews
. Зверніть увагу, що в цьому завданні ви використовували правило маршрутизації Istio для встановлення тайм-ауту на пів секунди. Якби ви встановили тайм-аут на щось більше, ніж 3 секунди (наприклад, 4 секунди), тайм-аут не мав би жодного ефекту, оскільки більш обмежувальний з двох має перевагу. Більше деталей можна знайти тут.
Ще одне, що варто зазначити про тайм-аути в Istio, це те, що, крім перевизначення їх у правилах маршрутизації, як ви зробили в цьому завданні, їх також можна перевизначити на основі кожного запиту, якщо застосунок додає заголовок x-envoy-upstream-rq-timeout-ms
у вихідні запити. У заголовку тайм-аут вказується в мілісекундах замість секунд.
Очищення
- Видалити правила маршрутизації застосунків:
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
$ kubectl delete virtualservice ratings
- Якщо ви не плануєте виконувати подальші завдання, зверніться до інструкції вилучення Bookinfo, щоб завершити роботу застосунку.