Envoy — это высокопроизводительный L4-L7 балансировщик написанный на С++.
Envoy похож на nginx и haproxy со своими отличиями, которые иногда сильно нужны и весьма предпочтительны. Envoy ориентирован на микросервисную архитектуру и обладает богатым функционалом.
Сегодня мы не будем ковырять все настройки Envoy, а обратим внимание на один момент связанный с DNS, за который разработчикам Envoy хочется презентовать леща.
Проблема взаимодействия Envoy и DNS
В один прекрасный момент мы заменили часть Nginx серверов на Envoy и заметили, что нагрузка на серверы DNS резко возросла. Ну как заметили, серверам DNS стало плохо, мы включили дебаг и выяснили, что Envoy серверы генерируют большую часть трафика к DNS, больше чем раньше генерировали Nginx серверы.
GPT подсказал куда копать, а именно — в документацию. Документация указывает на две опции:
respect_dns_ttl— по умолчанию falsedns_refresh_rate— по умолчанию 5 секунд
Кластеры типа STRICT_DNS и LOGICAL_DNS по умолчанию выполняют разрешение DNS постоянно в фоновом режиме, независимо от того, есть ли трафик к этим кластерам. Это означает, что даже если сервис используется редко, Envoy все равно будет регулярно создавать DNS-запросы. Значение dns_refresh_rate по умолчанию составляет всего 5 секунд. Такой короткий интервал приводит к очень частым запросам к DNS-серверу.
При этом значения TTL записей DNS по умолчанию игнорируются: respect_dns_ttl. Кто это вообще придумал?!
https://github.com/envoyproxy/envoy/issues/20562
В больших средах на одном экземпляре Envoy может быть настроено большое количество DNS-кластеров. И самих Envoy серверов в инфраструктуре может быть много. Ну, вы понимаете к чему это приводит.
Что делать?
Во-первых, используем TTL, не зря его придумали. Включаем respect_dns_ttl. В небольших системах можно увеличить интервал dns_refresh_rate.
Общее количество запросов к DNS серверам снизится. Однако, если инфраструктура большая, то по мере истечения TTL, серверы Envoy могут одновременно генерировать пиковый шквал запросов (Thundering Herd) к серверам DNS. Здесь может помочь параметр dns_jitter, который предназначен для добавления случайной задержки и предотвращения штурмующих волн запросов. И он тоже почему-то по умолчанию отключен.
