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サーバーには知られていない場合、リクエストは失敗します。IstioのDNSプロキシはこの動作を変更できます。
Istioが意図された宛先を特定すると、どの送信先アドレスを選択する必要があるかを決定する必要があります。Istioの高度なロードバランシング機能のため、これはクライアントが送信した元のIPアドレスではないことがよくあります。サービス構成によっては、Istioがこれを行う方法はいくつかあります。
- クライアントの元のIPアドレス(上記の例では
192.0.2.0
)を使用します。これは、タイプresolution: NONE
(デフォルト)のServiceEntry
、およびヘッドレスServices
の場合です。 - 静的IPアドレスのセットでロードバランシングを行います。これは、すべての
spec.endpoints
が使用されるresolution: STATIC
タイプのServiceEntry
の場合、またはすべてのEndpoints
が使用される標準のServices
の場合です。 - DNSを使用してアドレスを定期的に解決し、すべての結果に対してロードバランシングを行います。これは、タイプ
resolution: DNS
のServiceEntry
の場合です。
いずれの場合も、Istioプロキシ内のDNS解決は、ユーザーアプリケーション内のDNS解決とは直交することに注意してください。クライアントがDNS解決を行う場合でも、プロキシは解決されたIPアドレスを無視して、独自のIPアドレスを使用する可能性があります。これは、IPの静的リストから、または独自のDNS解決(同じホスト名または別のホスト名の可能性あり)によって取得される可能性があります。
プロキシDNS解決
ほとんどのクライアントは、リクエスト時にオンデマンドでDNSリクエストを実行し(通常は結果をキャッシュします)、Istioプロキシは同期DNSリクエストを一切実行しません。resolution: DNS
タイプのServiceEntry
が構成されている場合、プロキシは構成されたホスト名を定期的に解決し、それらをすべてのリクエストに使用します。この間隔は、DNS応答のTTLによって決定されます。これは、プロキシがこれらのアプリケーションにリクエストを送信しなくても発生します。
特にTTLが低い場合、多くのプロキシまたは多くのresolution: DNS
タイプのServiceEntry
を持つメッシュでは、DNSサーバーに高い負荷がかかる可能性があります。このような場合は、以下が負荷の軽減に役立ちます。
- プロキシDNSルックアップを完全に回避するために、
resolution: NONE
に切り替えます。これは多くのユースケースに適しています。 - 解決するドメインを制御している場合は、TTLを増やしてください。
ServiceEntry
が少数のワークロードでのみ必要な場合は、exportTo
またはSidecar
を使用して、そのスコープを制限します。
DNSプロキシ
Istioは、DNSリクエストをプロキシする機能を提供しています。これにより、Istioはクライアントによって送信されたDNSリクエストをキャプチャし、応答を直接返すことができます。これにより、DNSのレイテンシーを改善し、負荷を軽減し、kube-dns
に知られていないServiceEntries
を解決することができます。
このプロキシは、ユーザーアプリケーションによって送信されたDNSリクエストにのみ適用されることに注意してください。resolution: DNS
タイプのServiceEntries
が使用されている場合、プロキシはIstioプロキシのDNS解決には影響しません。