Плагинизация и расширение возможностей envoy
Envoy - это действительно стандарт на сегодняшний день для использования в качестве сайдкаров, и не только. Одно из главных его преимуществ - это xDS протокол для конфигурации прокси на лету. Именно на этом построена работа таких инструментов, как Istio. Общая механика такова - пишем yaml манифесты с правилами роутинга, безопасности и прочим, а Istio конфигурирует нужные сайдкары в нужных подах.
Принцип обработки запроса у Envoy - это цепочка фильтров, которые по сути являются middleware. Из коробки доступны множество различных фильтров на любой вкус. Однако, все равно рано или поздно их может не хватить. Это произошло и со мной, когда потребовалось накрутить кэширование для авторизационных запросов для снижения latency. Существует несколько способов создания собственного фильтра:
➡️ C++ - это максимально эффективный способ с точки зрения возможностей, но также и максимально травмирующий :). Однако, если в вашей команде есть c++ разработчики, то проблем возникнуть не должно.
➡️ Golang - наша любимая "гошечка". Все достаточно просто: пишем код на основе предоставленных интерфейсов, собираем so, добавляем в образ - готово. Ограничений в функциональности не встретил.
➡️ Wasm - там тоже есть go, но только tiny-go. Это уже ограничение, например, в сетевых запросах, дополнительный latency до 6мс (по заверениям авторов Istio, но надо тестировать самостоятельно), что может быть достаточно заметно для нагруженных частей проекта. Находил тесты производительности, которые также заставляли сомневаться.
➡️ Lua - простой как палка, есть все что необходимо в плане функционала, код работает из коробки, даже не надо образ дополнять. Но Envoy буферизует запрос перед тем как отдать его в lua код (перед сетевыми запросами). Можно столкнуться, например, с проблемой "too large body".
Эти методы расширения - те, с которыми мне пришлось столкнуться ближе всего. Для простых задач я буду продолжать использовать Lua, но если логика чуть сложнее, чем изменение заголовков, то я буду смотреть в сторону Golang.
Post #209
1.28K

- 👍 3
- 👎 1