コンテンツにスキップ

サービスメッシュの担う責務@サービスメッシュ

はじめに

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


01. サービスメッシュの担う責務

サービスメッシュを採用しない場合 (Kubernetes のみ) と比較して、各サービスメッシュツールがインフラ領域のどんな責務を実装してくれるかを記載する。

もしサービスメッシュを採用しない場合、サービスメッシュと同じ責務をマイクロサービス領域に実装する必要がある。

サービスメッシュが担う責務が要件として必要であるなら、以下の理由でサービスメッシュツールを採用した方が良い。

  • マイクロサービス側にインフラ領域の責務を実装しなくて済むため、アプリエンジニアの負担が減る。
  • インフラ領域の責務をサイドカーに切り分けられるため、凝集度が高くなる
  • 各マイクロサービスに共通して提供できるため、単純性が高くなる

一方で要件として不要ならば、サービスメッシュツール自体を採用する必要はない、という判断になる。


02. トラフィック管理

プロトコル

サービスメッシュは、任意のプロトコルを扱える。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
TCP Service + kube-proxy ⭕️ ⭕️ ⭕️ ⭕️
HTTP/1.1 Ingress ⭕️ ⭕️ ⭕️ ⭕️
HTTP/2.0 (例:gRPCなど) Ingress ⭕️ ⭕️ ⭕️ ⭕️
gRPC Ingress、Service + kube-proxy ⭕️ ⭕️ ⭕️ ⭕️


ネットワーク

Kubernetesでは、Serviceは単一のバージョンのPodとしか通信できない。

もし複数の異なるバージョンのPodを対象にしたい場合、Podのバージョンに応じたServiceを作成する必要がある。

一方で、サービスメッシュツールは異なるバージョンのPodに、さまざまな手法 (例:カナリア方式、トラフィックミラーリング方式、など) で通信できる。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
L4ロードバランシング Service + kube-proxy ⭕️ ⭕️ ⭕️ ⭕️
L7ロードバランシング Ingress ⭕️ ⭕️ ⭕️ ⭕️
ルーティング
(ホストベース、パスベース、割合ベース)
Service + kube-proxy、Ingress ⭕️ × × ×
サービスディスカバリー Service + kube-proxy ⭕️ ⭕️ ⭕️ ⭕️
CNIアドオン 記入中... ⭕️ ⭕️ ⭕️ ⭕️


03. 復旧性の管理

サービスメッシュは、マイクロサービスの復旧性を管理する。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
サーキットブレイカー 記入中... ⭕️ × ⭕️ ⭕️
フォールトインジェクション 記入中... ⭕️ ⭕️ × ×
再試行処理 記入中... ⭕️ ⭕️ ⭕️ ⭕️
タイムアウト 記入中... ⭕️ ⭕️ ⭕️ ⭕️
リクエスト数制限
(レートリミット)
記入中... ⭕️ ⭕️ ⭕️ ⭕️


04. 通信の認証/認可

サービスメッシュは、ゼロトラストネットワークに基づいて、通信にも認証/認可を実施する。

マイクロサービス側の認証/認可はサービスメッシュの管理外であるため、別に実装する必要がある。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
相互TLS認証 相互TLS認証ツール
(例:Spiffe)
⭕️
(Spiffeへ置き換えできる)
⭕️ ⭕️ ⭕️
JWTによるBearer認証 アプリで実装、OAuth2.0プロキシ (例:oauth2-proxy、など) やSSOプロキシ(例:dex、など) ⭕️ × ⭕️ ×


05. パケットペイロードの暗号化

サービスメッシュは、パケットペイロードをSSL証明書で暗号化する。

Kubernetesでは、Podの作成に応じて証明書のKubernetesリソース (Certificate、CertificateSigningRequest、など) を作成する必要がある。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
相互TLS認証 相互TLS認証ツール
(例:Spiffe)
⭕️
(Spiffeへ置き換えできる)
⭕️ ⭕️ ⭕️
SSL証明書の自動更新 ・手動でSSL証明書を更新
・SSL証明書管理ツール
(例:CertManager)
⭕️ × ⭕️ ⭕️


