Взаємодія з 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.

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!