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

Alibaba Cloud Service Mesh:ASM 構成プッシュの効率を向上させるためのサービスディスカバリーセレクターの使用

最終更新日:Jan 14, 2025

構成のプッシュ時間が長い、コントロールプレーンが過負荷になっている、リソース構成が正しくないなどの問題が発生した場合は、サービスディスカバリーセレクターを構成して、コントロールプレーンからデータプレーンのサイドカープロキシへのサービス構成のプッシュ効率を向上させることができます。 サービスディスカバリーセレクターを構成して、コントロールプレーンが指定された名前空間内のサービスのみを検出して処理するようにすることができます。 これにより、無効な通信が削減され、構成の同期プロセスが高速化され、Service Mesh (ASM) の安定した実行が保証され、O&M 効率が向上します。

前提条件

背景情報

説明

このトピックでは、サイドカープロキシ構成とは、サイドカープロキシがコントロールプレーンから受信する ASM 構成を指します。

デフォルトでは、データプレーンのサイドカープロキシは、ワークロードにサイドカープロキシが挿入されていない名前空間も含め、クラスタのすべての名前空間にあるサービスの構成を保存します。 コントロールプレーンは、すべての名前空間内のサービスを監視し、すべてのサイドカープロキシにサービスの変更をプッシュします。

クラスタ内の名前空間のラベルに基づいてラベルセレクターを構成できます。 ラベルセレクターを使用すると、コントロールプレーンは、選択された名前空間内のサービスのみを検出して処理します。 このように、コントロールプレーンは選択されていない名前空間内のサービスの構成をサイドカープロキシにプッシュしないため、サイドカープロキシは選択された名前空間内のサービスの構成のみを保存します。

ラベルセレクターは、以下のマッチングルールをサポートしています。

  • 完全一致: ラベル名とラベル値を指定できます。 名前空間は、そのラベル名と値が指定されたものと一致する場合にのみ選択できます。

  • 式による一致: ラベル名、式演算子、およびいくつかのラベル値を指定して、指定された条件を満たすラベルを持つデータプレーンの名前空間を選択できます。 以下の項目では、演算子の意味について説明します。

    • In: データプレーンの名前空間は、指定された名前と一致する名前のラベルがあり、対応するラベル値が指定された値のいずれかである場合にのみ選択できます。

    • NotIn: データプレーンの名前空間は、指定された名前と一致する名前のラベルがあり、対応するラベル値が指定された値のいずれでもない場合にのみ選択できます。

    • Exists: データプレーンの名前空間は、指定された名前と一致する名前のラベルがある場合に選択できます。 対応するラベル値には要件はありません。

    • DoesNotExist: データプレーンの名前空間は、そのラベルのいずれも指定されたラベル名と一致しない場合にのみ選択できます。 ラベル値には要件はありません。

手順 1: ASM で 2 つの名前空間を作成する

  1. ns-in-mesh と ns-not-in-mesh の 2 つの名前空間を作成します。 詳細については、「名前空間の作成」をご参照ください。

  2. ns-in-mesh 名前空間でサイドカープロキシの自動挿入を有効にします。 詳細については、「サイドカープロキシの自動挿入の有効化」をご参照ください。

手順 2: 2 つの名前空間にサンプルアプリケーションをデプロイする

  1. 次のコマンドを実行して、asm-discovery=enabled ラベルを ns-in-mesh 名前空間に追加します。

    kubectl label namespace ns-in-mesh asm-discovery=enabled
  2. httpbin.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    httpbin.yaml ファイルを表示

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. 次のコマンドを実行して、ns-in-mesh 名前空間と ns-not-in-mesh 名前空間に HTTPBin アプリケーションを作成します。

    kubectl apply -f httpbin.yaml -n ns-in-mesh
    kubectl apply -f httpbin.yaml -n ns-not-in-mesh

