DestinationRule
サポート対象バージョン: Istio 1.28+ API バージョン:
networking.istio.io/v1最終更新: February 19, 2026
DestinationRule は、VirtualService がトラフィックを宛先にルーティングした後の処理方法を定義する、Istio の中核リソースです。
目次
- DestinationRule とは?
- VirtualService と DestinationRule
- Subset の概念
- 基本構造
- Subset の定義
- Traffic Policy の概要
- VirtualService との使用
- 実践例
- ベストプラクティス
- トラブルシューティング
DestinationRule とは?
DestinationRule はルーティング後のトラフィックポリシーを定義します。VirtualService がトラフィックの送信先(「どこに」)を決定するなら、DestinationRule はその処理方法(「どのように」)を決定します。
DestinationRule の主な役割
| 役割 | 説明 | 例 |
|---|---|---|
| Subset 定義 | Service バージョンをグループ化 | v1, v2, canary, stable |
| Load Balancing | 負荷分散アルゴリズム | ROUND_ROBIN, LEAST_REQUEST |
| Connection Pool | コネクションプールの設定 | 最大コネクション数、Timeout |
| Circuit Breaker | 障害の隔離 | Outlier Detection |
| TLS 設定 | 暗号化ポリシー | mTLS, SIMPLE TLS |
VirtualService と DestinationRule
この 2 つのリソースは連携して、完全なトラフィック管理を提供します。
役割の比較
責務の分離
VirtualService(どこに?):
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2 # ← References subset from DestinationRule
- route:
- destination:
host: reviews
subset: v1 # ← References subset from DestinationRuleDestinationRule(どのように?):
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy: # ← Default policy applied to all subsets
loadBalancer:
simple: LEAST_REQUEST
subsets: # ← Subset definitions referenced by VirtualService
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy: # ← Policy applied only to v2
loadBalancer:
simple: ROUND_ROBINSubset の概念
Subset は Service の論理グループを定義します。通常、バージョン、デプロイステージ、リージョンなどで区別されます。
Subset の本質
Subset のユースケース
1. バージョンベースのルーティング
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-versions
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3# Pod labels
apiVersion: v1
kind: Pod
metadata:
labels:
app: reviews
version: v1 # ← Matches Subset2. デプロイステージの分離
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-deployment-stages
spec:
host: reviews
subsets:
- name: stable
labels:
stage: stable
- name: canary
labels:
stage: canary
- name: test
labels:
stage: test3. リージョンの分離
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-regions
spec:
host: api-service
subsets:
- name: us-west
labels:
region: us-west
- name: us-east
labels:
region: us-east
- name: eu-central
labels:
region: eu-central4. 環境の分離
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: payment-environments
spec:
host: payment-service
subsets:
- name: production
labels:
env: production
- name: staging
labels:
env: staging基本構造
必須フィールド
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: my-destination-rule
namespace: default
spec:
host: my-service # Required: Target service
subsets: # Optional: Subset definitions
- name: v1
labels:
version: v1
trafficPolicy: # Optional: Traffic policy
loadBalancer:
simple: ROUND_ROBINHost の指定方法
1. Service 名(同じ Namespace)
spec:
host: reviews2. FQDN(異なる Namespace)
spec:
host: reviews.production.svc.cluster.local3. ワイルドカード
spec:
host: "*.example.com"4. 外部 Service(ServiceEntry 使用)
spec:
host: api.external.comSubset の定義
シンプルな Subset
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-simple
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2Subset 固有のポリシー
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-subset-policies
spec:
host: reviews
trafficPolicy: # Default policy (all subsets)
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: v1
labels:
version: v1
# v1 uses default policy
- name: v2
labels:
version: v2
trafficPolicy: # v2-only policy (overrides default)
loadBalancer:
simple: ROUND_ROBIN
connectionPool:
http:
http1MaxPendingRequests: 10複合ラベルマッチング
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-complex
spec:
host: api-service
subsets:
- name: us-west-v2
labels:
version: v2
region: us-west
tier: premium
- name: us-east-v1
labels:
version: v1
region: us-east
tier: standardTraffic Policy の概要
DestinationRule の trafficPolicy は、多様なトラフィック制御機能を提供します。
Traffic Policy の階層
Traffic Policy のコンポーネント
1. Load Balancer
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # LEAST_REQUEST, RANDOM, PASSTHROUGH詳細は Load Balancing を参照してください。
2. Connection Pool
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
http2MaxRequests: 100
maxRequestsPerConnection: 2詳細は Circuit Breaker を参照してください。
3. Outlier Detection
trafficPolicy:
outlierDetection:
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50詳細は Circuit Breaker を参照してください。
4. TLS 設定
trafficPolicy:
tls:
mode: ISTIO_MUTUAL # DISABLE, SIMPLE, MUTUAL詳細は Security を参照してください。
5. ポートレベル設定
trafficPolicy:
portLevelSettings:
- port:
number: 80
loadBalancer:
simple: ROUND_ROBIN
- port:
number: 443
tls:
mode: SIMPLEVirtualService との使用
VirtualService と DestinationRule は連携して、完全なトラフィック制御を提供します。
基本パターン: Canary Deployment
# DestinationRule: Subset definition
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
# VirtualService: Traffic distribution
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1 # ← References DestinationRule subset
weight: 90
- destination:
host: reviews
subset: v2 # ← References DestinationRule subset
weight: 10ヘッダーベースのルーティング
# DestinationRule
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
# VirtualService
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
# Developers use v2
- match:
- headers:
x-dev-user:
exact: "true"
route:
- destination:
host: reviews
subset: v2
# Regular users use v1
- route:
- destination:
host: reviews
subset: v1URI ベースのルーティング + Subset 固有のポリシー
# DestinationRule: Different policies per subset
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-service
spec:
host: api-service
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
connectionPool:
http:
http1MaxPendingRequests: 10
---
# VirtualService: URI-based routing
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: api-service
spec:
hosts:
- api-service
http:
- match:
- uri:
prefix: "/api/v2"
route:
- destination:
host: api-service
subset: v2
- route:
- destination:
host: api-service
subset: v1実践例
例 1: Microservice のバージョン管理
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-versions
namespace: production
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
maxRequestsPerConnection: 2
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3ユースケース:
- v1: 安定版(大半のトラフィック)
- v2: Canary バージョン(トラフィックの 10%)
- v3: テストバージョン(開発者のみ)
例 2: マルチリージョンデプロイ
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-multi-region
spec:
host: api-service
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
localityLbSetting:
enabled: true
subsets:
- name: us-west
labels:
region: us-west
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1000
- name: us-east
labels:
region: us-east
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1000
- name: eu-central
labels:
region: eu-central
trafficPolicy:
connectionPool:
tcp:
maxConnections: 500例 3: デプロイステージポリシー
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: payment-service-stages
spec:
host: payment-service
subsets:
# Production: Strict policy
- name: production
labels:
stage: production
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 10
maxRequestsPerConnection: 1
outlierDetection:
consecutiveErrors: 3
interval: 10s
baseEjectionTime: 60s
# Canary: Moderate policy
- name: canary
labels:
stage: canary
trafficPolicy:
connectionPool:
tcp:
maxConnections: 50
http:
http1MaxPendingRequests: 20
outlierDetection:
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30s
# Staging: Lenient policy
- name: staging
labels:
stage: staging
trafficPolicy:
connectionPool:
tcp:
maxConnections: 200
http:
http1MaxPendingRequests: 100
outlierDetection:
consecutiveErrors: 10
interval: 60s
baseEjectionTime: 30s例 4: 外部 Service の統合
# ServiceEntry: Register external API
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-payment-api
spec:
hosts:
- api.payment-gateway.com
ports:
- number: 443
name: https
protocol: HTTPS
location: MESH_EXTERNAL
resolution: DNS
---
# DestinationRule: External API policy
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: external-payment-api
spec:
host: api.payment-gateway.com
trafficPolicy:
connectionPool:
tcp:
maxConnections: 10
http:
http1MaxPendingRequests: 5
maxRequestsPerConnection: 1
outlierDetection:
consecutiveErrors: 3
interval: 30s
baseEjectionTime: 120s
tls:
mode: SIMPLE例 5: データベースの Connection Pool
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: postgres-connection-pool
spec:
host: postgres-primary
trafficPolicy:
connectionPool:
tcp:
maxConnections: 50 # DB connection limit
connectTimeout: 5s
tcpKeepalive:
time: 7200s
interval: 75s
http:
http1MaxPendingRequests: 10
maxRequestsPerConnection: 100
outlierDetection:
consecutiveErrors: 3
interval: 60s
baseEjectionTime: 120s
subsets:
- name: primary
labels:
role: primary
- name: replica
labels:
role: replica
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100 # More for replicasベストプラクティス
1. Subset の命名規則
# ✅ Good example: Meaningful names
subsets:
- name: v1
- name: v2
- name: stable
- name: canary
- name: us-west
- name: production
# ❌ Bad example: Vague names
subsets:
- name: subset1
- name: test
- name: new2. デフォルトポリシー + オーバーライドパターン
# ✅ Good example: Define default policy and override when needed
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy: # Default policy
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: v1
labels:
version: v1
# v1 uses default policy
- name: v2
labels:
version: v2
trafficPolicy: # Override only for v2
loadBalancer:
simple: ROUND_ROBIN3. Circuit Breaker は必須
# ✅ Always set outlierDetection
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-service
spec:
host: api-service
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
outlierDetection: # Required
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30s4. Connection Pool の設定
# ✅ Connection Pool appropriate for service characteristics
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: high-traffic-service
spec:
host: api-gateway
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1000
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 1005. 段階的ロールアウト
# ✅ Gradually increase canary ratio
# Step 1: 5%
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews-canary-step1
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 95
- destination:
host: reviews
subset: v2
weight: 5
# Step 2: After monitoring, increase to 10%
# Step 3: 25% → 50% → 100%6. ドキュメント化
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: payment-service
annotations:
description: "Payment service traffic management"
owner: "payments-team"
subset-purpose: |
- production: Main production traffic
- canary: New version testing (10%)
- staging: Pre-production testing
spec:
host: payment-service
# ...トラブルシューティング
Subset が動作しない
症状:
# VirtualService exists but traffic isn't routed
kubectl get virtualservice reviews -o yaml原因と解決策:
# 1. Check DestinationRule
kubectl get destinationrule reviews -o yaml
# 2. Verify subset names match
# VirtualService: subset: v2
# DestinationRule: name: v2
# 3. Check pod labels
kubectl get pods --show-labels | grep reviews
# 4. Verify pods have version=v2 label
kubectl label pod reviews-v2-xxx version=v2Traffic Policy が適用されない
# Check Envoy configuration
istioctl proxy-config cluster <pod-name> --fqdn reviews.default.svc.cluster.local -o json
# Check Circuit Breaker settings
istioctl proxy-config cluster <pod-name> -o json | jq '.[] | select(.name=="outbound|9080||reviews.default.svc.cluster.local") | .circuitBreakers'Subset の競合
問題:
# Multiple DestinationRules for the same host cause conflicts
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-1
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
---
# ❌ Conflict occurs
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-2
spec:
host: reviews
subsets:
- name: v2
labels:
version: v2解決策:
# ✅ Define all subsets in one DestinationRule
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2istioctl の分析
# Validate DestinationRule
istioctl analyze
# Specific namespace
istioctl analyze -n production
# Example output
# Error [IST0101] (DestinationRule reviews.default) Referenced host not found: "reviews"次のステップ
DestinationRule を理解したら、次のトピックに進んでください。
- Traffic Splitting: Canary、Blue/Green デプロイ
- Load Balancing: 多様なアルゴリズムとポリシー
- Circuit Breaker: 障害の隔離とレジリエンス
- Retry and Timeout: Retry と Timeout の設定