サービスメッシュ
マイクロサービス間の通信(再試行・可視化・暗号化・トラフィック制御)を、アプリの外側のサイドカー層に肩代わりさせる仕組みです。代表例に Istio や Linkerd があります。
- 1.サービスメッシュはサービス間通信を扱う専用レイヤー。再試行・タイムアウト・mTLS暗号化・可視化・トラフィック制御をアプリ外で担う。
- 2.各サービスの隣に置く「サイドカープロキシ」が全通信を仲介し、制御役のコントロールプレーンが方針を配る。
- 3.アプリのコードを変えずに信頼性・セキュリティ・可観測性を底上げできる反面、運用の複雑さとレイテンシ増が代償。Istio / Linkerd が代表。
なぜサービスメッシュが要るのか
マイクロサービス(/architecture/microservices/)にすると、1つの処理が 多数のサービス間ネットワーク呼び出し に分解されます。すると、それまでプロセス内の関数呼び出しでは考えなくてよかった問題が一気に表面化します。
- 呼び出し先が一時的に落ちている → 再試行・タイムアウト が要る
- どのサービスが遅いのか分からない → 通信の可視化 が要る
- サービス間の通信を盗聴・なりすましされたくない → 暗号化・認証 が要る
- 新バージョンに少しだけ流したい → トラフィックの重み付け が要る
これらを 各サービスのコードに個別実装 すると、言語ごとにライブラリを書き、全チームで足並みを揃える羽目になります。サービスメッシュは、この共通の通信機能をアプリの外側に切り出す 仕組みです。
サイドカー方式:通信を横取りする
サービスメッシュの典型は サイドカープロキシ 方式です。各サービスの すぐ隣(同じ Pod 内など)に小さなプロキシを置き、そのサービスの 入る通信・出る通信をすべてプロキシ経由 にします。
[サービスA] ⇄ [プロキシA] ⇄⇄ [プロキシB] ⇄ [サービスB]
↑ ここで再試行・暗号化・計測・ルーティングを実施
アプリ自身は「相手を普通に呼ぶ」だけ。実際の再試行・暗号化・計測・経路選択は 隣のプロキシが代行 します。アプリのコードに手を入れずに通信の振る舞いを変えられるのが最大の利点です。
データプレーンとコントロールプレーン
サービスメッシュは2つの層に分かれます。役割の分離を押さえると全体像が掴めます。
| 層 | 構成要素 | 役割 |
|---|---|---|
| データプレーン | 各サービス隣のサイドカープロキシ群 | 実際の通信を仲介・暗号化・計測・ルーティング |
| コントロールプレーン | 中央の管理コンポーネント | 方針(ルール)を全プロキシへ配布・証明書を管理 |
運用者は コントロールプレーンにポリシーを宣言 するだけ(例:「サービス A→B は3回まで再試行」)。コントロールプレーンがそれを 全プロキシに配って 実行させます。個々のサーバに入って設定する必要はありません。
主な機能
サービスメッシュが肩代わりする機能は、大きく3つの領域に整理できます。
- 信頼性(Resilience):再試行、タイムアウト、サーキットブレーカー、レート制限。一時障害を吸収し、連鎖的なダウンを防ぐ。
- セキュリティ:サービス間通信の mTLS(相互TLS) による自動暗号化と相手認証。「誰が誰を呼べるか」のアクセス制御も。
- 可観測性(Observability):全通信がプロキシを通るため、成功率・レイテンシ・通信量 などの指標や分散トレースを横断的に取得できる(/devops/observability/)。
加えて トラフィック制御 が強力です。重み付けルーティングで「新バージョンへ5%だけ流す」カナリアや、ヘッダに応じた振り分け、障害注入によるテスト(/devops/chaos-engineering/)が、アプリを変えずに実現できます(/devops/deployment-strategies/)。
サービス間を全部 mTLS で暗号化するのは、手作業だと証明書の発行・配布・更新が地獄です。メッシュはこれを 自動 でやってくれます。「ゼロトラスト(内部通信も信用しない)」を現実的なコストで実装できるのが、セキュリティ面の大きな価値です。
Istio と Linkerd
代表的な実装が Istio と Linkerd(ともに CNCF プロジェクト)です。性格が異なります。
| 観点 | Istio | Linkerd |
|---|---|---|
| 位置づけ | 高機能・多機能 | 軽量・シンプル重視 |
| 学習コスト | 高い(設定項目が豊富) | 低め(最小構成で動かしやすい) |
| 適する場面 | 複雑な要件・細かい制御が必要 | まず軽く始めたい・運用負荷を抑えたい |
「とにかく細かく制御したい」なら Istio、「最小の複雑さで信頼性と mTLS が欲しい」なら Linkerd、というのが大まかな選び分けです。なお、サイドカーを各 Pod に置く方式に代わり、ノード単位で処理する サイドカーレス な構成も登場しており、レイテンシやリソース効率の改善が図られています。
導入の判断:複雑さという代償
サービスメッシュは万能薬ではありません。導入そのものが複雑さとオーバーヘッドを増やします。
サービスが数個しかないなら、メッシュの運用負荷の方が問題解決の利益を上回りがちです。再試行やタイムアウトはライブラリで十分なことも多い。通信の信頼性・可視化・暗号化が「全サービス共通の悩み」になってから 検討するのが妥当です。
- レイテンシ:全通信がプロキシを2回通るため、わずかに遅延が増える。
- リソース:サイドカーの数だけ CPU / メモリを消費する。
- 運用:コントロールプレーン自体が新たな運用対象になり、障害点にもなり得る。
まとめ
- サービスメッシュは サービス間通信の共通機能 をアプリ外の サイドカー層 に集約する仕組み。
- データプレーン(プロキシ群) が通信を仲介し、コントロールプレーン が方針を配る。
- 再試行・mTLS暗号化・可観測性・トラフィック制御 をコード変更なしで底上げできる。
- 代償は 複雑さ・遅延・リソース。規模と悩みが揃ってから入れるのが賢い。Istio / Linkerd が定番。
DevOps/インフラ Article
サービスメッシュを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
サービスメッシュ
比較で見る軸
難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 4
導入後に効く点
各サービスの隣に置く「サイドカープロキシ」が全通信を仲介し、制御役のコントロールプレーンが方針を配る。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- DevOps/インフラ
- タグ数
- 4
判断チェックリスト
- 自社の用途が「サービスメッシュ / Istio」に近いか確認する。
- 強みである「サービスメッシュはサービス間通信を扱う専用レイヤー。再試行・タイムアウト・mTLS暗号化・可視化・トラフィック制御をアプリ外で担う。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。