サービスメッシュとは何か?
Zhihuang Lin
December 9, 2022
サービスメッシュの紹介
サービスメッシュは、マイクロサービスシステムのサービス間通信を管理するために使用される設定可能なインフラストラクチャです。その目的は、マイクロサービス間のトラフィック(東西トラフィックとも呼ばれる)を処理することです。
クラウドネイティブアプリケーションでは、1つのアプリケーションが数百のサービスで構成されることがあります。各サービスには複数のインスタンスがあり、それらのインスタンスは常に変化している可能性があります。このような複雑な実行環境下で、ユーザーに信頼性の高いアクセスを提供し、サービスを安定して稼働させることは大きな課題となっています。そこで、サービスメッシュというソリューションが生まれました。
サービスメッシュは、マイクロサービス間のTCP/IPのようなもので、ネットワーク呼び出し、レートリミット、監視などのサービス間機能を処理します。サービスメッシュは主にKubernetesプラットフォームで使用されます。また、最も古典的なパターンはサイドカーと呼ばれ、いくつかの一般的な機能をサイドカーコンテナに抽象化し、サービスコンテナと一緒に同じポッドにマウントします。以下の画像は、なぜそれがサービスメッシュと呼ばれるのかを示しています。

サイドカーはサービスメッシュを適用する唯一のパターンではありません。それ以外にも、DaemonSetパターンやAmbientメッシュパターンがあります:
-
DaemonSetパターンとサイドカーパターンの違いは、DaemonSetパターンではKubernetesクラスター内の各ノードで1つのポッドしか実行できず、このポッドがサイドカープロキシとして機能することです。サイドカーパターンと比較して、DaemonSetパターンはマシンリソースを大幅に削減しますが、分離性が低い、リソース呼び出しが予測しにくいなどの欠点があります。詳細な違いについては、この記事を参照してください:Sidecars and DaemonSets: Battle of containerization patterns。
-
Ambientメッシュは、2022年9月7日にIstioによって導入された新しいデータプレーンモードです。メッシュのインフラストラクチャとデプロイメントの結合問題を解決するために、Ambientメッシュはデータプレーンプロキシをアプリケーションポッドから分離し、別々にデプロイできるようにします。
Ambientメッシュはデータプレーンをセキュアオーバーレイ層とL7処理層に分割します:セキュアオーバーレイ層は、TCPルーティング、監視メトリクス、アクセスログ、mTLSトンネリングなどの機能を処理します。L7処理層は、セキュアオーバーレイ層のすべての機能に加えて、HTTPルーティングのトラフィック制御、可観測性、豊富なL7認可ポリシーなどの多くの機能を提供します。
さらに、Ambientメッシュは**ztunnel(ゼロトラストトンネル)**と呼ばれる共有エージェントを使用します。これはKubernetesクラスター内の各ノードで実行され、メッシュ内のワークロードを安全に接続し、認証します。Ambientメッシュモードの詳細については、この記事を参照してください:Introducing Ambient Mesh
なぜサービスメッシュが必要なのか?
サービスメッシュが普及する前、多くのマイクロサービスアーキテクチャのサービスガバナンスは、マイクロサービスフレームワークと制御プラットフォームの連携によって実現されていました。しかし、この方法には以下の問題があります:
- フレームワークとサービスの結合が密接であるため、全体のメンテナンスの難易度と複雑さが非常に高くなります。また、開発者はパブリックライブラリを理解する必要があり、サービスの実装に集中できません。
- 多言語フレームワークを維持する必要があり、メンテナンスコストが増加します。
- マイクロサービスのアップグレードコストが高く、通常はアップグレード中にサービスを再起動する必要があります。
- オンライン上に多くの異なるバージョンのフレームワークが存在し、複雑な互換性を考慮する必要があります。
これらの問題を解決するために、元TwitterエンジニアでありLinkerdの創設者の1人であるWillian Morganが「サービスメッシュ」という概念を提案しました。サービスメッシュはサイドカーパターンを使用して、インフラストラクチャとサービスロジックを分離し、アプリケーションに影響を与えることなく、言語に依存しないアップグレードと運用を実現します。
サービスメッシュは、トラフィック制御、可観測性、安全な通信などの機能を基本コンポーネントに移行します。これにより、開発者は通信層やサービス管理の具体的な実装を気にする必要がなくなります。開発者は、通信に関連するすべての面倒な作業をサービスメッシュに任せ、サービス開発に集中できます。これらの特徴に基づいて、サービスメッシュは前述の問題を解決するのに役立ちます。
サービスメッシュはどのように機能するのか?
サービスメッシュは、アプリケーションの実行環境に新しい機能を追加しません。そのため、フレームワーク内のすべてのアプリケーションは、AからBにリクエストを送信する方法を指定するための対応するルールを必要とします。違いは、サービスメッシュがロジック管理のサービス間通信を抽出し、それをインフラストラクチャ層に抽象化することです。
現在、ほとんどのサービスメッシュはデータプレーンとコントロールプレーンのアーキテクチャを使用しています。以下にその構造を示します:

