コンテンツにスキップ

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

はじめに

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


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

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

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

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

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

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


01-02. ツール

  • Istio
  • Linkerd
  • Consul
  • AWS VPC Lattice
  • AWS ECS Service Connect


02. 概要

クラウドネイティブ技術(アルファベット順) Cilium Service Mesh Consul Istio Kong Mesh Kuma Linkerd NGINX Service Mesh Traefik Mesh
アーキテクチャモード サイドカーレス サイドカー サイドカー/サイドカーレス サイドカー/サイドカーレス サイドカー サイドカー サイドカー サイドカー
データプレーン eBPF、Envoy Envoy Envoy Envoy Envoy Linkerd Proxy Nginx Traefik
CNCFステータス Graduated なし Graduated なし Sandbox Graduated なし なし
開発元 Isovalent HashiCorp Googleなど Kong Kong Buoyant Nginx Traefik Labs


03. トラフィック管理

プロトコル

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

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


ネットワーク

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

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

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

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


04. 回復性の管理

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

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


05. 通信の認証/認可

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

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

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


06. アプリケーションデータの暗号化

サービスメッシュは、アプリケーションデータをSSL証明書で暗号化する。

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

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


08. テレメトリー管理

ログの場合

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

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

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


メトリクスの場合

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

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


分散トレースの場合

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

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

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


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

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


07. アーキテクチャ

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

責務 Istio Linkerd Consul AWS VPC Lattice Cilium
サイドカーパターン ⭕️ ⭕️ ⭕️ ⭕️ ×
サイドカーレスパターン ⭕️
(アンビエントモード)
× × × ⭕️
(カーネルモデル)


外部データプレーン

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

責務 Istio Linkerd Consul AWS VPC Lattice
異なるClusterにあるデータプレーンの管理
(複数Kubernetes Clusterメッシュ)
⭕️ ⭕️ ⭕️ ×
Cluster外の仮想サーバーにあるデータプレーンの管理 ⭕️ × ⭕️ ⭕️


Kubernetesとの親和性

責務 Istio Linkerd Consul AWS VPC Lattice
Ingress Controller ⭕️ ⭕️ ⭕️ ×
Egress Controller ⭕️ × × ×
カスタムリソース ⭕️ ⭕️ × ×