手順 3: コントロールプレーンがサイドカープロキシに構成をプッシュするかどうかを確認する

  1. サイドカープロキシの構成を表示します。

    1. 次のコマンドを実行して、HTTPBin アプリケーションが存在する ns-in-mesh 名前空間のポッドの名前を取得します。

      kubectl get pods -n ns-in-mesh

      期待される出力:

      NAME                       READY   STATUS    RESTARTS   AGE
      httpbin-6fcb98998c-46qhr   2/2     Running   0          22m
    2. 次のコマンドを実行して、サイドカープロキシの構成をダウンロードします。

      コマンドの httpbin-6fcb98998c-46qhr を、前の手順で取得した HTTPBin アプリケーションが存在するポッドの名前に置き換えます。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    3. ダウンロードした config_dump.json ファイルを開き、httpbin.ns-not-in-mesh を検索します。

      httpbin.ns-not-in-mesh が見つかった場合、名前空間でサイドカープロキシの自動挿入が有効になっていなくても、サイドカープロキシは ns-not-in-mesh 名前空間のサービス構成を保存します。

  2. コントロールプレーンのログを表示します。

    1. コントロールプレーンのログ収集を有効にします。

    2. ACK クラスタの ns-not-in-mesh 名前空間に sleep アプリケーションをデプロイします。

      1. sleep.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

        sleep.yaml ファイルを表示

        ##################################################################################################
        # Sleep service
        ##################################################################################################
        apiVersion: v1
        kind: Service
        metadata:
          name: sleep
          labels:
            app: 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:
              containers:
              - name: sleep
                image: pstauffer/curl
                command: ["/bin/sleep", "3650d"]
                imagePullPolicy: IfNotPresent
        ---
      2. 次のコマンドを実行して、ns-not-in-mesh 名前空間に sleep アプリケーションをデプロイします。

        kubectl apply -f sleep.yaml -n ns-not-in-mesh
    3. ログを表示します。

      バージョン 1.17.2.35 より前の ASM インスタンスの場合

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

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

      3. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM インスタンス] > [基本情報] を選択します。

      4. 表示されるページで、[コントロールプレーンのログ収集] の横にある [ログの表示] をクリックします。

        表示されるプロジェクトページの右上隅で、[時間範囲] を [5 分] に設定して、表示されるログの範囲を絞り込みます。 [未加工ログ] タブで、sleep アプリケーションの作成に関するログを確認できます。 ログは、名前空間でサイドカープロキシの挿入が有効になっていなくても、コントロールプレーンが ns-not-in-mesh 名前空間のサービス構成をプッシュすることを示しています。

        {"content":"2024-01-04T10:27:00.056248Z\tinfo\tads\tPush debounce stable[16] 1 for config ServiceEntry/ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local: 100.183738ms since last change, 100.183497ms since last push, full=true","_time_":"2024-01-04T18:27:00.056310074+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|4","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}
        {"content":"2024-01-04T10:26:59.956023Z\tinfo\tads\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:26:59.956087922+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|3","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}

      バージョン 1.17.2.35 以降の ASM インスタンスの場合

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

      2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[可観測性管理センター] > [ログセンター] を選択します。

      3. [ログセンター] ページで、[コントロールプレーンログ] タブをクリックし、[時間範囲] を [5 分] に設定して、表示されるログの範囲を絞り込みます。

        [未加工ログ] タブで、sleep アプリケーションの作成に関するログを確認できます。 ログは、名前空間でサイドカープロキシの挿入が有効になっていなくても、コントロールプレーンが ns-not-in-mesh 名前空間のサービス構成をプッシュすることを示しています。

        {"content":"2024-01-04T10:33:21.180016Z\tinfo\tads\tPush debounce stable[28] 2 for config Address//c847e048f73054cb192835f8a60ea5219//Pod/ns-not-in-mesh/sleep-fc5cdb9c5-pkfvr and 1 more configs: 100.488198ms since last change, 121.179298ms since last push, full=true","_time_":"2024-01-04T18:33:21.180104591+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|9","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}
        {"content":"2024-01-04T10:33:21.079470Z\tinfo\tmodel\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:33:21.07954976+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|8","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}

手順 4: ASM でサービスディスカバリーセレクターを構成する

サービスディスカバリーセレクターを構成して、コントロールプレーンが asm-discovery ラベルが付いた ns-in-mesh 名前空間のサービス構成のみをサイドカープロキシにプッシュするようにすることができます。 目的の名前空間を選択するか、ラベルセレクターを編集して、サービスディスカバリーセレクターを構成できます。

方法 1: 目的の名前空間を選択する

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[ASM インスタンス] > [サービスディスカバリーセレクター] を選択します。

  3. [サービスディスカバリーセレクター] ページで、[メッシュディスカバリーモード][データプレーンの Kubernetes クラスタの選択された名前空間内のサービスを自動的に検出する] に設定します。

  4. [名前空間の選択] タブで、目的のクラスターを選択します。 下のリストで、ns-in-mesh 以外のすべての名前空間を見つけます。 [選択解除]ns-in-mesh 以外のすべての名前空間の横にあるクリックします。 ページの下部にある [OK] をクリックします。 [送信] メッセージで、[OK] をクリックします。

  5. 構成が成功したかどうかを確認します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM インスタンス] > [基本情報] を選択します。

    2. 表示されるページで、ASM インスタンスの [ステータス] を確認します。

      [ステータス][実行中] の場合、構成は成功です。

方法 2: ラベルセレクターを編集する

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[ASM インスタンス] > [サービスディスカバリーセレクター] を選択します。

  3. [サービスディスカバリーセレクター] ページで、[メッシュディスカバリーモード][データプレーンの Kubernetes クラスタの選択された名前空間内のサービスを自動的に検出する] に設定し、[ディスカバリーセレクターを直接編集] をクリックします。

  4. [キー]asm-discovery に、[演算子][exists] に設定します。 ページの下部にある [OK] をクリックします。 [送信] メッセージで、[OK] をクリックします。

  5. 構成が成功したかどうかを確認します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM インスタンス] > [基本情報] を選択します。

    2. 表示されるページで、ASM インスタンスの [ステータス] を確認します。

      [ステータス][実行中] の場合、構成は成功です。

手順 5: サービスディスカバリーセレクターが有効になっていることを確認する

  1. サイドカープロキシの構成を表示します。

    1. 次のコマンドを実行して、サイドカープロキシの構成をダウンロードします。

      コマンドの httpbin-6fcb98998c-46qhr を、HTTPBin アプリケーションが存在するポッドの名前に置き換えます。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    2. ダウンロードした config_dump.json ファイルを開き、httpbin.ns-not-in-mesh を検索します。

      httpbin.ns-not-in-mesh が見つからない場合、サイドカープロキシは ns-not-in-mesh 名前空間のサービス構成を保存しません。

  2. コントロールプレーンのログを表示します。

    1. 次のコマンドを実行して、ACK クラスタの ns-not-in-mesh 名前空間から sleep アプリケーションを削除します。

      kubectl delete -f sleep.yaml -n ns-not-in-mesh
    2. コントロールプレーンのログを表示します。

      バージョン 1.17.2.35 より前の ASM インスタンスの場合

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

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

      3. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM インスタンス] > [基本情報] を選択します。

      4. 表示されるページで、[コントロールプレーンのログ収集] の横にある [ログの表示] をクリックします。

        表示されるプロジェクトページの右上隅で、[時間範囲] を [15 分] に設定して、表示されるログの範囲を絞り込みます。 削除された sleep アプリケーションに関するログが表示されない場合、サービスディスカバリーセレクターは有効です。 コントロールプレーンは、選択されていない名前空間でサービスの変更が発生した場合、サービス構成をサイドカープロキシにプッシュしません。

      バージョン 1.17.2.35 以降の ASM インスタンスの場合

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

      2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[可観測性管理センター] > [ログセンター] を選択します。

      3. [ログセンター] ページで、[コントロールプレーンログ] タブをクリックし、[時間範囲] を [15 分] に設定して、表示されるログの範囲を絞り込みます。

        削除された sleep アプリケーションに関するログが表示されない場合、サービスディスカバリーセレクターは有効です。 コントロールプレーンは、選択されていない名前空間でサービスの変更が発生した場合、サービス構成をサイドカープロキシにプッシュしません。

関連操作

指定されたラベルを持つポッドがサービスディスカバリーセレクターによって選択されない

ASM は、デフォルトで、データプレーンの Kubernetes クラスタ内のすべてのサービスとポッドを検出できます。 ASM のコントロールプレーンは、クラスタ外のポッドを検出できず、サイドカープロキシからポッドにリクエストは送信されません。 バージョン 1.20 以降の ASM では、ラベルセレクターを構成して、指定されたラベルを持つポッドを ASM サービスから除外できます。 これにより、特定のポッドが受信したすべてのトラフィックを迅速に転送できます。

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[ASM インスタンス] > [サービスディスカバリーセレクター] を選択します。

  3. [詳細設定を表示] をクリックし、[特定のラベルを持つログは選択されない] をクリックします。 [キー][値] を入力して、選択したポッドを ASM サービスから除外します。 また、topology.kubernetes.io/region を使用して特定のリージョン内のポッドを除外したり、topology.kubernetes.io/zone を使用して特定のゾーンに存在するポッドを指定したりすることもできます。

  4. ページの下部にある [OK] をクリックします。 表示されるダイアログボックスで、[OK] をクリックします。