55 lines
4.2 KiB
Markdown
55 lines
4.2 KiB
Markdown
# Envoy: outlier detection
|
||||
|
|
|
|||
|
|
[К материалам семинара](../readme.md)
|
|||
|
|
|
|||
|
|
В стенде работают Envoy и два бэкенда. Первый возвращает успешный ответ на `/`, второй с вероятностью 0.8 возвращает HTTP 500. Envoy наблюдает результаты обычных запросов и временно исключает проблемный бэкенд из балансировки. Это пассивное обнаружение: отдельные запросы проверки здоровья здесь не настроены.
|
|||
|
|
|
|||
|
|
## Запуск и наблюдение
|
|||
|
|
|
|||
|
|
Нужны Docker и Docker Compose. Выполните из этой директории:
|
|||
|
|
|
|||
|
|
```shell
|
|||
|
|
docker compose up --build -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
После запуска приложений несколько раз отправьте запрос через прокси и сравните с прямыми запросами:
|
|||
|
|
|
|||
|
|
```shell
|
|||
|
|
curl -i http://localhost:8080/
|
|||
|
|
curl -i http://localhost:9001/
|
|||
|
|
curl -i http://localhost:9002/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
В PowerShell вместо `curl` используйте `curl.exe`. Ответы содержат версию бэкенда (`v1` или `v2`). Для опыта достаточно пути `/`; путь `/kittens` дополнительно обращается к внешнему API.
|
|||
|
|
|
|||
|
|
При повторных запросах через Envoy проблемный бэкенд временно исключается, а затем снова допускается к трафику. Прямые запросы к порту 9002 позволяют видеть, что процесс продолжает работать и возвращать ответы, в том числе ошибки. Последовательность случайна: по одному успешному ответу или короткой серии нельзя заключить, что бэкенд исключён.
|
|||
|
|
|
|||
|
|
## Что означают настройки
|
|||
|
|
|
|||
|
|
В [конфигурации Envoy](envoy.yaml) задано:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
outlier_detection:
|
|||
|
|
consecutive_5xx: 2
|
|||
|
|
interval: "5s"
|
|||
|
|
base_ejection_time: "10s"
|
|||
|
|
max_ejection_percent: 100
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- `consecutive_5xx`: исключение после двух последовательных ответов 5xx **от одного бэкенда**, наблюдаемых Envoy. Это не любые две ошибки во всём потоке запросов.
|
|||
|
|
- `interval`: период фонового анализа и проверки возврата исключённых бэкендов. Достижение порога последовательных ошибок обрабатывается при запросах, без ожидания следующего такого интервала.
|
|||
|
|
- `base_ejection_time`: базовая длительность исключения. При повторных исключениях срок может расти; возврат не гарантирован ровно через 10 секунд.
|
|||
|
|
- `max_ejection_percent`: разрешённая доля исключённых бэкендов. Значение 100 позволяет исключить все; это настройка данного учебного примера.
|
|||
|
|
|
|||
|
|
Исключение меняет маршрутизацию в данном прокси. Оно не останавливает бэкенд и не доказывает, что тот аварийно завершился. Возврат по таймеру тоже не подтверждает исправление приложения: новый запрос может снова завершиться ошибкой.
|
|||
|
|
|
|||
|
|
Адреса бэкендов заданы в конфигурации. Интеграция с Consul в этом стенде отсутствует.
|
|||
|
|
|
|||
|
|
После работы:
|
|||
|
|
|
|||
|
|
```shell
|
|||
|
|
docker compose down
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Подробнее: [outlier detection в документации Envoy](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/outlier), [справочник параметров](https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/cluster/v3/outlier_detection.proto).
|