設定のプッシュに時間がかかりすぎる場合、 Alibaba Cloud Service Mesh (ASM) のコントロールプレーンが過負荷になっている場合、またはリソース設定の精度が十分でない場合は、サービス検出スコープを設定します。これにより、 ASM は指定された名前空間内のサービスのみを検出し、処理するようになり、設定同期が高速化されます。
前提条件
バージョン 1.10.5.32 以降の ASM インスタンス。手順については、「ASM インスタンスの作成」をご参照ください。
データプレーン上の Container Service for Kubernetes (ACK) クラスターにアクセスするように kubectl が設定されていること。本記事のすべてのコマンドは、そのクラスターに対して実行されます。
ASM インスタンスでコントロールプレーンのログ収集が有効化されていること。本記事の実施例では、これを使用して設定のプッシュを監視します。 ASM インスタンスのバージョンが 1.17.2.35 より前の場合の手順については、「コントロールプレーンのログ収集とログベースのアラートの有効化 (レガシー)」をご参照ください。 ASM インスタンスのバージョンが 1.17.2.35 以降の場合の手順については、「コントロールプレーンのログ収集とログベースのアラートの有効化 (新規)」をご参照ください。
(オプション) バージョン 1.20 以降の ASM インスタンス。このバージョンは、指定したラベルを持つ Pod をサービス検出スコープから除外する場合にのみ必要です。
サービス検出スコープの仕組み
本記事では、サイドカープロキシ設定とは、サイドカープロキシがコントロールプレーンから受信するメッシュ設定情報を指します。
デフォルトでは、データプレーン上のサイドカープロキシは、データプレーンクラスターのすべての名前空間にある全サービスに関する情報を保存します。この情報は、それらの名前空間のワークロードでサイドカープロキシインジェクションが有効になっていない場合でも保存されます。 ASM のコントロールプレーンもメッシュ内のすべての名前空間のサービスを監視しているため、サービス関連の変更があると、コントロールプレーンは関連する設定をすべてのサイドカープロキシにプッシュします。
サービス検出スコープは、データプレーンクラスターの名前空間のラベルに基づいたラベルセレクターを使用します。このラベルセレクターにより、 ASM コントロールプレーンは指定された名前空間内のアプリケーションサービスのみを検出し、処理するようになります。その結果、サイドカープロキシ設定には、選択された名前空間のサービス情報のみが保持されます。選択されていない名前空間でのサービスの変更は、サイドカープロキシへの設定プッシュをトリガーしなくなります。
サービス検出スコープのラベルセレクターは、次の 2 種類のルールをサポートしています。
ラベルの完全一致ルール:ラベルキーとラベル値を指定します。名前空間のラベルが指定されたキーと値に完全に一致する場合にのみ、その名前空間が一致します。
ラベル式一致ルール:ラベルキー、式演算子、およびラベル値のセットを指定して、データプレーン上の名前空間ラベルを照合します。次のオペレーターが使用可能です。
In:データプレーン上の名前空間は指定されたラベルキーを持ち、そのキーの値は指定された値のセットに含まれている必要があります。
NotIn:データプレーン上の名前空間は指定されたラベルキーを持ち、そのキーの値は指定された値のセットに含まれていてはなりません。
Exists:データプレーン上の名前空間は指定されたラベルキーを持つ必要があります。オペレーターが Exists の場合、ラベル値は必要ありません。
DoesNotExist:データプレーン上の名前空間には指定されたラベルキーがあってはなりません。オペレーターが DoesNotExist の場合、ラベル値は必要ありません。
サービス検出スコープの設定
デフォルトでは、 ASM コントロールプレーンは、データプレーンクラスターのすべての名前空間にあるサービスを検出します。 [Mesh Discovery Mode] を選択的検出に設定して、サービス検出スコープが一致する名前空間に検出を限定します。次の 2 つの方法のいずれかを使用してください (両方は使用しないでください)。どちらの方法も同じ [Mesh Discovery Mode] の値を設定しますが、検出する名前空間の指定方法のみが異なります。
いずれかの方法を使用する前に、設定ページを開きます。
ASM コンソールにログインします。左側メニューで、[Service Mesh] > [Mesh Management] を選択します。
[Mesh Management] ページで、対象の ASM インスタンスの名前をクリックします。左側メニューで、サービス検出範囲の設定 を選択します。
方法1:検出する名前空間の選択
この方法では、検出する名前空間を列挙します。選択済みの名前空間のみがサービス検出スコープに留まるため、コントロールプレーンが検出する必要のある名前空間を追加する際には、選択を更新する必要があります。
サービス検出範囲の設定 ページで、 メッシュサービス検出パターン を データプレーン Kubernetes クラスターで選択した名前空間配下のサービスを自動検出 に設定します。
[Select Namespace] タブで、対象のクラスターを選択します。
表示される名前空間のリストで、コントロールプレーンに検出させたくないすべての名前空間の右側にある 選択解除 をクリックします。
ページ下部にある OK をクリックします。確認 ダイアログボックスで、OK をクリックします。
方法2:ラベルセレクターの使用
この方法では、ラベルによって名前空間を照合します。セレクターに一致するラベルを持つすべての名前空間 (後で作成する名前空間を含む) が、サービス検出スコープに留まります。セレクターを設定する前に、コントロールプレーンに検出させたい各名前空間に、一致するラベルが付与されていることを確認してください。一致するラベルのない名前空間は、スコープから除外されます。
サービス検出範囲の設定 ページで、 メッシュサービス検出パターン を データプレーン Kubernetes クラスターで選択した名前空間配下のサービスを自動検出 に設定し、 [Edit Label Selector] タブをクリックします。
名前空間が一致する必要のあるラベルルールを指定します。たとえば、 タグ名 を
asm-discoveryに、 オペレーター を [Exists] に設定すると、asm-discoveryラベルを持つすべての名前空間が一致します。ページ下部にある OK をクリックします。確認 ダイアログボックスで、OK をクリックします。
ASM インスタンスに設定が適用されたことの確認
左側メニューで、グリッド情報 > 基本情報 を選択します。
基本情報 ページで、メッシュの ステータス を確認します。
ステータス が 実行中 の場合、 ASM インスタンスに設定が適用され、再び実行可能な状態になったことを示します。このステータスは、インスタンスの準備が完了したことのみを確認するものです。コントロールプレーンがスコープ外の名前空間のサービスを処理しなくなったことを確認するには、「実施例:サービス検出スコープが有効になったことの確認」で示すように、サイドカープロキシ設定とコントロールプレーンログを確認します。
実施例:サービス検出スコープが有効になったことの確認
この実施例では、サービス検出スコープを絞り込む前と後で、設定のプッシュ動作を比較します。データプレーン上の ACK クラスターにある 2 つの名前空間を使用します。1 つは自動サイドカープロキシインジェクションが有効で asm-discovery=enabled ラベルを持つ ns-in-mesh 、もう 1 つはどちらも持たない ns-not-in-mesh です。 httpbin サンプルアプリケーションは両方の名前空間で実行され、 sleep サンプルアプリケーションは ns-not-in-mesh にデプロイされてサービスの変更をトリガーします。
ステップ1:名前空間とサンプルアプリケーションの準備
データプレーン上の ACK クラスターに、
ns-in-meshとns-not-in-meshの名前空間を作成します。詳細については、「名前空間の作成」をご参照ください。ns-in-mesh名前空間に対して、自動サイドカープロキシインジェクションを有効にします。詳細については、「自動インジェクションの有効化」をご参照ください。次のコマンドを実行して、 ACK クラスターの
ns-in-mesh名前空間にasm-discovery=enabledラベルを追加します。ステップ 3 のラベルセレクターがこのラベルを照合します。kubectl label namespace ns-in-mesh asm-discovery=enabled次の内容を使用して
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次のコマンドを実行して、
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
ステップ2:スコープを絞り込む前のプッシュ動作の確認
次のコマンドを実行して、
ns-in-mesh名前空間内の httpbin Pod の名前を取得します。kubectl get pods -n ns-in-mesh期待される出力:
NAME READY STATUS RESTARTS AGE httpbin-6fcb98998c-46qhr 2/2 Running 0 22m次のコマンドを実行して、サイドカープロキシ設定をエクスポートします。コマンド内の
httpbin-6fcb98998c-46qhrを、前のステップで取得した httpbin Pod 名に置き換えてください。kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.jsonエクスポートした
config_dump.jsonファイルを開き、httpbin.ns-not-in-meshを検索します。httpbin.ns-not-in-meshが検索でヒットします。これは、ns-not-in-mesh名前空間で自動サイドカープロキシインジェクションが有効になっていないにもかかわらず、サイドカープロキシ設定にその名前空間のサービス情報が含まれていることを示しています。次の内容を使用して
sleep.yamlファイルを作成します。################################################################################################## # Sleep サービス ################################################################################################## 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 ---次のコマンドを実行して、 ACK クラスターの
ns-not-in-mesh名前空間に sleep アプリケーションをデプロイします。kubectl apply -f sleep.yaml -n ns-not-in-meshコントロールプレーンログを確認します。コンソールのエントリポイントは、 ASM インスタンスのバージョンによって異なります。
1.17.2.35 より前の ASM インスタンス
ASM コンソールにログインします。左側メニューで、[Service Mesh] > [Mesh Management] を選択します。
[Mesh Management] ページで、対象の ASM インスタンスの名前をクリックします。左側メニューで、グリッド情報 > 基本情報 を選択します。
基本情報 ページで、コントロールプレーンのログ収集 の横にある ログを表示 をクリックします。
プロジェクトページの右上隅で、時間範囲を 5 分 に設定して、ログの範囲を絞り込みます。
Rawログ タブに、sleep アプリケーションの作成に関するログが表示されます。これは、
ns-not-in-mesh名前空間で自動サイドカープロキシインジェクションが有効になっていないにもかかわらず、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 インスタンス
ASM コンソールにログインします。左側メニューで、[Service Mesh] > [Mesh Management] を選択します。
[Mesh Management] ページで、対象の ASM インスタンスの名前をクリックします。左側メニューで、ログセンター を選択します。
ログセンター ページで、コントロールプレーンログ タブをクリックし、時間範囲を 5 分 に設定してログの範囲を絞り込みます。
Rawログ タブに、sleep アプリケーションの作成に関するログが表示されます。これは、
ns-not-in-mesh名前空間で自動サイドカープロキシインジェクションが有効になっていないにもかかわらず、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"}ステップ3:サービス検出スコープを ns-in-mesh 名前空間に絞り込む
「サービス検出スコープの設定」の手順に従って、 ns-in-mesh 名前空間のみがスコープに含まれるようにします。
方法1では、
ns-in-mesh以外のすべての名前空間の右側にある 選択解除 をクリックします。方法2では、 タグ名 を
asm-discoveryに、 オペレーター を [Exists] に設定します。これにより、ステップ1で追加したラベルのため、ns-in-meshが一致します。
ステップ4:スコープを絞り込んだ後のプッシュ動作の確認
次のコマンドを実行して、サイドカープロキシ設定を再度エクスポートします。コマンド内の
httpbin-6fcb98998c-46qhrを、ステップ 2 で取得した httpbin Pod 名に置き換えてください。kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.jsonエクスポートした
config_dump.jsonファイルを開き、httpbin.ns-not-in-meshを検索します。httpbin.ns-not-in-meshは検索でヒットしません。これは、サイドカープロキシ設定にns-not-in-mesh名前空間のサービス情報が含まれなくなったことを示しています。次のコマンドを実行して、 ACK クラスターの
ns-not-in-mesh名前空間から sleep アプリケーションを削除します。kubectl delete -f sleep.yaml -n ns-not-in-meshコントロールプレーンログを再度確認します。「ステップ2:スコープを絞り込む前のプッシュ動作の確認」の ASM バージョンに応じたナビゲーションパスを使用しますが、sleep アプリケーションを削除した時刻が時間範囲に含まれるように、時間範囲を 15 分 に設定します。
sleep アプリケーションの削除に関するログは表示されません。これは、サービス検出スコープ外の名前空間での変更によって、コントロールプレーンからサイドカープロキシへの設定のプッシュがトリガーされないことを示しています。