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

Alibaba Cloud Service Mesh:ASM マルチマスターアーキテクチャによるマルチクラスターディザスタリカバリの設定

最終更新日:Jun 21, 2026

Service Mesh (ASM) は、複数の ASM インスタンスが複数の Kubernetes クラスターを管理するマルチマスターコントロールプレーンアーキテクチャをサポートしています。単一の ASM インスタンスに複数のクラスターを追加する場合と比較して、このアーキテクチャでは、設定の分離が向上し、設定配信のレイテンシが低減します。ピアツーピアのサービスデプロイメントによるマルチクラスターディザスタリカバリソリューションの構築に最適です。このトピックでは、2 つの ASM インスタンスと 2 つの Container Service for Kubernetes (ACK) クラスターを使用して、マルチマスターコントロールプレーンアーキテクチャを構築する方法を説明します。

背景情報

マルチマスターコントロールプレーンアーキテクチャは、サービスメッシュを使用して複数の Kubernetes クラスターを管理するためのモデルです。このアーキテクチャでは、各 ASM インスタンスが、対応する Kubernetes クラスターのデータプレーンコンポーネントを管理し、そのクラスター内のメッシュプロキシに設定を配信します。共通のルート証明書を共有することで、これらのインスタンス間でクラスターを越えたサービス検出と通信が可能になります。

image

単一の ASM インスタンスに複数のクラスターを追加する場合と比較して、マルチマスターコントロールプレーンアーキテクチャには次の利点があります。

  • 設定配信レイテンシの低減:複数のクラスターは、多くの場合、異なるリージョン、ゾーン、または VPC にまたがっています。このシナリオでは、それぞれの Kubernetes クラスターに地理的に近い複数の ASM インスタンスを使用すると、メッシュプロキシへの設定配信がより高速になります。

  • 設定と環境の分離の向上:個別の ASM インスタンスが各クラスターを管理します。これにより、異なるコントロールプレーンリソースをデプロイでき、カナリアリリースや、設定とバージョンの分離が可能になります。ASM インスタンスをアップグレードする際には、コントロールプレーンをバッチで更新できるため、本番環境の可用性が向上します。

  • 安定性の向上:ゾーンやリージョンの停止といった極端なシナリオでは、すべてのクラスターに接続された単一のコントロールプレーンが単一障害点となり、設定の同期が妨げられる可能性があります。マルチマスターコントロールプレーンアーキテクチャでは、正常なリージョンまたはゾーン内のメッシュプロキシは、引き続きローカルのコントロールプレーンに接続できるため、設定の配信とメッシュプロキシの起動は影響を受けません。

マルチマスターコントロールプレーンアーキテクチャを構築するには、同じ ASM ルート証明書を共有する複数の ASM インスタンスを作成する必要があります。コントロールプレーンは、このルート証明書を使用して、メッシュプロキシの ID 証明書に署名します。共有ルート証明書を使用することで、異なる ASM インスタンスに接続されたメッシュプロキシは、相互信頼を確立し、mTLS を使用して相互に通信できます。

前提条件

cluster-1cluster-2 という名前の 2 つの ACK マネージドクラスターが必要です。両方のクラスターで、EIP で API サーバーの公開 オプションを有効にする必要があります。詳細については、「ACK マネージドクラスターの作成」をご参照ください。

手順1:共有ルート証明書を持つ 2 つの ASM インスタンスの作成

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

  2. Mesh Management ページで、Create ASM Instance をクリックします。主要なパラメーターを次の表に示します。

    パラメーター

    サービスメッシュ名

    mesh-1

    リージョン

    cluster-1 クラスターと同じリージョンを選択します。

    Istioバージョン

    v1.22.6.71-g7d67a80b-aliyun 以降のバージョンを選択します。

    Kubernetesクラスター

    cluster-1 を選択します。VPC と vSwitch のパラメーターは自動的に入力されます。

    その他のパラメーターの詳細については、「ASM インスタンスを作成する」をご参照ください。インスタンスの作成後、mesh-1 インスタンスのステータスが Running に変わるまで 2~3 分待機してください。

  3. Mesh Management ページで、Create ASM Instance を再度クリックします。 次の表に、主要なパラメーターを示します。

    パラメーター

    サービスメッシュ名

    mesh-2

    リージョン

    cluster-2 クラスターと同じリージョンを選択します。

    Istioバージョン

    v1.22.6.71-g7d67a80b-aliyun 以降のバージョンを選択します。

    Kubernetesクラスター

    cluster-2 を選択します。VPC と vSwitch のパラメーターは自動的に入力されます。

    ASMルート証明書

    Show Advanced Settings をクリックし、Reuse an Existing Root Certificate of ASM Instance を選択してから、ドロップダウンリストから mesh-1 を選択します。

    表で指定されていない他のパラメーターについては、mesh-1 と同じ値を使用します。インスタンスの作成後、mesh-2 インスタンスのステータスが Running に変わるまで 2〜3 分待ちます。

