Взаємодія з DNS
Istio взаємодіє з DNS у різний спосіб, що може бути важко зрозуміти. Цей документ містить глибокий огляд того, як Istio і DNS працюють разом.
Обсяг і перспектива
Цей документ описує поведінку DNS для робочих навантажень застосунків, що працюють всередині сервісної мережі Istio (з увімкненими sidecar-проксі Envoy).
Протягом усього цього документа термін client стосується робочого навантаження всередині мережі.
Життя запиту
У цих прикладах ми розглянемо, що відбувається, коли застосунок всередині мережі виконує команду curl example.com. Хоча тут для простоти використовується curl, це стосується майже всіх HTTP-клієнтів, що працюють у межах мережі.
Коли ви надсилаєте запит на домен, клієнт спочатку виконує DNS-резолюцію, щоб перетворити імʼя хосту на IP-адресу. Це відбувається незалежно від будь-яких налаштувань Istio, оскільки Istio лише перехоплює мережевий трафік і не може змінювати рішення застосунку про виконання DNS-запиту. У наведеному нижче прикладі example.com перетворюється на 192.0.2.0.
$ curl example.com -v
* Trying 192.0.2.0:80...Лише після успішної DNS-резолюції застосунок намагається відкрити мережеве зʼєднання, і саме в цей момент Istio може перехопити трафік.
Далі запит перехоплюється Istio. На цьому етапі Istio бачить як імʼя хосту (із заголовка Host: example.com), так і адресу призначення (192.0.2.0:80). Istio використовує цю інформацію, щоб визначити намічене призначення. Розділ Розуміння маршрутизації трафіку докладно пояснює, як це працює.
Якщо робоче навантаження в мережі не може виконати резолюцію DNS-імені за допомогою свого налаштованого DNS-резолвера, зʼєднання ніколи не ініціюється.
DNS-проксіювання від Istio може змінити цю поведінку, перехоплюючи DNS-запити від застосунку та повертаючи відповідь безпосередньо.
Як тільки Istio ідентифікував цільове призначення, він повинен вибрати адресу, на яку слід надіслати запит. Завдяки розширеним можливостям балансування навантаження в Istio, це часто не є початковою IP-адресою, на яку надіслав запит клієнт. Залежно від конфігурації сервісу, Istio може виконати це кількома способами.
- Використати початкову IP-адресу клієнта (
192.0.2.0, як у прикладі вище). Це відбувається дляServiceEntryтипуresolution: NONE(стандартний тип) і для headless сервісів. - Балансувати навантаження на набір статичних IP-адрес. Це стосується
ServiceEntryтипуresolution: STATIC, де використовуються всіspec.endpoints, або для стандартних сервісів, де використовуються всіEndpoints. - Періодично виконувати резолюцію адреси за допомогою DNS і балансувати навантаження серед усіх результатів. Це стосується
ServiceEntryтипуresolution: DNS.
Зверніть увагу, що в усіх випадках резолюція DNS всередині проксі Istio не залежить від резолюції DNS, виконаної застосунком користувача. Навіть якщо клієнт виконує DNS-резолюцію, проксі може ігнорувати отриману IP-адресу й використовувати власну, яка може бути взята зі статичного списку IP-адрес або отримана через власну резолюцію DNS (можливо, для того ж імені хосту або іншого).
Резолюція DNS проксі
На відміну від більшості клієнтів, які виконують DNS-запити на вимогу в момент запиту (а потім зазвичай кешують результати), проксі Istio ніколи не виконує синхронних DNS-запитів. Коли налаштовано ServiceEntry типу resolution: DNS, проксі періодично виконує резолюцію вказаних імен хостів і використовує ці результати для всіх запитів. Цей інтервал є фіксованим значенням (30 секунд) та не може бути змінений зараз. Резолюція DNS відбувається навіть якщо проксі ніколи не надсилає жодних запитів до повʼязаних сервісів.
Для мереж з багатьма проксі або багатьма ServiceEntry типу resolution: DNS, особливо коли використовується низький TTL DNS, може створювати значне навантаження на DNS-сервери. У таких випадках можуть допомогти наступні дії для зменшення навантаження:
- Переключитися на
resolution: NONE, щоб уникнути DNS-запитів проксі взагалі. Це підходить для багатьох сценаріїв. - Якщо ви контролюєте домени, що обробляються, збільшіть їх
TTL. - Якщо
ServiceEntryпотрібен лише для невеликої кількості робочих навантажень, обмежте його дію за допомогоюexportToабоSidecar.
Проксіювання DNS
Istio пропонує функцію проксіювання DNS-запитів. Це дозволяє Istio перехоплювати DNS-запити, надіслані застосунком, і безпосередньо повертати відповіді.
Проксіювання DNS може зменшити затримку DNS, знизити навантаження на вищестоящі DNS-сервери та дозволити резолюцію імен хостів ServiceEntry, які інакше не були б відомі kube-dns/core-dns.
Зверніть увагу, що проксіювання DNS застосовується лише до DNS-запитів, надісланих застосунками користувачів. Коли використовується ServiceEntry типу resolution: DNS, проксіювання DNS не впливає на те, як проксі Istio сам виконує резолюцію DNS.