06. テレメトリー管理

ログの場合

サービスメッシュツールを使用する場合、マイクロサービスの代わりにサイドカープロキシがアクセスログを作成し、ログ監視バックエンドに送信する。

ただし、マイクロサービスでもアクセスログを作成しても良い。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
マイクロサービスの実行ログを作成する - × × × ×
マイクロサービスの実行ログをログルーター
(例:Fluentd、FluentBit) へ送信する
- × × × ×
マイクロサービスのアクセスログを作成する 各言語のロギングパッケージ ⭕️ ⭕️ ⭕️ ⭕️
マイクロサービスのアクセスログをログルーター
(例:Fluentd、FluentBit) へ送信する
各言語のロギングパッケージ ⭕️ ⭕️ ⭕️ ⭕️


メトリクスの場合

サービスメッシュツールを使用する場合、マイクロサービスの代わりにサイドカープロキシがメトリクスを作成し、メトリクス監視バックエンドに送信する。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
マイクロサービスのゴールデンシグナルを作成する クライアントパッケージ
(例:otelクライアントパッケージ、など)
⭕️ ⭕️ ⭕️ ⭕️
マイクロサービスのゴールデンシグナルをメトリクス監視バックエンド
(例:Prometheus) へ送信する
クライアントパッケージ
(例:otelクライアントパッケージ、など)
⭕️ ⭕️ ⭕️ ⭕️
マイクロサービスのエンドポイント別にメトリクスをフィルタリングする 記入中... ⭕️ ⭕️ ⭕️ ×


分散トレースの場合

サービスメッシュツールを使用する場合、マイクロサービスの代わりにサイドカープロキシがメトリクスを作成し、トレース監視バックエンドに送信する。

ただし、マイクロサービス間でのトレースコンテキスト伝播は、マイクロサービスに実装する必要がある。

責務 Kubernetes
(サービスメッシュ採用せず)
Istio Linkerd Consul AWS App Mesh
分散トレースのスパンを作成する クライアントパッケージ
(例:otelクライアントパッケージ、など)
⭕️ ⭕️ ⭕️ ⭕️
分散トレースをトレースのCollector
(例:OpenTelemetry Collector、Jaeger Collector、など) に送信する
クライアントパッケージ
(例:otelクライアントパッケージ、など)
⭕️ ⭕️ ⭕️ ⭕️


サービスメッシュトポロジーの場合

責務 Kubernetes
(サービスメッシュ採用せず)
Kiali X-Ray
必要なメトリクスのデータポイントを収集する 記入中... ⭕️
サービスメッシュトポロジーをモデリングする 記入中... ⭕️ ⭕️
サービスメッシュトポロジーをモデリングする 記入中... ⭕️ ⭕️


07. アーキテクチャ

サービスメッシュのパターン

責務 Istio Linkerd Consul AWS App Mesh
サイドカープロキシメッシュ ⭕️ ⭕️ ⭕️ ⭕️
Nodeエージェントメッシュ ⭕️
(アンビエントメッシュ)
× × ×


外部データプレーン

サービスメッシュは、Cluster外にあるデータプレーンも管理する。

責務 Istio Linkerd Consul AWS App Mesh
異なるClusterにあるデータプレーンの管理
(マルチClusterメッシュ)
⭕️ ⭕️ ⭕️ ×
Cluster外の仮想サーバーにあるデータプレーンの管理 ⭕️ × ⭕️ ⭕️


Kubernetesとの親和性

責務 Istio Linkerd Consul AWS App Mesh
Ingressコントローラー ⭕️ ⭕️ ⭕️ ×
Egressコントローラー ⭕️ × × ×
カスタムリソース ⭕️ ⭕️ × ×