サービスメッシュをわかりやすく解説
0.はじめに
- マイクロサービスアーキテクチャの運用管理に欠かせない技術として「サービスメッシュ」があります。
- サービスメッシュの基本的な概念や機能、代表的なソフトウェアであるIstioを紹介します。
1.マイクロサービスで考慮すべきこと
まず、マイクロサービスの運用管理における課題から、考慮すべき事項を述べます。
- サービスディスカバリ
- トラフィックコントロール
- 可観測性
- 障害の分離
- セキュリティ
1.1.サービスディスカバリ
呼び出すサービスのネットワーク上の位置を特定する仕組みです。サービスがデプロイされる環境の特性から、IPアドレスは動的に変更されることが多く、最新のIPアドレスを常に把握する仕組みが必要です。また、サービスは複数のバージョンを持つこともあるので、必要とするIPアドレスを取得できなければなりません。
1.2.トラフィックコントロール
リクエストの状況に応じた動的な負荷分散を実現するためのネットワークトラフィックの制御です。呼び出し元のサービスの全体像を把握し続けることは困難なので、大量のリクエストが来てもシステムがダウンしないように制御できなければなりません。
1.3.可観測性
サービスの出力から、そのサービスが正常に動作しているかというサービス内部の状態を把握するための仕組みです。複雑にサービスが連携するため、障害や遅延が発生しているサービスを素早く特定できる必要があります。マイクロサービスの各サービスの実装は、それぞれのサービスに適した実装方法が採用されているため、内部実装に依存しない方法で、サービスの内部状態を把握できなければなりません。
1.4.障害の分離
あるサービスで発生した障害や遅延が、広範囲に連鎖してシステム全体に影響を及ぼさないように、障害の影響範囲を局所化する必要があります。
1.5.セキュリティ
リクエストが複数のサービスをまたぐため、呼び出し元のサービスの認証/認可や、通信の暗号化が重要です。
これらの考慮事項を効率的・効果的に解決するために、サービスメッシュと呼ばれる考え方を取り入れる場合が多いです。
次節から、サービスメッシュとは何かについて見ていきます。
2.サービスメッシュとは
サービス間の相互の通信が網の目状、つまり、メッシュ状になっていることから、マイクロサービスにおけるサービス間通信を管理する仕組みのことをサービスメッシュと呼びます。
2.1.サービスメッシュの概念
出典:RedHat:サービスメッシュとは
サービスメッシュは、アプリケーションのさまざまな部分が互いにデータをどのように共有するかを制御する方法です。
サービス間のあらゆる通信を通過する層として、サービスに付随する軽量なプロキシ(サイドカー)を設け、サービスディスカバリやトラフィックコントロール、可観測性、障害の分離、セキュリティといった管理機能を実現します。
2.2.サービスメッシュの構成
サービスメッシュは、コントロールプレーンとデータプレーンの2つのコンポーネントから構成されます。
- コントロールプレーン:サービスメッシュの管理を担当し、サービスディスカバリなどの管理に必要な情報を保管したり、構成変更などの管理の命令を発行したりします。
- データプレーン:コントロールプレーンからの指示を受けてサービスの通信をコントロールしたり、管理に必要な情報をコントロールプレーンに送信したりします。
3.サービスメッシュでできるようになること
ここからは、サービスメッシュを使うとどのようなことができるのか、もう少し具体的な内容について説明していきます。
サービスメッシュを使ったマイクロサービスの管理として、代表的なものは以下の通りです。各項目について解説してきます。
- サービスディスカバリと負荷分散
- トラフィックコントロール
- サーキットブレーカー
- 分散トレーシングのためのテレメトリーデータの収集
- セキュリティ
3.1.サービスディスカバリと負荷分散
各サービスがデプロイや再起動によってIPアドレスが変更された際に、コントロールプレーンは、その構成変更を検知します。
検知の実現方法の1つのやり方は、データプレーンが、コントロールプレーンに対して、IPアドレスを通知する方法です。サービスにアクセスする側のデータプレーンは、コントロールプレーンからアクセス先の情報を入手します。
また、データプレーンは、負荷分散のポリシーもあわせて受信し、そのポリシーにあった方法でサービスへのアクセスを分散します。
3.2.トラフィックコントロール
サービスへのアクセスの割り振りを設定に基づいて変更したり、サービスからの戻り値を変更したりするなど、サービス間の通信を制御する仕組みです。トラフィックコントロールの主な例は、以下の3つです。
- トラフィックの分割
- 条件に応じたトラフィックの分離
- 障害の注入
3.2.1.トラフィックの分割
サービスへのリクエストのうちの10%をバージョン2に、残りの90%をバージョン1に割り振るといった、リクエストのアクセス先を設定された割合によって分けることです。
3.2.2.条件に応じたトラフィックの分離
リクエストの内容に対する条件を設定して、アクセス先を変更することです。例えば、Cookieに含まれるユーザーIDがテスト用のIDであればバージョン2に割り振り、それ以外はバージョン1に割り振るといった場合があります。
3.2.3.障害の注入
特定のサービスへのアクセスについて、レスポンスが返ってくるまでに一定の遅延をわざと発生させたり、必ずHTTPステータスコード500番台のエラーを返したりといった、擬似的な障害状態を作り出す仕組みです。
この機能を利用することで、擬似的な障害状態を作り出すことができ、テストを効率よく実施できるようになります。
3.3.サーキットブレーカー
あるサービスで障害が発生した際に、その影響範囲をできるだけ最小限に抑えるための仕組みです。
障害の種類によっては、サービスの呼び出し元へすぐエラーが返って来ず、タイムアウトまで待つことがあるでしょう。そうなると、タイムアウト待ちが連鎖することになり、システム全体がスローダウンすることもあります。
そこで、障害の発生を検知すると、一定の期間は障害が発生しているサービスへのアクセスを遮断し、すぐにエラーを返すようにします。こうすることで、タイムアウト待ちを制御でき、システム全体のスローダウンの発生を防止します。
また、サービスの回復を検知すると、その回復したサービスへのアクセスを元の通りに再開します。
3.4.分散トレーシングのためのテレメトリーデータの収集
1つのリクエストが複数のサービスをまたがるときに、どのサービスから順に呼び出され、それぞれのサービスで処理時間はどのくらいであったかという、リクエストを追跡するための仕組みです。
マイクロサービスのような分散系システムでは、1つのサービスだけで処理が完結せずに、複数のサービスをまたぐことになるため、性能や障害分析時に必要となる機能となります。
3.5.セキュリティ
サービスが他のサービスを呼び出す際の認証/許可やセキュアな通信を効率よく管理するセキュリティの機能も提供します。
コントロールプレーンは、データプレーンに対して認証/許可ポリシーを配布します。また、サービスを呼び出す側と呼び出される側を相互に認証するための相互TLS認証を実現するために、電子証明書を発行し、管理します。
4.サービスメッシュのデメリット
サービスメッシュの仕組みから以下のようなデメリットが考えられます。現場での使用感も踏まえ、筆者の考えを述べます。
- 通信パフォーマンスの低下
- 使用リソースの上昇
4.1.通信パフォーマンスの低下
サービスメッシュの仕組みとして、アプリケーションのインスタンス毎にプロキシを配置し、他のアプリケーションと通信する際にプロキシを通すことになります。その結果、応答速度が僅かに遅くなります。
ただ、現場でサービスメッシュを導入しているシステムで深刻な遅延は発生していません。なので、僅かなレスポンス遅延も許されないようなシステムでない限り、大きなデメリットにはならないと考えます。
4.2.使用リソースの上昇
サービスメッシュを利用するためのリソースを消費することになります。CPUは大した事ないのですが、リクエスト数が多いコンテナですと、メモリ使用率が結構上昇するように感じます。
なので、導入する前のキャパシティ目標や性能テスト、導入後の経過観測が大切だと考えます。
5.サービスメッシュのソフトウェア例(Istio)
最後に、サービスメッシュの代表的なソフトウェアであるIstioを紹介します。
5.1.Istioとは
Istioは、Google、IBM、Lyftの3社によって開発され、2017年5月に最初のパブリックリリースであるバージョン0.1が公開されました。現在も、オープンソースプロジェクトとして開発が進められています。
Istioを組み込んだクラウドサービスや製品も多く発表されており、筆者の現場でも利用されています。
5.2.Istioの構成
Istioでは、コントロールプレーンとしてistiodが、データプレーンとしてEnvoyが稼働します。
コントロールプレーンのistiodは、大きくPilot、Citadel、Galleyの3つから構成されます。
出典: Istio / Architecture
- Pilot:Envoyと連携し、サービスディスカバリとトラフィックコントロールを担当します。
- Citadel:認証局として、秘密鍵の管理や証明書の発行を担当します。
- Galley:Istioの設定を管理します。
6.さいごに
今回はサービスメッシュのメリットやその仕組みについて簡単に解説しました。
マイクロサービスアーキテクチャは有力ながら、実現にはトラフィック制御やセキュリティなどの課題が存在します。それらを解決するのが、サービスメッシュです。
マイクロサービス化を検討する際には、サービスメッシュの導入も併せて検討しましょう。
Discussion