手順2:サービス検出専用モードでのクラスターの追加

手順1を完了すると、mesh-1cluster-1 を管理し、mesh-2cluster-2 を管理します。クラスター間のサービス検出を有効にするには、各 ASM インスタンスに、もう一方のクラスターをサービス検出専用モードで追加する必要があります。これにより、各インスタンスがもう一方のクラスター内のサービスとエンドポイントを検出できるようになります。

  1. mesh-1 インスタンスに cluster-2 をサービス検出専用モードで追加します。

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

    2. Mesh Management ページで、mesh-1 インスタンスの名前をクリックし、左側のナビゲーションペインで Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択して Add をクリックします。

    3. Add Kubernetes Cluster ページで、cluster-2 を見つけ、クラスターの Actions 列にある Add (For Service Discovery Only) をクリックします。 表示されるダイアログボックスで、OK をクリックします。 クラスターが追加されると、Instance Information > Basic Information ページで、ASM インスタンスのステータスが Updating に変わります。 数秒後 (必要な時間は追加されるクラスターの数によって異なります)、ページの右上隅にある image アイコンをクリックすると、ASM インスタンスのステータスが Running に変わります。 Kubernetes Clusters ページで、追加されたクラスターに関する情報を表示できます。

  2. mesh-2 インスタンスに cluster-1 をサービス検出専用モードで追加します。

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

    2. Mesh Management ページで、mesh-2 インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択し、Add をクリックします。

    3. Add Kubernetes Cluster ページで cluster-1 を探し、Actions 列の Add (For Service Discovery Only) をクリックします。 表示される確認ダイアログボックスで、OK をクリックします。 クラスターを追加した後、Instance Information > Basic Information ページに移動します。 ASM インスタンスのステータスが Updating に変わります。 数秒待ってから、右上隅にある更新アイコン image をクリックすると、インスタンスのステータスが Running に変わります。 追加したクラスターに関する情報は、Kubernetes Clusters ページで確認できます。

      [Kubernetes Clusters] ページで、cluster-1 のステータスが [For Service Discovery Only, Synced]cluster-2 のステータスが [Running, Synced] になります。これにより、両方のクラスターが ASM インスタンスに正常に追加されたことがわかります。

重要

Kubernetes クラスターをサービス検出専用モードで追加すると、ASM インスタンスはクラスター内のサービスとエンドポイントを検出しますが、クラスターにデータプレーンコンポーネントをデプロイしません。ASM インスタンスで行われた設定変更は、このモードで追加されたクラスターには適用されません。

サービス検出専用モードは、マルチマスターコントロールプレーンアーキテクチャの構築のみを目的としています。ASM インスタンスに Kubernetes クラスターを完全に管理させたい場合は、クラスターを ASM インスタンスに直接追加してください。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。

手順3 (任意):マルチクラスターネットワーキングの設定

