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

Alibaba Cloud Service Mesh:ASM マルチマスター制御プレーンアーキテクチャによるマルチクラスタ障害復旧

最終更新日:Jan 13, 2025

Service Mesh (ASM) は、マルチマスター制御プレーンアーキテクチャをサポートしています。これは、複数の ASM インスタンスが複数の Kubernetes クラスタを共同で管理するアーキテクチャです。 ASM インスタンスに複数の Kubernetes クラスタを追加するのと比較して、マルチマスター制御プレーンアーキテクチャは、構成の分離と構成のプッシュにおいて大きな利点を提供します。 これにより、障害復旧のためにピアツーピア方式で複数の Container Service for Kubernetes (ACK) クラスタを構築するのにより適しています。 このトピックでは、2 つの ACK クラスタに基づいて 2 つの ASM インスタンスを含むマルチマスター制御プレーンアーキテクチャを構築する方法について説明します。

背景情報

マルチマスター制御プレーンアーキテクチャは、ASM を使用して複数の Kubernetes クラスタを管理するアーキテクチャです。 このアーキテクチャでは、複数の ASM インスタンスがそれぞれの Kubernetes クラスタのデータプレーンコンポーネントを管理し、クラスタ内のメッシュプロキシに構成をプッシュします。 この場合、特定のクラスタ内のインスタンスは、ASM ルート証明書に基づいて別のクラスタ内のサービスを検出できます。

複数のクラスタを ASM インスタンスに直接追加するのと比較して、このアーキテクチャには次の利点があります。

  • 構成プッシュの低レイテンシ: 複数のクラスタは通常、リージョン、ゾーン、または VPC をまたいでデプロイされます。 このような場合、最も近い Kubernetes クラスタ内のメッシュプロキシを ASM インスタンスに追加できます。 これは、構成プッシュのレイテンシを削減するのに役立ちます。

  • 優れた構成分離と環境分離のパフォーマンス: 複数のクラスタは複数の ASM インスタンスによって管理されます。 各 ASM インスタンスは、異なる制御プレーンリソースをデプロイして、構成とバージョンのカナリアリリースまたは分離を実現できます。 ASM インスタンスをアップグレードする場合、複数の制御プレーンをバッチでアップグレードできます。 これは、オンライン環境の可用性を確保するのに役立ちます。

  • 安定性の保証: ゾーンの可用性がない、リージョンの可用性がない、ネットワーク障害などの極端な状況では、制御プレーンをすべてのクラスタに接続すると、制御プレーンに接続できないためにクラスタが構成および起動に失敗する可能性があります。 ただし、マルチマスター制御プレーンアーキテクチャでは、使用可能なリージョンまたはゾーンのメッシュプロキシは制御プレーンに正常に接続できるため、ASM インスタンスの構成プッシュとメッシュプロキシの正常な起動が保証されます。

マルチマスター制御プレーンアーキテクチャを構築するには、同じ ASM ルート証明書を再利用する複数の ASM インスタンスを作成する必要があります。 証明書は、制御プレーンがメッシュプロキシの ID 認証証明書を発行するために使用するルート証明書です。 同じ ASM ルート証明書を再利用することにより、各 ASM インスタンスに接続されたメッシュプロキシ間で相互信頼と mTLS プロトコルアクセスを実現できます。

前提条件

cluster-1 と cluster-2 という名前の 2 つの Kubernetes クラスタが作成されています。 クラスタを有効にするには、[EIP を使用して API サーバーを公開] を選択します。 詳細については、「ACK マネージドクラスタの作成」をご参照ください。

