コンテンツにスキップ

サービスメッシュ@サービスメッシュ系ミドルウェア

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. マイクロサービス間通信の管理

非メッシュ

▼ 非メッシュとは

マイクロサービスアーキテクチャで、マイクロサービス間でパケットを直接的に送受信する。

しかし、マイクロサービスアーキテクチャ固有のインフラ領域の課題 (例:マイクロサービス間通信の制御、マイクロサービス間通信のセキュリティ、テレメトリー作成など) があり、非推奨である。


メッシュ

▼ メッシュとは

マイクロサービスアーキテクチャで、マイクロサービス間の通信をメッシュで管理する。

サービスメッシュを導入しない場合と比較して、サービスメッシュを導入すると固有の課題を一括で制御しやすい。

マイクロサービスアーキテクチャ固有のインフラ領域の問題 (例:サービスディスカバリーの必要性、マイクロサービス間通信の暗号化、テレメトリー作成、認証など) を解決するためのロジックを切り分け、各マイクロサービスに共通的に提供できる。

mesh


02. サービスメッシュ

サービスメッシュとは

マイクロサービス間の通信方式でリクエスト/レスポンス方式を採用した場合に使用するメッシュ。


サービスメッシュの層

マイクロサービスアーキテクチャでは、マイクロサービスへのインバウンド通信ロジック、マイクロサービスからのアウトバウンド通信ロジック、マイクロサービスのテレメトリーの収集ロジック、必要になる。

サービスメッシュの概念が提唱される前、これらのロジックを持つライブラリを各マイクロサービスに持たせていた。

service-mesh_layer

サービスメッシュの概念が提唱され、アーキテクチャのインフラストラクチャ層としてリバースプロキシサイドカーをインジェクションするようになった。

サービスメッシュの概念により、アプリエンジニアがこれらのロジックを意識せずに (透過的に) 、インフラストラクチャ層より上層 (インターフェース層、ユースケース層、ドメイン層) の実装に注力できる。


共有ライブラリモデル

サービスメッシュが登場する前のモデル。

各マイクロサービスに共有ライブラリを配置する。


サイドカー型

▼ サイドカー型とは

マイクロサービスのリバースプロキシをサイドカーパターンで配置し、このコンテナをコントロールプレーンで一括管理する。

マイクロサービス間の通信を透過的にする (通信の存在を感じさせない) ことを思想としている。

service-discovery_kubernetes_vs_istio

▼ 透過的

サイドカー型でマイクロサービス間の通信を透過的にするためには、自動でサイドカープロキシを経由するような仕組みが必要である。

例えば、iptablesによるサイドカープロキシへのリダイレクトがある。

▼ 適するリバースプロキシ

マイクロサービスアーキテクチャでは、リバースプロキシのレイテンシー (レスポンスタイム) が重要である。

Envoy、Nginx、HAProxy、のレイテンシーの比較では、Envoyのレイテンシーが最も短いとの結果が出ている。

service-mesh_sidecar-proxy_reverse-proxy


サイドカーレス型とは

Node上にエージェントを配置し、これを経由してマイクロサービス間で通信する。


サービスメッシュの型の比較

サイドカー型 カーネルモデル
Nodeのハードウェアリソース消費量 × ⭕️
Nodeのストレージ使用量 ⭕️ (なし)
データプレーンの冗長性 ⭕️
マイクロサービスごとの設定カスタマイズ ⭕️
単純性 × ⭕️


03. サービスメッシュの実装

サービスメッシュのコンポーネント

概念としてのサービスメッシュを実装する必要がある。

リバースプロキシとして動作するコンテナをサイドカーパターンで配置し、このコンテナを中央集中的に管理するように実装する。

サイドカープロキシが稼働する領域を『データプレーン』、中央集中的に管理する領域を『コントロールプレーン』という。

service-mesh_control-plane


OSSごとの実装方法

データプレーンとコントロールプレーンの組み合わせには様々ある。

OSS名 データプレーンの実装 コントロールプレーンの実装 サポートしているXDS-API
Istio Envoy Istiod 全てのXDS-API
Linkerd ビルトインプロキシ (Linkerd2-proxy) Proxy Injector、Destination、Identity 全てのXDS-API
Consul ビルトインプロキシ、Envoy Consul-control-plane 全てのXDS-API
SPIRE Envoy SPIRE SDSのみ
... ... ... ...


04. サービスディスカバリー

サービスディスカバリーとは

マイクロサービスアーキテクチャにて、送信元マイクロサービスが宛先マイクロサービスの場所 (IPアドレス、ポート番号、完全修飾ドメイン名など) を動的に検出し、通信できるようにする仕組みのこと。


サービスディスカバリーの要素

service-discovery-pattern.png

サービスディスカバリーの仕組みは、次の要素からなる。

  • 送信元マイクロサービス
  • 宛先マイクロサービス
  • サービスレジストリ
  • ロードバランサー
  • 名前解決 (DNSベースのサービスディスカバリーの場合のみ)


05. デザインパターン

クライアントサイドパターン

▼ クライアントサイドパターン

service-discovery-pattern_client-side

サービスレジストリ (例:etcd) に宛先を問い合わせ、宛先にルーティングする責務は、クライアント側マイクロサービスにある。

(1)

送信元マイクロサービスは、宛先マイクロサービスの場所をサービスレジストリに問い合わせ、宛先情報を取得する。

(2)

送信元マイクロサービスは、ロードバランサーを経由して、宛先マイクロサービスにリクエストを送信する。

▼ 実装方法

  • Netflix Eureka


サーバーサイドパターン

▼ サーバーサイドパターンとは

service-discovery-pattern_server-side

サービスレジストリ (例:etcd) に宛先を問い合わせ、宛先にルーティングする責務が、クライアント側から切り離されている。

(1)

送信元マイクロサービスは、ロードバランサーにリクエストを送信する。

(2)

ロードバランサーは、宛先マイクロサービスの場所をサービスディスカバリーに問い合わせ、宛先情報を取得する。

(3)

ロードバランサーは、宛先マイクロサービスにリクエストをルーティングする。

▼ 実装方法

  • KubernetesのServiceとkube-proxy + CoreDNS (DNSベースのサービスディスカバリー)
  • サービスメッシュツール (例:Istio、Linkerdなど) のサイドカー
  • サービスディスカバリー機能を持つリバースプロキシ (例:素のEnvoy、Traefikなど)
  • クラウド (例:AWS ALB)


Self registration

▼ Self registrationとは

サービスレジストリ (例:etcd) に自身を登録し、宛先を問い合わせ、宛先にルーティングする責務は、クライアント側マイクロサービスにある。