ITサービスの開発において、単一OSに複数アプリケーション実行環境を構築できる「コンテナ」の活用が拡大しています。コンテナの普及に伴って、近年注目されているのが「サービスメッシュ」です。
本記事ではサービスメッシュについて、マイクロサービスと併せて詳しく解説します。
マイクロサービスアーキテクチャとは?
マイクロサービスアーキテクチャは、サービスメッシュと関わりが深い概念です。まずは、マイクロサービスアーキテクチャの概要について解説します。
マイクロサービスアーキテクチャの概要
マイクロサービスアーキテクチャとは、サービスの各機能を「マイクロサービス」として独立させ、それぞれを連携させることで1つのサービスを実現する概念です。通常、1つのサービスにさまざまな機能を実装すると機能間の依存関係が複雑となり、プログラムの開発やメンテナンスがしづらくなります。
その点、マイクロサービスアーキテクチャを用いれば、個々の機能の独立性を高められます。結果として機能の再利用性が高まる、機能ごとに作業分担がしやすくなる、などのメリットが得られるのです。開発効率の向上や運用・保守の負担軽減を実現できるため、昨今のサービス開発で注目されています。
マイクロサービスアーキテクチャが抱える課題
マイクロサービスアーキテクチャは有力な概念ではあるものの、その実現には以下の4つの課題があります。1つずつ、順番に解説します。
- トラフィック制御
- セキュリティ
- 可観測性
- パフォーマンス
トラフィック制御
マイクロサービスアーキテクチャでは、マイクロサービス間でデータのやり取りが頻繁に発生します。このときトラフィック制御が適切に行われないと、1つのマイクロサービスの障害によって、サービス全体が停止する恐れもあるのです。
具体的には、下記のような事項を設計段階でしっかり検討する必要があります。
- あるマイクロサービスで障害が発生したときに、どうやって切り離すか
- データの送信先が複数バージョンを持っていた場合、どのバージョンのマイクロサービスに送信するか
- 許容範囲を超えた量のデータが送られた場合、どのように処理するか
セキュリティ
通常であれば、機能間のやり取りは1つのサービスに内包されています。しかしマイクロサービスアーキテクチャの場合は、マイクロサービス間の通信が外部から盗聴されやすくなります。こうしたセキュリティリスクを防ぐためには、通信をどのように暗号化するか、なども考慮しなければなりません。
可観測性
マイクロサービスを適切に連携させて1つのサービスを構成するうえで、全体把握が欠かせません。しかし、1つのマイクロサービスが複数のマイクロサービスと通信することになり、システム構成や通信の流れは煩雑となるのです。マイクロサービス化することで各機能を単体で扱いやすくなる一方、こうした可観測性の確保が課題となります。
パフォーマンス
マイクロサービス間の通信は、専用のAPIを呼び出すことで行います。しかし、APIのコールはネットワークを経由する必要があるため、一定のオーバーヘッドが発生します。APIの仕様を十分に検討しないと通信に多くの時間がかかり、サービス全体のパフォーマンス低下につながるのです。また、個々のマイクロサービスは異なるプロセスで動作させるため、メモリの消費量も増大しやすいでしょう。
サービスメッシュとは?
マイクロサービスアーキテクチャの実現にあたって生じる上記課題のソリューションとなるのが、サービスメッシュです。サービスメッシュとは、マイクロサービス間の通信を「プロキシ」で中継することで、通信を制御する仕組みを指します。
マイクロサービスアーキテクチャでは、複数のマイクロサービスを迅速に起動・制御する必要があります。そのため、通常の仮想サーバーよりも軽量なコンテナを採用することが多いでしょう。サービスメッシュは、コンテナ化したマイクロサービスを制御して、1つのサービスを構成するために用いられます。
サービスメッシュのメリット
サービスメッシュを用いるメリットは、主に次の3つです。1つずつ、順番に解説します。
- 相互運用性の向上
- リアルタイムでの監視と分析
- マイクロサービスの検出
相互運用性の向上
サービスメッシュを用いることでマイクロサービス間の連携が強化され、相互運用性の向上につながります。データ送信先のルーティングが自動化されることで、マイクロサービス間で適切な通信が実現するでしょう。例えば、特定のマイクロサービスだけをアップデートする場合でも、新しいバージョンへの送信先切り替えが容易となります。
リアルタイムでの監視と分析
マイクロサービス間の通信においてプロキシを経由させることで、リアルタイムでの監視・分析が可能になります。これによって、マイクロサービスの異常を迅速に把握したり、時間のかかる通信を特定したりすることも可能です。運用・保守の負担軽減や、ネットワークの問題改善につながるでしょう。
マイクロサービスの検出
マイクロサービス間の通信を適切に行うためには、起動・終了したマイクロサービスを迅速に把握しなければなりません。サービスメッシュを用いることで、こうしたマイクロサービスの変化をリアルタイムに検出することが可能です。これによって、新しいマイクロサービスの立ち上げが迅速になる、などのメリットが得られます。
サービスメッシュを実現できるソフトウェア
サービスメッシュの実現には、専用のソフトウェアを用います。それらのうち次の2つが代表的です。それぞれ詳しく紹介します。
- Istio
- Linkerd
Istio
「Istio(イスティオ)」とは、Google社やIBM社などによって開発されたオープンソースソフトウェアです。コンテナ管理ソフトウェアの中でもポピュラーな「Kubernetes」に対応しています。Istioは、大まかに「データプレーン」と「コントロールプレーン」の2要素で構成されます。
データプレーンは前述したプロキシによって、マイクロサービス間の通信を制御するものです。このデータプレーンには、Lyft社が開発した「Envoy」と呼ばれるソフトウェアが用いられています。一方のコントロールプレーンは、プロキシのポリシー管理を行います。
Istioを用いることで、アップデート時などのサービスへの影響を最小化でき、運用や保守の負担軽減につながるでしょう。
Linkerd
「Linkerd(リンカーディー)」とは、Buoyant社によって開発されたオープンソースソフトウェアです。CNCF(Cloud Native Computing Foundation)がホストしており、Istioと同様Kubernetesに対応しています。アーキテクチャもIstioと似ていますが、こちらの方が少し先にリリースされました。
各マイクロサービス内にLinkerdインスタンスを配置し、マイクロサービス間の通信はこれらを介して行われます。また、マイクロサービスとは別に「namerd」と呼ばれるサービスがあり、コントロールプレーンとしてLinkerdインスタンスのルーティング情報を一元管理します。
まとめ
マイクロサービスアーキテクチャは有力ながら、実現にはトラフィック制御やセキュリティなどの課題が存在します。それらを解決するのが、サービスメッシュです。
サービスメッシュを利用するためには、IstioやLinkerdなどのソフトウェアが必要ですが、Azure Kubernetes Service であればこれらのソフトウェアも使用できます。