Envoy proxy#

Envoy proxy - настраиваемый прокси-сервер, разработанный для микросервисной архитектуры со следующими основными функциями:

  • L4-L7 балансирование нагрузки;

  • динамическая маршрутизация;

  • управление трафиком между микросервисами.

Envoy proxy легко обрабатывает сложные сценарии маршрутизации и, при возникновении проблем с сетью и приложениями, оперативно определяет источник проблемы, а также может использоваться как обратный прокси-сервер для HTTP и TCP-трафика.

Envoy proxy - автономный процесс, который предназначен для работы на каждом сервере приложений. Все Envoy proxy образуют прозрачную коммуникационную сеть, в которой каждое приложение отправляет и получает сообщения на локальный хост и обратно, и не имеет доступа к топологии сети.

Преимущества такой внепроцессной архитектуры по сравнению с традиционным библиотечным подходом к взаимодействию между сервисами:

  • Envoy proxy работает с любым прикладным языком. Одно развертывание может объединить Java, C++, Go, PHP, Python и т.д.;

  • Envoy proxy быстро и прозрачно развертывается и обновляется во всей инфраструктуре, в отличие от сервис-ориентированных архитектур, для которых развертывание обновлений библиотек может быть длительным и трудоемким процессом.

Envoy proxy поддерживает:

  • функции сетевого проксирования уровня L3/L4. Подключаемый механизм цепочки фильтров позволяет создавать фильтры для выполнения различных задач прокси TCP/UDP и накладывать их на основной сервер. Существуют фильтры для поддержки различных задач, таких как необработанный TCP-прокси, UDP-прокси, HTTP-прокси, проверка подлинности сертификата клиента TLS, Redis, MongoDB, Postgres и т.д;

  • дополнительный уровень фильтра HTTP L7. HTTP-фильтры могут быть подключены к подсистеме управления HTTP-соединениями, которые выполняют различные задачи, такие как буферизация, ограничение скорости, маршрутизация/переадресация;

  • в режиме HTTP Envoy - HTTP/1.1, HTTP/2, HTTP/3. Envoy proxy работает как прозрачный прокси-сервер с HTTP/1.1, HTTP/2 и HTTP/3 в исходящем и входящем потоке данных. Любая комбинация клиентов HTTP/1.1 и HTTP/2 и целевых серверов может быть объединена в мост;

  • в режиме HTTP Envoy подсистему маршрутизации, способную маршрутизировать и перенаправлять запросы на основе пути, полномочий, типа контента, значений времени выполнения и т. д. Функция востребована при использовании Envoy proxy в качестве Frontend или пограничного сервера прокси, а также при создании сервисной сетки;

  • систему удаленного вызова процедур gRPC. gRPC - это платформа RPC, которая использует HTTP/2 или более позднюю версию в качестве базового мультиплексированного транспорта. Envoy поддерживает все функции HTTP/2;

  • обнаружение сервисов и динамическую конфигурацию. Использует многоуровневый набор API динамической конфигурации для централизованного управления. Уровни предоставляют Envoy proxy динамические обновления: о хостах в бэкенд кластере, о бэкенд кластерах, маршрутизации HTTP, прослушивающих сокетах и криптографическом материале. Для простого развертывания обнаружение серверного хоста может быть выполнено с помощью разрешения DNS, а дополнительные уровни заменены статическими файлами конфигурации;

  • функцию автоматической проверки работоспособности вышестоящих сервисных кластеров. Envoy proxy использует объединение информации об обнаружении сервисов и проверке работоспособности для определения объектов балансировки нагрузки. Envoy proxy также поддерживает пассивную проверку работоспособности с помощью подсистемы обнаружения выбросов;

  • методы балансировки нагрузки и осуществляет доступ к балансировке приложениям. Envoy proxy поддерживает автоматические повторные попытки подключения, отслеживание разрыва цепи, глобальное ограничение скорости посредством внешней службы ограничения скорости, теневое копирование запросов и обнаружение выбросов;

  • функции Frontend/пограничного проксирования: использование одного и того же программного обеспечения на периферии позволяет упростить наблюдаемость, управление, обеспечить идентичность алгоритмов обнаружения сервисов и балансировки нагрузки;

  • сбор статистики для всех подсистем.

Архитектура#

Envoy proxy использует единый процесс с многопоточной архитектурой.

Один основной поток управляет различными задачами координации, в то время как некоторое количество рабочих потоков выполняет прослушивание, фильтрацию и пересылку.

Как только слушатель принимает соединение, оно остается привязанным к одному рабочему потоку. Это позволяет большинству экземпляров Envoy proxy быть в основном однопоточными, что приводит к трудностям распараллеливания, с небольшим количеством сложной координации обработки кода между рабочими потоками.

Балансировка подключений слушателя#

По умолчанию координация между рабочими потоками отсутствует. Это означает, что все рабочие потоки независимо пытаются принимать соединения от каждого слушателя и полагаются на ядро для выполнения надлежащей балансировки между потоками. Envoy proxy позволяет настраивать различные типы балансировки подключений для каждого слушателя.

TCP#

Каждый слушатель независимо настраивается с помощью filter_chains, где отдельная цепочка фильтров выбирается на основе критериев соответствия filter_chain_match.

Отдельная цепочка фильтров состоит из одного или нескольких фильтров сетевого уровня (L3/L4).

Когда слушатель получает новое соединение, выбирается соответствующая цепочка filter_chain, и создается экземпляр настроенного стека фильтров connection-local, который начинает обрабатывать последующие события.

Фильтры слушателя#

Фильтры слушателя Envoy proxy могут использоваться для манипулирования метаданными соединения.

Основная цель фильтров слушателя - упростить добавление дополнительных функций системной интеграции, не требуя внесения изменений в основные функциональные возможности Envoy proxy, а также сделать взаимодействие между несколькими такими функциями более понятным.

API для фильтров слушателей относительно прост, поскольку в конечном итоге эти фильтры работают с вновь принятыми сокетами.

Фильтры в цепочке могут останавливать и впоследствии продолжать итерацию для других фильтров. Это позволяет использовать более сложные сценарии, такие как вызов службы, ограничивающей скорость, и т.д.

Цепочки фильтров#

Сетевые фильтры объединяются в упорядоченный список FilterChain.

У каждого слушателя может быть несколько цепочек фильтров и необязательная default_filter_chain.

При получении запроса используется цепочка фильтров с наиболее подходящими критериями соответствия параметров запроса.