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