すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASM インスタンスの DNS プロキシ機能を使用する

最終更新日:Jan 13, 2025

Service Mesh (ASM) インスタンスのサイドカープロキシは、ドメインネームシステム (DNS) プロキシとして機能できます。アプリケーションが ASM インスタンスで DNS クエリを開始すると、サイドカープロキシはクエリを透過的にインターセプトし、DNS サービスを提供します。このトピックでは、ASM で DNS プロキシ機能を有効化および使用する方法について説明します。

前提条件

背景情報

デフォルトでは、Kubernetes 用 Container Service (ACK) クラスターに一連の DNS サービスがデプロイされ、ワークロードに DNS 機能を提供します。これにより、クラスターで実行されるアプリケーションは、DNS サービスを使用して他のサービスを検出できます。

DNS サーバーはすべての Kubernetes クラスターで実行されます。各ポッドは DNS サービスに内部 DNS サーバーを使用します。デフォルトでは、サイドカープロキシは DNS クエリをインターセプトせず、各アプリケーションは他のサービスへの接続を確立する前にドメイン名解決を試みます。ASM で DNS プロキシ機能が有効になると、サイドカープロキシはアプリケーションからの DNS クエリを透過的にインターセプトし、DNS サービスを提供します。これにより、ドメイン名解決が高速化されます。

DNS プロキシ機能を有効にする

シナリオ 1:DNS プロキシ機能をグローバルに有効にする

  1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

  3. [グローバル] タブで、[DNS プロキシ] をクリックします。[DNS プロキシを有効にする] をオンにして、[設定の更新] をクリックします。

  4. アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。

    1. ACK コンソール にログインします。

    2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    5. [ポッド] ページで、削除するポッドを見つけ、その他 > 削除[アクション] 列の を選択します。

    6. [注記] ダイアログボックスで、[OK] をクリックします。

      ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。

シナリオ 2:特定の名前空間に対して DNS プロキシ機能を有効にする

  1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

  3. [サイドカープロキシ設定] ページで、[名前空間] タブをクリックします。

  4. [名前空間] ドロップダウンリストから名前空間を選択し、[DNS プロキシ] をクリックし、[DNS プロキシを有効にする] を選択し、[DNS プロキシを有効にする] の横にあるスイッチをオンにして、[設定の更新] をクリックします。

  5. アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。

    1. ACK コンソール にログインします。

    2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    5. [ポッド] ページで、削除するポッドを見つけ、その他 > 削除[アクション] 列の を選択します。

    6. [注記] ダイアログボックスで、[OK] をクリックします。

      ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。

シナリオ 3:特定のポッドに対して DNS プロキシ機能を有効にする

