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 динамические обновления: о хостах в Backend-кластере, о Backend-кластерах, маршрутизации 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.
При получении запроса используется цепочка фильтров с наиболее подходящими критериями соответствия параметров запроса.