Взаємодія з DNS

Istio взаємодіє з DNS у різний спосіб, що може бути важко зрозуміти. Цей документ містить глибокий огляд того, як Istio і DNS працюють разом.

Життя запиту

У цих прикладах ми розглянемо, що відбувається, коли застосунок виконує команду curl example.com. Хоча тут використовується curl, це стосується майже всіх клієнтів.

Коли ви надсилаєте запит на домен, клієнт виконує DNS-резолюцію, щоб перетворити його на IP-адресу. Це відбувається незалежно від будь-яких налаштувань Istio, оскільки Istio лише перехоплює мережевий трафік і не може змінювати поведінку вашого застосунку чи рішення про надсилання DNS-запиту. У наведеному нижче прикладі example.com був перетворений на 192.0.2.0.

$ curl example.com -v
*   Trying 192.0.2.0:80...

Далі запит буде перехоплено Istio. На цьому етапі Istio побачить як імʼя хосту (із заголовка Host: example.com), так і адресу призначення (192.0.2.0:80). Istio використовує цю інформацію, щоб визначити намічене призначення. Розділ Розуміння маршрутизації трафіку докладно пояснює, як це працює.

Якби клієнт не зміг виконати DNS-запит, запит завершився б ще до того, як його отримав би Istio. Це означає, що якщо запит надіслано на хост, відомий Istio (наприклад, через ServiceEntry), але не відомий DNS-серверу, запит завершиться невдачею. DNS-проксіювання від Istio може змінити цю поведінку.

Як тільки 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, проксі періодично виконує резолюцію вказаних імен хостів і використовує їх для всіх запитів. Цей інтервал визначається TTL у відповіді DNS. Це відбувається навіть якщо проксі ніколи не надсилає жодних запитів на ці застосунки.

Для мереж з багатьма проксі або багатьма ServiceEntry типу resolution: DNS, особливо коли використовується низький TTL, може створювати значне навантаження на DNS-сервери. У таких випадках можуть допомогти наступні дії для зменшення навантаження:

  • Переключитися на resolution: NONE, щоб уникнути DNS-запитів проксі взагалі. Це підходить для багатьох сценаріїв.
  • Якщо ви контролюєте домени, що оборобляються, збільшіть їх TTL.
  • Якщо ваш ServiceEntry потрібен лише для кількох робочих навантажень, обмежте його дію за допомогою exportTo або Sidecar.

Проксіювання DNS

Istio пропонує функцію поксіювання DNS-запитів. Це дозволяє Istio перехоплювати DNS-запити, надіслані клієнтом, і безпосередньо відповідати на них. Це може зменшити затримку DNS, знизити навантаження та дозволити резолюцію ServiceEntry, які інакше не були б відомі kube-dns.

Зверніть увагу, що це проксіювання застосовується лише до DNS-запитів, надісланих застосунками користувачів; коли використовується ServiceEntry типу resolution: DNS, проксі не впливає на DNS-резолюцію проксі Istio.

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

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