ポッドの YAML ファイルに特定のアノテーションを追加して、ポッドに対して DNS プロキシ機能を有効にすることができます。

  1. ACK コンソール にログインします。

  2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

  4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [デプロイメント] を選択します。

  5. [デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、その他 > YAML で表示[アクション] 列の を選択します。

  6. [YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。

    annotations:
      proxy.istio.io/config: |
        proxyMetadata:
          ISTIO_META_DNS_CAPTURE: "true"  // DNS キャプチャを有効にする
          ISTIO_META_DNS_AUTO_ALLOCATE: "true" // DNS 自動割り当てを有効にする
    

    注释

  7. アプリケーションのポッドを再起動して、DNS 設定をアプリケーションに反映させます。

    1. ACK コンソール にログインします。

    2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    5. [ポッド] ページで、削除するポッドを見つけ、その他 > 削除[アクション] 列の を選択します。

    6. [注記] ダイアログボックスで、[OK] をクリックします。

      ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。

DNS プロキシ機能を使用する

手順 1:サービスエントリを作成する

サービスエントリを作成して、ASM インスタンスの内部サービスレジストリに aliyun.com を追加します。

  1. ASM コンソール にログインします。

  2. 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。

  4. ASM インスタンスの詳細ページで、[クラスターとワークロードの管理] > [外部サービス (serviceentry)] を選択します。表示されるページで、[YAML から作成] をクリックします。

  5. [作成] ページで、[名前空間] パラメーターと [テンプレート] パラメーターを設定し、次のコンテンツを 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:サンプルアプリケーションをデプロイする

  1. クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。

  2. sleep.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。

    sleep.yaml ファイルを表示

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    
  3. 次のコマンドを実行して、sleep アプリケーションをデプロイします。

    kubectl apply -f sleep.yaml
    
  4. 次のコマンドを実行して、sleep アプリケーションのポッドが起動されているかどうかを確認します。

    kubectl get pod |grep sleep
    

    予期される出力:

    NAME                       READY   STATUS    RESTARTS   AGE
    sleep-66cd8f684f-nxw8v     2/2     Running   0          16m
    

手順 3:sleep アプリケーションのポッドに対して DNS プロキシ機能を有効にする

  1. ACK コンソール にログインします。

  2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

  4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [デプロイメント] を選択します。

  5. [デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、その他 > YAML で表示[アクション] 列の を選択します。

  6. [YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。

    annotations:
      proxy.istio.io/config: |
        proxyMetadata:
          ISTIO_META_DNS_CAPTURE: "true" // DNS キャプチャを有効にする
          ISTIO_META_DNS_AUTO_ALLOCATE: "true" // DNS 自動割り当てを有効にする
    

    注释

  7. sleep アプリケーションのポッドを再起動して、DNS 設定がアプリケーションに反映されるようにします。

    1. ACK コンソール にログインします。

    2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    5. [ポッド] ページで、sleep アプリケーションのポッドを見つけ、その他 > 削除[アクション] 列の を選択します。

    6. [注記] ダイアログボックスで、[OK] をクリックします。

      ポッドが再起動するまで待ちます。ポッドの再起動後、DNS 設定が有効になります。

手順 4:DNS プロキシ機能が有効になっていることを確認する

  1. istio-init コンテナーのログを表示します。

    1. ACK コンソール にログインします。

    2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

    4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    5. [ポッド] ページで、sleep アプリケーションのポッドの名前をクリックします。

    6. ポッドの詳細ページで、[ログ] タブをクリックし、[コンテナー] パラメーターを [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 にリダイレクトします。

  2. pilot-agent プロセスが listen しているポートを表示します。

    1. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    2. [ポッド] ページで、sleep アプリケーションのポッドを見つけ、ターミナル[アクション] 列の istio-proxy をクリックします。次に、 をクリックします。

    3. 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 プロセスにリダイレクトされます。

  3. sleep アプリケーションで aliyun.com にアクセスします。

    1. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [ポッド] を選択します。

    2. [ポッド] ページで、sleep アプリケーションのポッドを見つけ、ターミナル[アクション] 列の スリープ をクリックします。次に、 をクリックします。

    3. 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 クエリを記録します。

  1. ACK コンソール にログインします。

  2. ACK コンソールの左側のナビゲーションペインで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細[アクション] 列の をクリックします。クラスターの詳細ページが表示されます。

  4. 詳細ページの左側のナビゲーションペインで、[ワークロード] > [デプロイメント] を選択します。

  5. [デプロイメント] ページで、DNS プロキシ機能を有効にするアプリケーションを見つけ、その他 > YAML で表示[アクション] 列の を選択します。

  6. [YAML の編集] ダイアログボックスで、spec セクションに次のアノテーションを追加し、[更新] をクリックします。

    annotations:
      sidecar.istio.io/agentLogLevel: "dns:debug" // DNS デバッグログレベルを設定する
    

    日志注释

  7. クラスターで次のコマンドを実行して、デバッグログを表示します。

    kubectl logs -n default sleep-85fdfd8896-2ctq4 -c istio-proxy | grep debug
    

    予期される出力の表示

    2022-03-28T12:15:05.064562Z    debug    dns    request ;; opcode: QUERY, status: NOERROR, id: 16390
    ;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;alibabacloud.com.default.svc.cluster.local.    IN     AAAA
        protocol=udp edns=false id=1c71c9f1-e051-49e9-8d04-d7c82ee****
    2022-03-28T12:15:05.064572Z    debug    dns    request ;; opcode: QUERY, status: NOERROR, id: 16016
    ;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;alibabacloud.com.default.svc.cluster.local.    IN     A
        protocol=udp edns=false id=4cec8078-5355-4d1b-b496-ab57367****
    2022-03-28T12:15:05.064593Z    debug    dns    response for hostname "alibabacloud.com.default.svc.cluster.local." (found=true): ;; opcode: QUERY, status: NOERROR, id: 16390
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;alibabacloud.com.default.svc.cluster.local.    IN     AAAA
        protocol=udp edns=false id=1c71c9f1-e051-49e9-8d04-d7c82ee****
    2022-03-28T12:15:05.064614Z    debug    dns    response for hostname "alibabacloud.com.default.svc.cluster.local." (found=true): ;; opcode: QUERY, status: NOERROR, id: 16016
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;alibabacloud.com.default.svc.cluster.local.    IN     A
    
    ;; ANSWER SECTION:
    alibabacloud.com.default.svc.cluster.local.    30    IN    CNAME    alibabacloud.com.
    alibabacloud.com.    30    IN    A    240.240.**.**
        protocol=udp edns=false id=4cec8078-5355-4d1b-b496-ab573670****
                            

    found=true を含むログエントリは、DNS クエリのローカルレジストリでドメイン名が見つかり、ドメイン名が解決されたことを示しています。