DestinationRule
Versión compatible: Istio 1.28+ Versión de la API:
networking.istio.io/v1Última actualización: February 19, 2026
DestinationRule es un recurso central de Istio que define cómo manejar el tráfico después de que VirtualService lo enruta al destino.
Tabla de contenido
- ¿Qué es DestinationRule?
- VirtualService frente a DestinationRule
- Concepto de Subset
- Estructura básica
- Definición de Subsets
- Descripción general de Traffic Policy
- Uso con VirtualService
- Ejemplos prácticos
- Prácticas recomendadas
- Resolución de problemas
¿Qué es DestinationRule?
DestinationRule define las políticas de tráfico después del enrutamiento. Si VirtualService determina «adónde» enviar el tráfico, DestinationRule determina «cómo» manejarlo.
Funciones clave de DestinationRule
| Función | Descripción | Ejemplo |
|---|---|---|
| Definición de Subset | Agrupar versiones de Service | v1, v2, canary, stable |
| Balanceo de carga | Algoritmo de distribución de carga | ROUND_ROBIN, LEAST_REQUEST |
| Connection Pool | Configuración del grupo de conexiones | Máximo de conexiones, Timeout |
| Circuit Breaker | Aislamiento de fallos | Outlier Detection |
| Configuración de TLS | Política de cifrado | mTLS, SIMPLE TLS |
VirtualService frente a DestinationRule
Estos dos recursos trabajan juntos para proporcionar una gestión integral del tráfico.
Comparación de funciones
Separación de responsabilidades
VirtualService (¿Adónde?):
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 (¿Cómo?):
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_ROBINConcepto de Subset
Un Subset define un grupo lógico de un Service. Normalmente se distingue por versión, etapa de despliegue, región, etc.
La esencia de los Subsets
Casos de uso de Subset
1. Enrutamiento basado en versiones
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. Separación por etapa de despliegue
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. Separación regional
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. Separación por entorno
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: stagingEstructura básica
Campos obligatorios
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_ROBINMétodos de especificación de Host
1. Nombre de Service (mismo Namespace)
spec:
host: reviews2. FQDN (Namespace diferente)
spec:
host: reviews.production.svc.cluster.local3. Comodín
spec:
host: "*.example.com"4. Service externo (con ServiceEntry)
spec:
host: api.external.comDefinición de Subsets
Subset simple
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-simple
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2Políticas específicas de Subset
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: 10Coincidencia compleja de labels
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: standardDescripción general de Traffic Policy
El trafficPolicy de DestinationRule proporciona diversas funciones de control de tráfico.
Jerarquía de Traffic Policy
Componentes de Traffic Policy
1. Load Balancer
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # LEAST_REQUEST, RANDOM, PASSTHROUGHConsulta Balanceo de carga para ver los detalles.
2. Connection Pool
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
http2MaxRequests: 100
maxRequestsPerConnection: 2Consulta Circuit Breaker para ver los detalles.
3. Outlier Detection
trafficPolicy:
outlierDetection:
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50Consulta Circuit Breaker para ver los detalles.
4. Configuración de TLS
trafficPolicy:
tls:
mode: ISTIO_MUTUAL # DISABLE, SIMPLE, MUTUALConsulta Seguridad para ver los detalles.
5. Configuración por puerto
trafficPolicy:
portLevelSettings:
- port:
number: 80
loadBalancer:
simple: ROUND_ROBIN
- port:
number: 443
tls:
mode: SIMPLEUso con VirtualService
VirtualService y DestinationRule trabajan juntos para proporcionar un control integral del tráfico.
Patrón básico: despliegue Canary
# 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: 10Enrutamiento basado en headers
# 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: v1Enrutamiento basado en URI + políticas específicas de 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: v1Ejemplos prácticos
Ejemplo 1: gestión de versiones de microservicios
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: v3Casos de uso:
- v1: versión estable (la mayor parte del tráfico)
- v2: versión Canary (10 % del tráfico)
- v3: versión de prueba (solo desarrolladores)
Ejemplo 2: despliegue multirregión
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: 500Ejemplo 3: políticas por etapa de despliegue
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: 30sEjemplo 4: integración de Service externo
# 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: SIMPLEEjemplo 5: Connection Pool de base de datos
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 replicasPrácticas recomendadas
1. Convenciones de nomenclatura de 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. Patrón de política predeterminada + sobrescritura
# ✅ 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 es esencial
# ✅ 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. Configuración de 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. Despliegue gradual
# ✅ 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. Documentación
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
# ...Resolución de problemas
Subset no funciona
Síntoma:
# VirtualService exists but traffic isn't routed
kubectl get virtualservice reviews -o yamlCausa y solución:
# 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 no aplicada
# 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'Conflictos de Subset
Problema:
# 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: v2Solución:
# ✅ 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: v2Análisis con istioctl
# Validate DestinationRule
istioctl analyze
# Specific namespace
istioctl analyze -n production
# Example output
# Error [IST0101] (DestinationRule reviews.default) Referenced host not found: "reviews"Próximos pasos
Después de comprender DestinationRule, continúa con estos temas:
- División de tráfico: despliegues Canary y Blue/Green
- Balanceo de carga: diversos algoritmos y políticas
- Circuit Breaker: aislamiento de fallos y resiliencia
- Reintento y Timeout: configuración de reintentos y tiempos de espera