コントロールプレーン
コントロールプレーンは、データプレーンを管理および設定し、サービスを実行しながら戦略を実施します。単一のサービスメッシュ内のすべてのインスタンスは、同じ設定リソースを共有します。
コントロールプレーンは、セキュリティ、可観測性、トラフィック制御などの配信と戦略に重点を置いています。また、データプレーンのテレメトリデータを収集し、DevOpsがそれらを使用できるようにします。
データプレーン
データプレーンは通常、プロキシとして機能し、多くのサイドカープロキシで構成されます。サイドカーはサービスインスタンスと並行して実行され、サービスのデータフローをインターセプトすることでサービスアプリケーションのトラフィックを制御します。
前述のように、サービスメッシュはKubernetesにサイドカーパターンを実装し、それをコンテナとしてラップすることで実現されます。サイドカーは、メインコンテナを拡張および強化するために追加のコンテナを使用することを提案します。この追加のコンテナはサイドカーコンテナと呼ばれ、サービスコンテナと同じポッドに配置されます。一方、サービスメッシュは、これらのサイドカープロキシで構成されるメッシュネットワークです。
サービスメッシュの応用
マイクロサービスアーキテクチャでは、エンジニアは通常、公開されたパブリックサービスを暗号化したり、アクセスを制限したりしてサービスを保護しますが、クラスター内の通信の安全性を無視しています。現在でも、多くのマイクロサービスアプリケーションはサービス間通信の暗号化が不足しており、クラスター内のトラフィックは生データ形式で転送されることがあります。その結果、内部トラフィックは盗聴攻撃やMITM(中間者攻撃)のリスクにさらされます。
クラスター内トラフィックに対する攻撃を防ぐために、mTLSを使用してトラフィックデータを暗号化します。mTLSは、サービスメッシュ内のマイクロサービス間の通信の安全性を確保します。これは、各マイクロサービスを認証し、サービス間のトラフィックを相互に暗号化するために暗号化技術を使用します。

マイクロサービス内で直接通信の安全性戦略を定義し、ID認証と暗号化を実装することもできますが、各マイクロサービスで同じ機能を個別に実装するのは非常に非効率的です。新しい機能を追加するには、サービスのコードを変更し、サービスロジックに侵入する必要があります。さらに、新しい機能を実装できたとしても、その後の反復、アップグレード、テストには開発者がより多くの時間を費やす必要があり、開発者はサービス機能の開発に集中できません。
代わりに、サービスメッシュを使用すると、元のサービスが意識することなくmTLS通信を提供できます。したがって、サービスメッシュでは、すべての通信関連の機能をサイドカープロキシに移行します。
2つのマイクロサービスが通信する必要がある場合、サイドカープロキシはまずmTLS接続を確立し、このmTLS接続を介して暗号化されたトラフィックを送信します。サイドカーは証明書を交換し、認証局によって互いを認証します。接続前に、サイドカーはコントロールプレーンから送信された認証戦略を確認し、マイクロサービスが通信を許可されているかどうかを判断します。通信が許可されている場合、サイドカーは生成された通信キーを使用して安全な接続を確立し、マイクロサービス間の通信データを暗号化します。このプロセス全体を通じて、サービスアプリケーションは影響を受けないため、開発者の負担が軽減されます。

このシナリオから、サービスメッシュが現在のサービスに影響を与えることなく、現在の機能を拡張できる理由が理解できます。もちろん、mTLSに似た内部トラフィックの安全性設定機能を実現するだけでなく、サービスメッシュはコントロールプレーンの設定を変更することで、トラフィック制御、可観測性、コーデックプロトコルなどの機能を迅速に拡張することもできます。
結論
この記事では、サービスメッシュの基本概念、その動作原理、およびそれがもたらす利点について簡単に紹介しました。サービスメッシュはマイクロサービスアーキテクチャを革新し、開発者が複雑なマイクロサービスの実行環境から解放され、サービス機能の開発に集中できるようにします。
サービスメッシュはマイクロサービスアーキテクチャの多くの課題を解決しますが、それでも限界があります。ソフトウェア開発の複雑さは永遠であり、それは単に一部から別の部分に移行するだけです。サービス管理を別の層に抽象化すると、追加の運用の難しさやトラフィックリンクの増加に直面する必要があります。さらに、サービスメッシュはクラウドネイティブ環境で使用する必要があり、DevOpsの専門能力とエンジニアリングの経験に対してより高い基準を設定します。そのため、テクノロジーは問題を解決するためのツールに過ぎず、サービスメッシュがもたらす利点を実際の応用に応じて評価する必要があります。
クラウドネイティブの爆発的な発展とサービスメッシュの最適化により、サービスメッシュは将来的にマイクロサービスアーキテクチャを完全に置き換え、各企業のマイクロサービスとクラウドネイティブの再構築アーキテクチャの第一選択肢となる可能性があります。
API管理についてさらに詳しく知りたい場合は、いつでもお問い合わせください:https://api7.ai/contact。