こんにちは!本日は、マイクロサービスアーキテクチャ(MSA)の核であるIstioにおいて、トラフィックを効率的に分散するロードバランシング(Load Balancing)戦略について深く掘り下げていきます。
IstioはEnvoyプロキシをサイドカーとして使用してトラフィックを制御しますが、この際、DestinationRuleリソースを通じて非常にきめ細やかなロードバランシング設定が可能です。単に「トラフィックを分割する」だけでなく、状況にぴったりの戦略を選択する方法をまとめました。

1. ロードバランサー設定位置 📍
すべての設定は、DestinationRuleリソースのtrafficPolicy.loadBalancer項目で行われます。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-service
trafficPolicy:
loadBalancer:
# ここに設定が入ります!
2. Simple Load Balancer: 最も基本的で強力な分散 ⚖️
別途状態(State)の維持が不要な一般的なAPIサーバーやウェブサービスに使用します。最もよく使われる方式です。
| モード | 説明 | 推奨状況 |
|---|---|---|
| ROUND_ROBIN | (デフォルト) 順番に一つずつリクエストを送信します。最も無難で予測可能です。 | すべてのPodのスペックが同じで、リクエスト処理時間が似ている場合 |
| LEAST_REQUEST | 現在処理中のリクエスト(Active Request)が最も少ないPodに送信します。(ランダムに2つ選び、より空いている方を選択) | リクエストごとに処理時間がばらつく場合 (例: あるものは1秒、あるものは10秒) |
| RANDOM | 無作為に選択します。ロードバランサー自体の演算負荷が最も少ないです。 | Podの数が非常に多い場合 |
| PASSTHROUGH | ロードバランシングを行わず、クライアントがリクエストしたIPにそのまま接続します。 | Headlessサービス、DBなど、直接接続が必要な場合 |
💡 YAML設定例 (LEAST_REQUEST)
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
3. Consistent Hash: 「君はさっきの彼に行け!」 (Sticky Session) 🔗
特定のユーザーのリクエストを常に同じPodに送信する必要がある場合に使用します。ログインセッションの維持やローカルキャッシュの効率を高める際に不可欠です。これをSticky Sessionとも呼びます。
何を「キー(Key)」として捉えるかによって分かれます。
- 🍪 HTTP Cookie: ブラウザのCookie (例: JSESSIONID) を基準に固定します。
- 📡 Source IP: クライアントのIPアドレスが同じであれば、同じPodに送信します。(TCP接続などに有用)
- 🏷️ HTTP Header: 特定のヘッダー値 (例: x-user-id) を基準に分散します。
- 🔍 Query Parameter: URLのパラメータ (例: ?shard_id=1) を基準にします。
💡 YAML設定例 (Cookieベース)
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: JSESSIONID
ttl: 0s # ブラウザセッション中維持
4. Locality Load Balancer: 「近い場所が一番速い」 🌍
これはアルゴリズムというよりも、トラフィック分散の優先順位ポリシーです。クラウド環境でMulti-AZ(アベイラビリティゾーン)やMulti-Regionを運用している場合、コスト削減と速度向上のために必ず知っておくべきです。
- 動作原理: リクエストを送信したPodと同じ地域(Region/Zone)にあるPodを最優先で呼び出します。
- フェイルオーバー: もし同じ地域のPodがすべて停止したり、健全でない場合は?その時、自動的に次に近い地域へトラフィックを転送します。
- 利点: ネットワーク遅延(Latency)の最小化、クラウドデータ転送コスト(Cross-zone traffic cost)の削減。
💡 YAML設定例
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
localityLbSetting:
enabled: true
📝 要約と結論
状況に応じて適切な武器を選択してください!
- 一般的なウェブ/APIサーバー 👉 simple: ROUND_ROBIN (そのままにしておけばOK)
- 重い処理が混在するサーバー 👉 simple: LEAST_REQUEST
- ログインが必要なウェブサイト 👉 consistentHash (Cookieを使用)
- AWS/Azureなどのクラウドユーザー 👉 localityLbSetting (コスト/速度最適化)
Istioの強力なロードバランシング機能を活用して、より安定した高速なサービスを構築しましょう!🚀
コメントを残す