手順 1: ルート証明書を再利用する 2 つの ASM インスタンスを作成し、各インスタンスのクラスタを作成する

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

  2. [メッシュ管理] ページで、[ASM インスタンスの作成] をクリックします。 次の表は、構成する必要があるパラメータを示しています。

    パラメータ

    Service Mesh 名

    mesh-1

    リージョン

    cluster-1 が存在するリージョンを選択します。

    Istio バージョン

    [v1.22.6.71-g7d67a80b-aliyun] 以降を選択します。

    Kubernetes クラスタ

    cluster-1 を選択します。 インスタンスの作成後、VPC と vSwitch が ASM インスタンスに自動的に追加されます。

    具体的な操作とその他の構成については、「ASM インスタンスの作成」をご参照ください。 インスタンスの状態が [実行中] に変わるまで 2 ~ 3 分かかる場合があります。

  3. [メッシュ管理] ページに戻り、[ASM インスタンスの作成] をクリックします。 次の表は、構成する必要があるパラメータを示しています。

    パラメータ

    Service Mesh 名

    mesh-2

    リージョン

    cluster-2 が存在するリージョンを選択します。

    Istio バージョン

    [v1.22.6.71-g7d67a80b-aliyun] 以降を選択します。

    Kubernetes クラスタ

    cluster-2 を選択します。 インスタンスの作成後、VPC と vSwitch が ASM インスタンスに自動的に追加されます。

    ASM ルート証明書

    [詳細設定を表示] をクリックし、[ASM インスタンスの既存のルート証明書を再利用する] を選択し、ドロップダウンリストから mesh-1 を選択します。

    具体的な操作とその他の構成は、インスタンス mesh-1 と同じです。 インスタンスの状態が [実行中] に変わるまで 2 ~ 3 分かかる場合があります。

手順 2: サービス検出モードのみでクラスタを ASM インスタンスに追加する

手順 1 が完了すると、クラスタ cluster-1 と cluster-2 が ASM インスタンス mesh-1 と mesh-2 にそれぞれ追加され、管理されます。 さらに、サービス検出モードのみで、cluster-2 と cluster-1 をそれぞれ mesh-1 と mesh-2 に追加する必要があります。 これにより、各インスタンスが別のクラスタ内のサービスとサービスエンドポイントを検出できるようになります。

  1. サービス検出モードのみで cluster-2 を mesh-1 に追加します。

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

    2. [メッシュ管理] ページで、mesh-1 の名前をクリックします。 左側のナビゲーションペインで、[クラスタとワークロードの管理] > [kubernetes クラスタ] を選択し、[追加] をクリックします。

    3. [kubernetes クラスタの追加] ページで、mesh-1 に追加する cluster-2 を見つけ、クラスタの [アクション] 列にある [追加(サービスディスカバリのみ)] をクリックします。表示されるダイアログボックスで、[OK] をクリックします。クラスタを追加した後、mesh-1 の名前をクリックします。[ASM インスタンス] > [基本情報] ページで、mesh-1 のステータスが [更新中] に変わります。数秒待ってから、右上隅にある image をクリックします。ASM インスタンスのステータスが [実行中] になります。待機時間は、追加したクラスタの数によって異なります。[kubernetes クラスタ] ページで、追加されたクラスタに関する情報を表示できます。

      image

  2. サービス検出モードのみで cluster-1 を mesh-2 に追加します。

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

    2. [メッシュ管理] ページで、mesh-2 の名前をクリックします。 左側のナビゲーションペインで、[クラスタとワークロードの管理] > [kubernetes クラスタ] を選択し、[追加] をクリックします。

    3. [kubernetes クラスタの追加] ページで、mesh-2 に追加する cluster-1 を見つけ、クラスタの [アクション] 列にある [追加(サービスディスカバリ専用)] をクリックします。表示されるダイアログボックスで、[OK] をクリックします。クラスタを追加した後、mesh-2 の名前をクリックします。[ASM インスタンス] > [基本情報] ページで、mesh-2 のステータスが [更新中] に変わります。数秒待って、右上隅にある image をクリックします。ASM インスタンスのステータスが [実行中] になります。待機時間は、追加したクラスタの数によって異なります。[kubernetes クラスタ] ページで、追加されたクラスタに関する情報を表示できます。

      image

重要

Kubernetes クラスタがサービス検出モードのみで ASM インスタンスに追加された場合、ASM インスタンスはクラスタ内のサービスとサービスエンドポイントのみを検出し、クラスタ内で実行されるデータプレーンコンポーネントは配信しません。 ASM インスタンスに加えられた変更は、サービス検出モードのみで追加された Kubernetes クラスタには適用されません。

[サービス検出のみ] は、マルチマスター制御プレーンアーキテクチャが作成されるシナリオでのみ有効になります。 ASM インスタンスを使用して他のクラスタ内の Kubernetes クラスタを管理するには、クラスタを ASM インスタンスに追加します。 具体的な操作については、「ASM インスタンスへのクラスタの追加」をご参照ください。

