Service Mesh (ASM) インスタンスのサイドカープロキシは、ドメインネームシステム (DNS) プロキシとして機能できます。アプリケーションが ASM インスタンスで DNS クエリを開始すると、サイドカープロキシはクエリを透過的にインターセプトし、DNS サービスを提供します。このトピックでは、ASM で DNS プロキシ機能を有効化および使用する方法について説明します。
前提条件
バージョン 1.8.3.17 以降の ASM インスタンスが作成されていること。詳細については、「ASM インスタンスを作成する」をご参照ください。
クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
デフォルトの名前空間でサイドカープロキシの自動挿入が有効になっていること。詳細については、「サイドカープロキシの自動挿入を有効にする」をご参照ください。
背景情報
デフォルトでは、Kubernetes 用 Container Service (ACK) クラスターに一連の DNS サービスがデプロイされ、ワークロードに DNS 機能を提供します。これにより、クラスターで実行されるアプリケーションは、DNS サービスを使用して他のサービスを検出できます。
DNS サーバーはすべての Kubernetes クラスターで実行されます。各ポッドは DNS サービスに内部 DNS サーバーを使用します。デフォルトでは、サイドカープロキシは DNS クエリをインターセプトせず、各アプリケーションは他のサービスへの接続を確立する前にドメイン名解決を試みます。ASM で DNS プロキシ機能が有効になると、サイドカープロキシはアプリケーションからの DNS クエリを透過的にインターセプトし、DNS サービスを提供します。これにより、ドメイン名解決が高速化されます。
DNS プロキシ機能を有効にする
シナリオ 1:DNS プロキシ機能をグローバルに有効にする
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[グローバル] タブで、[DNS プロキシ] をクリックします。[DNS プロキシを有効にする] をオンにして、[設定の更新] をクリックします。
アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、削除するポッドを見つけ、[アクション] 列の を選択します。
[注記] ダイアログボックスで、[OK] をクリックします。
ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。
シナリオ 2:特定の名前空間に対して DNS プロキシ機能を有効にする
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[サイドカープロキシ設定] ページで、[名前空間] タブをクリックします。
[名前空間] ドロップダウンリストから名前空間を選択し、[DNS プロキシ] をクリックし、[DNS プロキシを有効にする] を選択し、[DNS プロキシを有効にする] の横にあるスイッチをオンにして、[設定の更新] をクリックします。
アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、削除するポッドを見つけ、[アクション] 列の を選択します。
[注記] ダイアログボックスで、[OK] をクリックします。
ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。
シナリオ 3:特定のポッドに対して DNS プロキシ機能を有効にする
ポッドの YAML ファイルに特定のアノテーションを追加して、ポッドに対して DNS プロキシ機能を有効にすることができます。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、[アクション] 列の を選択します。
[YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" // DNS キャプチャを有効にする ISTIO_META_DNS_AUTO_ALLOCATE: "true" // DNS 自動割り当てを有効にする
アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、削除するポッドを見つけ、[アクション] 列の を選択します。
[注記] ダイアログボックスで、[OK] をクリックします。
ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。
DNS プロキシ機能を使用する
手順 1:サービスエントリを作成する
サービスエントリを作成して、ASM インスタンスの内部サービスレジストリに aliyun.com を追加します。
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、[名前空間] パラメーターと [テンプレート] パラメーターを設定し、次のコンテンツを YAML コードエディターにコピーして、[作成] をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: test1-mydnsproxying spec: hosts: - aliyun.com location: MESH_EXTERNAL ports: - number: 443 name: https protocol: TLS resolution: DNS
手順 2:サンプルアプリケーションをデプロイする
クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
sleep.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
次のコマンドを実行して、sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml次のコマンドを実行して、sleep アプリケーションのポッドが起動されているかどうかを確認します。
kubectl get pod |grep sleep予期される出力:
NAME READY STATUS RESTARTS AGE sleep-66cd8f684f-nxw8v 2/2 Running 0 16m
手順 3:sleep アプリケーションのポッドに対して DNS プロキシ機能を有効にする
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、[アクション] 列の を選択します。
[YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" // DNS キャプチャを有効にする ISTIO_META_DNS_AUTO_ALLOCATE: "true" // DNS 自動割り当てを有効にする
sleep アプリケーションのポッドを再起動して、DNS 設定がアプリケーションに反映されるようにします。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、sleep アプリケーションのポッドを見つけ、[アクション] 列の を選択します。
[注記] ダイアログボックスで、[OK] をクリックします。
ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。
手順 4:DNS プロキシ機能が有効になっていることを確認する
istio-init コンテナーのログを表示します。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、sleep アプリケーションのポッドの名前をクリックします。
ポッドの詳細ページで、[ログ] タブをクリックし、[コンテナー] パラメーターを [istio-init] に設定します。
次のログが表示されます。
-A OUTPUT -p udp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-port 15053 -A ISTIO_OUTPUT -p tcp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-ports 15053サイドカープロキシは、iptables ルールに基づいて他のタイプのトラフィックをインターセプトするのと同じ方法で、ポッドからのすべての DNS クエリをインターセプトします。Istio は追加の iptables ルールを追加して、TCP または UDP ポート 53 の Kubernetes DNS サービス (CoreDNS サービスなど) に送信されるすべての DNS クエリをポート 15053 にリダイレクトします。
pilot-agent プロセスが listen しているポートを表示します。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、sleep アプリケーションのポッドを見つけ、ターミナル[アクション] 列の istio-proxy をクリックします。次に、 をクリックします。
istio-proxy コンテナーで、次のコマンドを実行して、pilot-agent プロセスが listen しているポートを表示します。
netstat -anp |grep 15053予期される出力:
tcp 0 0 127.0.0.1:15053 0.0.0.0:* LISTEN 1/pilot-agent udp 0 0 127.0.0.1:15053 0.0.0.0:* 1/pilot-agent出力は、pilot-agent プロセスがポート 15053 で listen していることを示しています。すべての DNS クエリは、istio-proxy コンテナーで実行されている pilot-agent プロセスにリダイレクトされます。
sleep アプリケーションで aliyun.com にアクセスします。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページで、sleep アプリケーションのポッドを見つけ、ターミナル[アクション] 列の スリープ をクリックします。次に、 をクリックします。
sleep コンテナーで次のコマンドを実行して、aliyun.com にアクセスします。
curl -v https://aliyun.com予期される出力:
* Trying 240.240.**.**:443... * Connected to aliyun.com (240.240.**.**) port 443 (#0)出力は、IP アドレス 240.240.**.** が返されたことを示しています。この IP アドレスは実際のパブリック IP アドレスではありません。代わりに、ASM インスタンスによって自動的に割り当てられる仮想 IP アドレスです。これは、ASM インスタンスが iptables を使用して kube-dns サービスに送信されるリクエストをインターセプトし、sleep アプリケーションのポッドで実行されているサイドカープロキシにリクエストをルーティングするためです。sleep アプリケーションのポッドが aliyun.com を仮想 IP アドレスに解決してリクエストを送信すると、仮想 IP アドレスはサイドカープロキシによって解決された実際のパブリック IP アドレスに変換されます。
DNS プロキシ機能のデバッグログを有効にする
DNS プロキシ機能のデバッグログを有効にすると、pilot-agent プロセスはアプリケーションコンテナーから開始されたすべての DNS クエリを記録します。
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
[デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、[アクション] 列の を選択します。
[YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。
annotations: sidecar.istio.io/agentLogLevel: "dns:debug" // DNS デバッグログレベルを設定する
クラスターで次のコマンドを実行して、デバッグログを表示します。
kubectl logs -n default sleep-85fdfd8896-2ctq4 -c istio-proxy | grep debugfound=trueを含むログエントリは、DNS クエリのローカルレジストリでドメイン名が見つかり、ドメイン名が解決されたことを示しています。