Gestion du trafic Istio
Guide complet de gestion du trafic Istio pour les déploiements de maillage de services en production.
Quand utiliser cette compétence
- Configurer le routage de service à service
- Implémenter des déploiements canary ou blue-green
- Configurer les disjoncteurs et les retries
- Configuration de l'équilibrage de charge
- Mirroring du trafic pour les tests
- Injection de défauts pour l'ingénierie du chaos
Concepts fondamentaux
1. Ressources de gestion du trafic
| Ressource | Objectif | Portée |
|---|---|---|
| VirtualService | Router le trafic vers les destinations | Basée sur l'hôte |
| DestinationRule | Définir les politiques après le routage | Basée sur le service |
| Gateway | Configurer l'ingress/egress | Bord du cluster |
| ServiceEntry | Ajouter des services externes | Maillage entier |
2. Flux de trafic
Client → Gateway → VirtualService → DestinationRule → Service
(routage) (politiques) (pods)
Modèles
Modèle 1 : Routage de base
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
namespace: bookinfo
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews-destination
namespace: bookinfo
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
Modèle 2 : Déploiement canary
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-service-canary
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: stable
weight: 90
- destination:
host: my-service
subset: canary
weight: 10
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-service-dr
spec:
host: my-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
h2UpgradePolicy: UPGRADE
http1MaxPendingRequests: 100
http2MaxRequests: 1000
subsets:
- name: stable
labels:
version: stable
- name: canary
labels:
version: canary
Modèle 3 : Disjoncteur
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: circuit-breaker
spec:
host: my-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 100
http2MaxRequests: 1000
maxRequestsPerConnection: 10
maxRetries: 3
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50
minHealthPercent: 30
Modèle 4 : Retry et timeout
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: ratings-retry
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
timeout: 10s
retries:
attempts: 3
perTryTimeout: 3s
retryOn: connect-failure,refused-stream,unavailable,cancelled,retriable-4xx,503
retryRemoteLocalities: true
Modèle 5 : Mirroring du trafic
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: mirror-traffic
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
mirror:
host: my-service
subset: v2
mirrorPercentage:
value: 100.0
Modèle 6 : Injection de défauts
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: fault-injection
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 10
fixedDelay: 5s
abort:
percentage:
value: 5
httpStatus: 503
route:
- destination:
host: ratings
Modèle 7 : Passerelle d'ingress
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: my-tls-secret
hosts:
- "*.example.com"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-vs
spec:
hosts:
- "api.example.com"
gateways:
- my-gateway
http:
- match:
- uri:
prefix: /api/v1
route:
- destination:
host: api-service
port:
number: 8080
Stratégies d'équilibrage de charge
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: load-balancing
spec:
host: my-service
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # ou LEAST_CONN, RANDOM, PASSTHROUGH
---
# Hachage cohérent pour les sessions persistantes
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: sticky-sessions
spec:
host: my-service
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: x-user-id
# ou : httpCookie, useSourceIp, httpQueryParameterName
Bonnes pratiques
À faire
- Commencer simple - Ajouter la complexité progressivement
- Utiliser les subsets - Versionnez vos services clairement
- Définir des timeouts - Toujours configurer des timeouts raisonnables
- Activer les retries - Mais avec backoff et limites
- Monitorer - Utiliser Kiali et Jaeger pour la visibilité
À ne pas faire
- Ne pas trop retry - Peut causer des défaillances en cascade
- Ne pas ignorer la détection d'outliers - Activer les disjoncteurs
- Ne pas mirorer vers la production - Mirorer vers des environnements de test
- Ne pas sauter le canary - Tester avec un petit pourcentage de trafic d'abord
Commandes de débogage
# Vérifier la configuration VirtualService
istioctl analyze
# Afficher les routes effectives
istioctl proxy-config routes deploy/my-app -o json
# Vérifier la découverte des endpoints
istioctl proxy-config endpoints deploy/my-app
# Déboguer le trafic
istioctl proxy-config log deploy/my-app --level debug