7.9 KiB
| title | linktitle | description | weight | keywords | owner | test | ||
|---|---|---|---|---|---|---|---|---|
| Взаємодія з DNS | DNS | Як DNS взаємодіє з Istio. | 33 |
|
istio/wg-networking-maintainers | n/a |
Istio взаємодіє з DNS у різний спосіб, що може бути важко зрозуміти. Цей документ містить глибокий огляд того, як Istio і DNS працюють разом.
{{< warning >}} Цей документ описує деталі низькорівневої реалізації. Для загальнішого огляду, перегляньте сторінки з Концепції або Завдання керування трафіком. {{< /warning >}}
Життя запиту
У цих прикладах ми розглянемо, що відбувається, коли застосунок виконує команду curl example.com. Хоча тут використовується curl, це стосується майже всіх клієнтів.
Коли ви надсилаєте запит на домен, клієнт виконує DNS-резолюцію, щоб перетворити його на IP-адресу. Це відбувається незалежно від будь-яких налаштувань Istio, оскільки Istio лише перехоплює мережевий трафік і не може змінювати поведінку вашого застосунку чи рішення про надсилання DNS-запиту. У наведеному нижче прикладі example.com був перетворений на 192.0.2.0.
{{< text bash >}} $ curl example.com -v
- Trying 192.0.2.0:80... {{< /text >}}
Далі запит буде перехоплено 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, проксі періодично виконує резолюцію вказаних імен хостів і використовує їх для всіх запитів. Цей інтервал є фіксованим значенням (30 секунд) та не може бути змінений зараз. Це відбувається навіть якщо проксі ніколи не надсилає жодних запитів на ці застосунки.
Для мереж з багатьма проксі або багатьма 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.