cluster-1cluster-2 の Kubernetes クラスターが、異なる VPC やリージョン間など、異なるネットワークにあり、それらのネットワークが Cloud Enterprise Network (CEN) を使用して接続されていない場合は、両方の ASM インスタンスでマルチクラスターネットワーキングを設定する必要があります。また、クラスター間の接続を確保するために、cluster-1cluster-2 の両方にクラスター間メッシュプロキシをデプロイする必要があります。クラスター間メッシュプロキシの詳細については、「ASM クラスター間メッシュプロキシを使用した、異なる VPC 内の複数の ACK クラスターのディザスタリカバリ」をご参照ください。

  1. mesh-1 インスタンスで、cluster-1cluster-2 のネットワーク設定を構成します。

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

    2. Mesh Management ページで、mesh-1 インスタンスの名前をクリックします。 左側のナビゲーションペインで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択します。

    3. Multi-cluster Network Configurations をクリックし、次のようにネットワーク設定を構成します。

      1. cluster-1 については、論理ネットワークを network1 に設定し、クラスター間メッシュプロキシ経由のアクセスを有効にします。

      2. cluster-2 については、論理ネットワークを network2 に設定します。

    同じ論理ネットワーク内のサービスは直接通信できます。異なる論理ネットワーク内のサービスは、クラスター間メッシュプロキシを介して通信する必要があります。クラスター間メッシュプロキシを介したアクセスを有効にすると、LoadBalancer タイプの Service が自動的に作成され、Server Load Balancer (CLB) 料金が発生します。

  1. mesh-2 インスタンスで、cluster-1cluster-2 のネットワーク設定を構成します。

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

    2. Mesh Management ページで、mesh-2 インスタンスの名前をクリックします。左側のナビゲーションペインで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択します。

    3. Multi-cluster Network Configurations をクリックし、次のようにネットワーク設定を構成します。

      1. cluster-1 については、論理ネットワークを network1 に設定します。

      2. cluster-2 については、論理ネットワークを network2 に設定し、クラスター間メッシュプロキシ経由のアクセスを有効にします。

    同じ論理ネットワーク内のサービスは直接通信できます。異なる論理ネットワーク内のサービスは、クラスター間メッシュプロキシを介して通信する必要があります。クラスター間メッシュプロキシを介したアクセスを有効にすると、LoadBalancer タイプの Service が自動的に作成され、CLB 料金が発生します。

手順4:サンプルアプリケーションのデプロイ

このセクションでは、次の図に示すように、cluster-1sleep アプリケーションと helloworld サービスの v1 をデプロイし、cluster-2helloworld サービスの v2 をデプロイする方法について説明します。2つのクラスター内のサービスは、クラスター間メッシュプロキシを介して相互にアクセスできます。

image
  1. mesh-1mesh-2 の両方のインスタンスで、default の namespace に対してサイドカーの自動インジェクションを有効にします。詳細については、「グローバル namespace の管理」をご参照ください。

  2. 次の YAML マニフェストを使用して、sleep アプリケーションと helloworld アプリケーションの v1 を作成します。

    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: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: helloworld
      labels:
        app: helloworld
    spec:
      ports:
      - port: 5000
        name: http
      selector:
        app: helloworld
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: helloworld
      labels:
        account: helloworld
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloworld-v1
      labels: 
        apps: helloworld
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: helloworld
          version: v1
      template:
        metadata:
          labels:
            app: helloworld
            version: v1
        spec:
          serviceAccount: helloworld
          serviceAccountName: helloworld
          containers:
          - name: helloworld
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-helloworld-v1:1.0
            imagePullPolicy: IfNotPresent 
            ports:
            - containerPort: 5000
  3. このマニフェストを cluster-1 にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。

  4. 次の YAML マニフェストを使用して、helloworld アプリケーションの v2 を作成します。

    YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: helloworld
      labels:
        app: helloworld
    spec:
      ports:
      - port: 5000
        name: http
      selector:
        app: helloworld
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: helloworld
      labels:
        account: helloworld
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloworld-v2
      labels: 
        apps: helloworld
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: helloworld
          version: v2
      template:
        metadata:
          labels:
            app: helloworld
            version: v2
        spec:
          serviceAccount: helloworld
          serviceAccountName: helloworld
          containers:
          - name: helloworld
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-helloworld-v2:1.0
            imagePullPolicy: IfNotPresent 
            ports:
            - containerPort: 5000
  5. このマニフェストを cluster-2 にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。

手順5:クラスター間通信の検証

  1. cluster-1 の kubeconfig ファイルを使用して、次のコマンドを実行します。

     kubectl exec -it deploy/sleep -- sh -c 'for i in $(seq 1 10); do curl helloworld:5000/hello; done;'

    期待される出力:

    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx

    出力から、リクエストが helloworld サービスの v1v2 の間で負荷分散されていることがわかります。

  2. 次のコマンドを実行して、cluster-1sleep アプリケーションのレプリカ数を 0 にスケールします。

    kubectl scale deploy sleep --replicas=0
  3. 次の YAML マニフェストを使用して、sleep アプリケーションを作成します。

    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: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
  4. 上記の マニフェストを cluster-2 にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。

  5. cluster-2 で、次のコマンドを再度実行します。

     kubectl exec -it deploy/sleep -- sh -c 'for i in $(seq 1 10); do curl helloworld:5000/hello; done;'

    期待される出力:

    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v1, instance: helloworld-v1-7b888xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx
    Hello version: v2, instance: helloworld-v2-7b949xxxxx-xxxxx

    出力から、リクエストが引き続き helloworld サービスの v1v2 の間で負荷分散されていることがわかります。