DestinationRule
Supported Version: Istio 1.28+ API Version:
networking.istio.io/v1Last Updated: February 19, 2026
DestinationRule is a core Istio resource that defines how to handle traffic after VirtualService routes it to the destination.
Table of Contents
- What is DestinationRule?
- VirtualService vs DestinationRule
- Subset Concept
- Basic Structure
- Defining Subsets
- Traffic Policy Overview
- Using with VirtualService
- Practical Examples
- Best Practices
- Troubleshooting
What is DestinationRule?
DestinationRule defines traffic policies after routing. If VirtualService determines "where" to send traffic, DestinationRule determines "how" to handle it.
Key Roles of DestinationRule
| Role | Description | Example |
|---|---|---|
| Subset Definition | Group service versions | v1, v2, canary, stable |
| Load Balancing | Load distribution algorithm | ROUND_ROBIN, LEAST_REQUEST |
| Connection Pool | Connection pool settings | Max connections, Timeout |
| Circuit Breaker | Failure isolation | Outlier Detection |
| TLS Settings | Encryption policy | mTLS, SIMPLE TLS |
VirtualService vs DestinationRule
These two resources work together to provide complete traffic management.
Role Comparison
Separation of Responsibilities
VirtualService (Where?):
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 (How?):
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 Concept
A Subset defines a logical group of a service. It's typically distinguished by version, deployment stage, region, etc.
The Essence of Subsets
Subset Use Cases
1. Version-based Routing
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. Deployment Stage Separation
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. Regional Separation
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. Environment Separation
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: stagingBasic Structure
Required Fields
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 Specification Methods
1. Service Name (Same Namespace)
spec:
host: reviews2. FQDN (Different Namespace)
spec:
host: reviews.production.svc.cluster.local3. Wildcard
spec:
host: "*.example.com"4. External Service (with ServiceEntry)
spec:
host: api.external.comDefining Subsets
Simple 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-specific Policies
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: 10Complex Label Matching
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 Overview
The trafficPolicy in DestinationRule provides various traffic control features.
Traffic Policy Hierarchy
Traffic Policy Components
1. Load Balancer
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # LEAST_REQUEST, RANDOM, PASSTHROUGHSee Load Balancing for details
2. Connection Pool
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
http2MaxRequests: 100
maxRequestsPerConnection: 2See Circuit Breaker for details
3. Outlier Detection
trafficPolicy:
outlierDetection:
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50See Circuit Breaker for details
4. TLS Settings
trafficPolicy:
tls:
mode: ISTIO_MUTUAL # DISABLE, SIMPLE, MUTUALSee Security for details
5. Port Level Settings
trafficPolicy:
portLevelSettings:
- port:
number: 80
loadBalancer:
simple: ROUND_ROBIN
- port:
number: 443
tls:
mode: SIMPLEUsing with VirtualService
VirtualService and DestinationRule work together to provide complete traffic control.
Basic Pattern: 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: 10Header-based Routing
# 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-based Routing + Subset-specific Policies
# 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: v1Practical Examples
Example 1: Microservice Version Management
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: v3Use Cases:
- v1: Stable version (most traffic)
- v2: Canary version (10% traffic)
- v3: Test version (developers only)
Example 2: Multi-Region Deployment
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: 500Example 3: Deployment Stage Policies
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: 30sExample 4: External Service Integration
# 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: SIMPLEExample 5: Database 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 replicasBest Practices
1. Subset Naming Conventions
# ✅ 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. Default Policy + Override Pattern
# ✅ 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 is Essential
# ✅ 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 Settings
# ✅ 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. Gradual Rollout
# ✅ 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. Documentation
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
# ...Troubleshooting
Subset Not Working
Symptom:
# VirtualService exists but traffic isn't routed
kubectl get virtualservice reviews -o yamlCause and Solution:
# 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 Not Applied
# 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 Conflicts
Problem:
# 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: v2Solution:
# ✅ 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 Analysis
# Validate DestinationRule
istioctl analyze
# Specific namespace
istioctl analyze -n production
# Example output
# Error [IST0101] (DestinationRule reviews.default) Referenced host not found: "reviews"Next Steps
After understanding DestinationRule, move on to these topics:
- Traffic Splitting: Canary, Blue/Green deployments
- Load Balancing: Various algorithms and policies
- Circuit Breaker: Failure isolation and resilience
- Retry and Timeout: Retry and timeout settings