progrhyme's tech blog

主にIT関連の技術メモ

サービスメッシュについて調べた

はじめに

最近、「サービスメッシュ」という語を見聞きする機会が増えた。
概念を正しく理解しておきたいと思って、このところ調べていたので、ここにまとめを記しておく。

サービスメッシュとは何か

TL;DR

Microservicesとして構成される分散システムにおいて、サービス間通信を担う専用のレイヤ。
サービスディスカバリ、負荷分散、トラフィック制御、通信のセキュア化などの機能を実現し、個々のサービスから利用可能にする。
代表的なプロダクトとして、 IstioLinkerdが挙げられる。

出典

上のようにまとめるにあたって参照した記事、文書、書籍を紹介する。
若干、相互に食い違う内容があったので、適当に自分が穏当と思うように取捨選択した。

私の解釈

もはや、当該レイヤで動作する(ソフトウェア)システムと定義してしまった方がしっくり来る。
なぜなら、上で述べたような機能を提供するもの(として認知されてきている)なので。

「service mesh」という語が登場するようになった当初は、単にMicroservices上のネットワークを指していたような表現が見られるが、いつの間にか「そのレイヤで動作するソフトウェア」という意味で述べられることが普通になってきたような気がする。

プロダクト

2018/8/11現在、自分が把握しているもの:

  • Istio
  • Envoy ... CNCF Incubation Project. Istio内ではプロキシ機能を担うコアコンポーネント
  • Buoyant社製品(※OSS)
  • Consul ... いつの間にか「distributed service mesh」となっている。また、Connectという新機能でsidecar proxyや通信の暗号化が実現される。

アーキテクチャ

サービスメッシュは上で述べたような概念のシステムなので、その実装は色々あり得るはずだが、IstioやLinkerdが事実上の標準実装となっているような向きがある。
正直、まだそんなに踏み込んで見てないのだけど、それらの構成要素は一致しており、よく似たアーキテクチャーとなっているようだ。

Istioのドキュメントから図を引用しておこう。

図: Istio Architecture

サービスメッシュ・システムの標準的な構成要素:

  • Data Plane ... サービス間の通信レイヤ
    • Sidecar Proxy ... 個々のサービス・プロセスとともに配置され、in/out双方向の通信を中継する。
  • Control Plane ... クラスタ内に配置される独立したサービスで、様々な中央集権的機能を担う。例えば、プロキシの管理を含むData Planeの制御や、設定変更のためのAPIが挙げられる。

その他参考:

サービスメッシュが必要とされた背景

既に上に挙げたWilliam Morganの記事から、内容をかいつまんで訳す。

大規模なMicroservicesシステムはGoogleNetflix, Twitterといった巨大企業で発展していった。
アプリケーションが多数のサービスに分割され、複雑化する内に、汎用的な通信レイヤが必要とされた。 しかし、それらは「重厚なクライアントライブラリ」の形を取った。
TwitterのFinagle, NetflixのHystrix, GoogleのStubbyが具体例だ。
それらこそが最初の「サービスメッシュ」だと言える。

この「重厚なクライアントライブラリ」の問題点は、以下だ。

  • ライブラリによって、アプリケーションの開発言語やフレームワークが強制されてしまう
  • 一方で、コンテナの普及により様々な言語で作られたサービスが動作することが普通になった

従って、「ライブラリ形のアプローチはもはや現実的ではない」と述べられている。

サービスメッシュが登場した歴史

LinkerdとEnvoyのどっちが先だったかわからないが、どっちかが最初だと思う。

2016年:

2017年:

他にもっとこんなのあったよ、という情報をお持ちの方がいたら、教えていただけたらここに追記するかもしれません。

終わりに

以下、雑感。

それなりの規模のMicroservicesを運用しているところだったら、なんらかの形でサービスメッシュ的なものを使っているのではないか。
一歩引いて、自分たちの環境におけるサービスメッシュに相当するものは何か、と考えると面白いかもしれない。

大規模で、コンテナを使ったサービスでMicroservices化された環境だったら、Istioなどの製品は相性が良さそう。

参考

*1:https://conduit.io/ Kubernetes向けの軽量Service Mesh