手順 3 (オプション): 2 つの ASM インスタンス間にマルチクラスタネットワークを構成する

2 つの Container Service for Kubernetes (ACK) クラスタ cluster-1 と cluster-2 が VPC とリージョンをまたいでデプロイされ、2 つのクラスタが Cloud Enterprise Network (CEN) を介して接続されていない場合は、2 つの ASM インスタンス間にマルチクラスタネットワークを構成し、cluster-1 と cluster-2 のクロス кластерメッシュプロキシをデプロイする必要があります。 これにより、異なるクラスタ内のアプリケーションとサービスがクロス кластерメッシュプロキシを介して相互にアクセスできるようになります。 ASM クロス кластерメッシュプロキシの詳細については、「ASM クロス кластерメッシュプロキシを使用して複数のクラスタ間でクロスネットワーク通信を実装する」をご参照ください。

  1. mesh-1 の cluster-1 と cluster-2 の間にマルチクラスタネットワークを構成します。

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

    2. [メッシュ管理] ページで、mesh-1 の名前をクリックします。 左側のナビゲーションペインで、[クラスタとワークロードの管理] > [kubernetes クラスタ] を選択します。

    3. [マルチクラスタネットワーク構成] ボタンをクリックし、次のようにマルチクラスタネットワークを構成します。

      1. ホーミング論理ネットワーク名 を cluster-1 の network1 に設定し、cluster-1 の クロス クラスター メッシュ プロキシ経由のアクセスを有効にする を有効にします。

      2. ホーミング論理ネットワーク名 を cluster-2 の network2 に設定します。

    image

  1. mesh-2 の cluster-1 と cluster-2 の間にマルチクラスタネットワークを構成します。

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

    2. [メッシュ管理] ページで、mesh-2 の名前をクリックします。 左側のナビゲーションペインで、[クラスタとワークロードの管理] > [kubernetes クラスタ] を選択します。

    3. [マルチクラスタネットワーク構成] ボタンをクリックし、次のようにマルチクラスタネットワークを構成します。

      1. ホーミング論理ネットワーク名 を cluster-2 の network2 に設定し、cluster-2 の クロス クラスター メッシュ プロキシ経由のアクセスを有効にする を有効にします。

      2. ホーミング論理ネットワーク名 を cluster-1 の network1 に設定します。

    image

手順 4: 2 つの ASM インスタンスにサンプルアプリケーションをデプロイする

次の図に示すように、sleep アプリケーションと helloworld サービス V1 は cluster-1 にデプロイされ、helloworld サービス V2 は cluster-2 にデプロイされます。 2 つのクラスタ内のサービスは、ASM クロス кластерメッシュプロキシを介して相互にアクセスできます。

  1. mesh-1 インスタンスと mesh-2 インスタンスの両方で、デフォルトの名前空間の sidecar 自動挿入機能を有効にします。 詳細については、「グローバル名前空間の管理」をご参照ください。

  2. 次のコンテンツを使用して、sleep アプリケーションと helloworld サービス V1 を作成します。

    詳細を表示するにはクリックしてください

    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
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
    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. 上記の YAML ファイルを cluster-1 にデプロイします。 詳細については、「オーケストレーションテンプレートを使用して Linux アプリケーションを作成する」をご参照ください。

  4. 次のコンテンツを使用して、helloworld サービス V2 を作成します。

    詳細を表示するにはクリックしてください

    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. 上記の YAML ファイルを cluster-2 にデプロイします。 詳細については、「オーケストレーションテンプレートを使用して Linux アプリケーションを作成する」をご参照ください。

手順 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 サービスのバージョンが V1 と V2 の間で切り替わることを示しています。

  2. 次のコマンドを実行して、sleep アプリケーションが存在する cluster-1 内のポッドのレプリカ数を 0 に変更します。

    kubectl scale deploy sleep --replicas=0
  3. 次のコンテンツを使用して、別の 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. 上記の YAML ファイルを cluster-2 にデプロイします。 詳細については、「オーケストレーションテンプレートを使用して Linux アプリケーションを作成する」をご参照ください。

  5. cluster-2 の 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: 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 サービスのバージョンが V1 と V2 の間で切り替わることを示しています。