お疲れ様です。2020年新入社員の野口です。
社内でコンテナオーケストレーションについて学びたいなぁと話をしていると、「CNDT2020でサービスメッシュに関する発表やるから手伝ってくれる?」とお声がけいただき、CNDT2020で登壇する際のデモ環境の構築を行いました。
そこで、今回はまだニッチな技術であるサービスメッシュについて、学んだことをここにまとめておこうと思います。
マイクロサービス
近年、ソフトウェア開発手法の一つとしてマイクロサービス(マイクロサービスアーキテクチャ)が注目されています。
従来の(モノリシックな)ソフトウェア開発は、複数の機能が集まった一つのシステムとして開発するものです。モノリシックなソフトウェアでは、機能間の結合が密であるため、ある機能Aに問題が発生した場合、AだけでなくBやCの改修をする必要があったり、最悪の場合システム全体がダウンしてしまう可能性があります。
対してマイクロサービスでは、機能ごとにサービスとしてシステムを分け、それらを組み合わせて一つの大きなシステムを作ります。それぞれのサービスは、基本的にネットワークで接続されており、他のサービスをAPIで呼び出すことで連携を図ります。そのため、機能同士が疎結合であり、障害に対する耐性やコードの再利用性などが向上します。また、それぞれが独立したサービスであるため、異なるアーキテクチャを採用することも可能です。
マイクロサービスを採用している有名なものとしては以下があげられます。
マイクロサービスの難しいところ
マイクロサービス開発の壁になる部分として、その複雑さがあげられます。複雑さはサービスが増えるごとに大きくなり、管理が難しくなってしまいます。
マシンの管理
マイクロサービスでは、サービスごとにマシンが必要になります。しかし、単純な機能ごとに実際に計算機を買っていてはコストが莫大になってしまうため、通常は仮想マシンまたはコンテナを用いてサービスごとにマシンを設計します。また、クラウドを活用することによって容易にスケーリングを行うことができ、マイクロサービスの恩恵を最大限受けることができます。
ただし、マシンが増えるごとにそれらを管理するコストも大きくなります。そこで、コンテナを宣言的命令で自動的に構成してくれるKubenatesが役に立ちます。Kubenatesは「あるべき構成」を記述しておけば、障害等が発生した場合も「あるべき構成」を保つようにコンテナを管理してくれるソフトウェアです。
詳しくは以下の記事などをご覧ください。
ネットワークの管理
マシンの管理がある程度自動化されたとしても、それらをつなぐネットワークの管理もまた重要です。ネットワークの構成や障害対応、セキュリティ構成などマシンの管理だけではカバーできない部分が多くあります。また、ネットワーク越しにAPIを呼び出すことは、同一マシン内で処理することよりも圧倒的に遅いため、しっかりと管理されたネットワークでなければ、システム全体のレスポンスを損なう結果となってしまいます。
これらの問題を解決するために、ネットワークの管理を行ってくれる考え方がサービスメッシュです。
サービスメッシュ
サービスメッシュは、サービスごとにプロキシを配備し、プロキシを介して他のサービスを呼び出すことで、マイクロサービスのネットワーク部分を分離し、それらを管理しています。
代表的なサービスメッシュソフトウェアには以下のものがあります。
今回はKong社が提供している新進気鋭のサービスメッシュKumaを例に解説を行います。
Kumaは以下の二つのアーキテクチャによって構成されます。
- Data-Plane
以下の図では「DATA-PLANE-PROXY」と表されている部分で、サービスとそれに紐づけられたプロキシのセットです。サービスは同じData-Plane内のプロキシとしか通信をせず、他のサービスを呼び出す際にはプロキシが対象のData-Planeのプロキシに通信します。
- Control-Plane
Kumaの本体ともいうべき存在であり、Data-Planeと通信を行い、それらを監視し制御します。ユーザーはControl-Planeにアクセスすることで、Data-Planeの状態をモニタリングしたり、宣言的命令によってData-Planeを制御することができます。
EnvoyProxyはサービスのlocalhost上にサイドカーとして配備されます。サービスはEnvoyProxyとのみ通信を行い、他のサービスと直接通信を行いません。また、EnvoyProxyは他のData-PlaneのEnvoyProxyのIPアドレスを記憶し、サービス間の通信はすべてEnvoyProxyを通じて行われます。これにより、サービスは他のサービスとのネットワーク構成を知る必要がなく、ネットワーク層とアプリケーション層の分離を実現します。
このように、サービスメッシュを用いてネットワークの管理を任せることで、ネットワークに起因する問題を気にすることが最小限になり、サービスの開発に専念することができます。
まとめ
サービスメッシュについて自分なりに学んだことをまとめてみました。初めてのことが多く難易度は高かったですが、すごくやりがいがあり、なにより「これからの技術!」という感じでとても興味深かったです。
さて、今回担当した内容は、9/8~9にてオンラインで開催するCloudNative Days Tokyo 2020にて、弊社の槌野雅敏が発表します。
参加費は無料ですので、ご興味ある方は是非ご参加ください。
では、また。