サービスメッシュとは
サービスメッシュは、マイクロサービス間の通信を管理するインフラストラクチャレイヤーです。サービス間通信の複雑さをアプリケーションから分離し、一貫した方法で制御します。
なぜ必要か: マイクロサービスが増えると、サービス間通信の可観測性、セキュリティ、信頼性の確保が困難になります。サービスメッシュはこれらを統一的に解決します。
サービスメッシュなしの課題
flowchart LR
A["サービスA"] --> B["サービスB"]
各サービスで実装が必要:
- リトライロジック
- サーキットブレーカー
- タイムアウト
- TLS証明書管理
- メトリクス収集
- トレーシング
サイドカーパターン
各サービスPodにプロキシ(サイドカー)をデプロイし、すべての通信を経由させます。
flowchart LR
subgraph Pod
App["Application<br/>(App)"]
Sidecar["Sidecar<br/>(Envoy)"]
App <-->|localhost| Sidecar
end
Sidecar <-->|"すべての通信が経由"| External["外部"]
サービスメッシュのアーキテクチャ
flowchart TB
subgraph ControlPlane["Control Plane"]
Config["Config<br/>Management"]
Telemetry["Telemetry<br/>Collection"]
Policy["Policy<br/>Enforcement"]
end
subgraph DataPlane["Data Plane"]
SA["Service A<br/>+ Sidecar"]
SB["Service B<br/>+ Sidecar"]
SC["Service C<br/>+ Sidecar"]
SA <--> SB <--> SC
end
ControlPlane -->|"設定配布"| DataPlane
主要機能
1. トラフィック管理
# Istio VirtualService - カナリアデプロイ
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
weight: 90
- destination:
host: my-service
subset: v2
weight: 10
2. サーキットブレーカー
# Istio DestinationRule
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-service
spec:
host: my-service
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
3. リトライ・タイムアウト
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
http:
- route:
- destination:
host: my-service
timeout: 10s
retries:
attempts: 3
perTryTimeout: 3s
retryOn: 5xx
4. mTLS(相互TLS)
サービス間通信を自動的に暗号化します。
flowchart LR
A["サービスA<br/>🔐 証明書"] -->|mTLS| B["サービスB<br/>🔐 証明書"]
AutoManage["自動管理"] -.-> A
AutoManage -.-> B
# Istio PeerAuthentication
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
5. 可観測性
| 種類 | 内容 |
|---|---|
| メトリクス | リクエスト数、レイテンシ(p50, p90, p99)、エラーレート |
| トレーシング | サービス間の呼び出し関係、各サービスでの処理時間 |
| ログ | アクセスログの自動収集 |
主要なサービスメッシュ
| ツール | 特徴 |
|---|---|
| Istio | 機能豊富、Envoyベース、学習コスト高 |
| Linkerd | 軽量、Rust製、シンプル |
| Consul Connect | HashiCorp、サービスディスカバリ統合 |
| AWS App Mesh | AWS統合、Envoyベース |
Istio vs Linkerd
| 観点 | Istio | Linkerd |
|---|---|---|
| 機能 | 豊富 | 必要十分 |
| リソース消費 | 多い | 少ない |
| 複雑さ | 高い | 低い |
| コミュニティ | 大きい | 中程度 |
| CNCF | 卒業 | 卒業 |
ユースケース
カナリアリリース
| Day | v2へのトラフィック |
|---|---|
| Day 1 | 1% |
| Day 2 | 10% |
| Day 3 | 50% |
| Day 4 | 100% |
A/Bテスト
# ヘッダーによるルーティング
http:
- match:
- headers:
x-user-group:
exact: beta
route:
- destination:
host: my-service
subset: v2
- route:
- destination:
host: my-service
subset: v1
フォールトインジェクション
# テスト用に意図的に遅延を注入
http:
- fault:
delay:
percentage:
value: 10
fixedDelay: 5s
route:
- destination:
host: my-service
導入の判断
適している場合
- ✓ 多数のマイクロサービス(10+)
- ✓ 複雑な通信パターン
- ✓ ゼロトラストセキュリティが必要
- ✓ 高度なトラフィック制御が必要
- ✓ Kubernetesを使用している
適していない場合
- ✗ サービス数が少ない(5未満)
- ✗ モノリシックアーキテクチャ
- ✗ シンプルな通信パターン
- ✗ 運用チームのリソースが限られている
まとめ
サービスメッシュは、マイクロサービス間通信の複雑さをアプリケーションから分離し、統一的に管理するためのインフラです。トラフィック制御、セキュリティ、可観測性を提供しますが、複雑さとリソースオーバーヘッドも伴います。サービス数と運用能力を考慮して、導入を判断しましょう。
← 一覧に戻る