Service Mesh (ASM) は、複数の ASM インスタンスが複数の Kubernetes クラスターを管理するマルチマスターコントロールプレーンアーキテクチャをサポートしています。単一の ASM インスタンスに複数のクラスターを追加する場合と比較して、このアーキテクチャでは、設定の分離が向上し、設定配信のレイテンシが低減します。ピアツーピアのサービスデプロイメントによるマルチクラスターディザスタリカバリソリューションの構築に最適です。このトピックでは、2 つの ASM インスタンスと 2 つの Container Service for Kubernetes (ACK) クラスターを使用して、マルチマスターコントロールプレーンアーキテクチャを構築する方法を説明します。
背景情報
マルチマスターコントロールプレーンアーキテクチャは、サービスメッシュを使用して複数の Kubernetes クラスターを管理するためのモデルです。このアーキテクチャでは、各 ASM インスタンスが、対応する Kubernetes クラスターのデータプレーンコンポーネントを管理し、そのクラスター内のメッシュプロキシに設定を配信します。共通のルート証明書を共有することで、これらのインスタンス間でクラスターを越えたサービス検出と通信が可能になります。
単一の ASM インスタンスに複数のクラスターを追加する場合と比較して、マルチマスターコントロールプレーンアーキテクチャには次の利点があります。
-
設定配信レイテンシの低減:複数のクラスターは、多くの場合、異なるリージョン、ゾーン、または VPC にまたがっています。このシナリオでは、それぞれの Kubernetes クラスターに地理的に近い複数の ASM インスタンスを使用すると、メッシュプロキシへの設定配信がより高速になります。
-
設定と環境の分離の向上:個別の ASM インスタンスが各クラスターを管理します。これにより、異なるコントロールプレーンリソースをデプロイでき、カナリアリリースや、設定とバージョンの分離が可能になります。ASM インスタンスをアップグレードする際には、コントロールプレーンをバッチで更新できるため、本番環境の可用性が向上します。
-
安定性の向上:ゾーンやリージョンの停止といった極端なシナリオでは、すべてのクラスターに接続された単一のコントロールプレーンが単一障害点となり、設定の同期が妨げられる可能性があります。マルチマスターコントロールプレーンアーキテクチャでは、正常なリージョンまたはゾーン内のメッシュプロキシは、引き続きローカルのコントロールプレーンに接続できるため、設定の配信とメッシュプロキシの起動は影響を受けません。
マルチマスターコントロールプレーンアーキテクチャを構築するには、同じ ASM ルート証明書を共有する複数の ASM インスタンスを作成する必要があります。コントロールプレーンは、このルート証明書を使用して、メッシュプロキシの ID 証明書に署名します。共有ルート証明書を使用することで、異なる ASM インスタンスに接続されたメッシュプロキシは、相互信頼を確立し、mTLS を使用して相互に通信できます。
前提条件
cluster-1 と cluster-2 という名前の 2 つの ACK マネージドクラスターが必要です。両方のクラスターで、EIP で API サーバーの公開 オプションを有効にする必要があります。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
手順1:共有ルート証明書を持つ 2 つの ASM インスタンスの作成
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
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 分待機してください。
-
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-1 が cluster-1 を管理し、mesh-2 が cluster-2 を管理します。クラスター間のサービス検出を有効にするには、各 ASM インスタンスに、もう一方のクラスターをサービス検出専用モードで追加する必要があります。これにより、各インスタンスがもう一方のクラスター内のサービスとエンドポイントを検出できるようになります。
-
mesh-1インスタンスにcluster-2をサービス検出専用モードで追加します。ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
Mesh Management ページで、mesh-1 インスタンスの名前をクリックし、左側のナビゲーションペインで Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択して Add をクリックします。
-
Add Kubernetes Cluster ページで、cluster-2 を見つけ、クラスターの Actions 列にある Add (For Service Discovery Only) をクリックします。 表示されるダイアログボックスで、OK をクリックします。 クラスターが追加されると、Instance Information > Basic Information ページで、ASM インスタンスのステータスが Updating に変わります。 数秒後 (必要な時間は追加されるクラスターの数によって異なります)、ページの右上隅にある
アイコンをクリックすると、ASM インスタンスのステータスが Running に変わります。 Kubernetes Clusters ページで、追加されたクラスターに関する情報を表示できます。
-
mesh-2インスタンスにcluster-1をサービス検出専用モードで追加します。ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
Mesh Management ページで、mesh-2 インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択し、Add をクリックします。
-
Add Kubernetes Cluster ページで cluster-1 を探し、Actions 列の Add (For Service Discovery Only) をクリックします。 表示される確認ダイアログボックスで、OK をクリックします。 クラスターを追加した後、Instance Information > Basic Information ページに移動します。 ASM インスタンスのステータスが Updating に変わります。 数秒待ってから、右上隅にある更新アイコン
をクリックすると、インスタンスのステータスが 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-1 と cluster-2 の Kubernetes クラスターが、異なる VPC やリージョン間など、異なるネットワークにあり、それらのネットワークが Cloud Enterprise Network (CEN) を使用して接続されていない場合は、両方の ASM インスタンスでマルチクラスターネットワーキングを設定する必要があります。また、クラスター間の接続を確保するために、cluster-1 と cluster-2 の両方にクラスター間メッシュプロキシをデプロイする必要があります。クラスター間メッシュプロキシの詳細については、「ASM クラスター間メッシュプロキシを使用した、異なる VPC 内の複数の ACK クラスターのディザスタリカバリ」をご参照ください。
-
mesh-1インスタンスで、cluster-1とcluster-2のネットワーク設定を構成します。ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
Mesh Management ページで、mesh-1 インスタンスの名前をクリックします。 左側のナビゲーションペインで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択します。
-
Multi-cluster Network Configurations をクリックし、次のようにネットワーク設定を構成します。
-
cluster-1については、論理ネットワークをnetwork1に設定し、クラスター間メッシュプロキシ経由のアクセスを有効にします。 -
cluster-2については、論理ネットワークをnetwork2に設定します。
-
同じ論理ネットワーク内のサービスは直接通信できます。異なる論理ネットワーク内のサービスは、クラスター間メッシュプロキシを介して通信する必要があります。クラスター間メッシュプロキシを介したアクセスを有効にすると、
LoadBalancerタイプの Service が自動的に作成され、Server Load Balancer (CLB) 料金が発生します。
-
mesh-2インスタンスで、cluster-1とcluster-2のネットワーク設定を構成します。ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
Mesh Management ページで、mesh-2 インスタンスの名前をクリックします。左側のナビゲーションペインで、Cluster & Workload Management (Data Plane) > Kubernetes Clusters を選択します。
-
Multi-cluster Network Configurations をクリックし、次のようにネットワーク設定を構成します。
-
cluster-1については、論理ネットワークをnetwork1に設定します。 -
cluster-2については、論理ネットワークをnetwork2に設定し、クラスター間メッシュプロキシ経由のアクセスを有効にします。
-
同じ論理ネットワーク内のサービスは直接通信できます。異なる論理ネットワーク内のサービスは、クラスター間メッシュプロキシを介して通信する必要があります。クラスター間メッシュプロキシを介したアクセスを有効にすると、
LoadBalancerタイプの Service が自動的に作成され、CLB 料金が発生します。
手順4:サンプルアプリケーションのデプロイ
このセクションでは、次の図に示すように、cluster-1 に sleep アプリケーションと helloworld サービスの v1 をデプロイし、cluster-2 に helloworld サービスの v2 をデプロイする方法について説明します。2つのクラスター内のサービスは、クラスター間メッシュプロキシを介して相互にアクセスできます。
-
mesh-1とmesh-2の両方のインスタンスで、defaultの namespace に対してサイドカーの自動インジェクションを有効にします。詳細については、「グローバル namespace の管理」をご参照ください。 -
次の YAML マニフェストを使用して、
sleepアプリケーションとhelloworldアプリケーションのv1を作成します。 -
このマニフェストを
cluster-1にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。 -
次の YAML マニフェストを使用して、
helloworldアプリケーションのv2を作成します。 -
このマニフェストを
cluster-2にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。
手順5:クラスター間通信の検証
-
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の間で負荷分散されていることがわかります。 -
次のコマンドを実行して、
cluster-1のsleepアプリケーションのレプリカ数を 0 にスケールします。kubectl scale deploy sleep --replicas=0 -
次の 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 -
上記の マニフェストを
cluster-2にデプロイします。詳細については、「ステートレス Deployment の作成」をご参照ください。 -
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サービスのv1とv2の間で負荷分散されていることがわかります。