Dans les systèmes distribués, l'indisponibilité d'un seul service peut entraîner la propagation des défaillances à l'ensemble de votre infrastructure. Service Mesh (ASM) offre une tolérance aux pannes au niveau de l'infrastructure grâce à quatre mécanismes : le délai d'expiration, la nouvelle tentative, le cloisonnement et le disjoncteur. Vos applications gèrent ainsi les pannes partielles de manière élégante, sans modification du code.
ASM injecte des proxys sidecar à côté de vos services. Ces proxys interceptent tout le trafic entrant et sortant et appliquent des politiques de tolérance aux pannes au niveau réseau. Comme ces politiques sont configurées via des ressources personnalisées Istio (VirtualService et DestinationRule), le code de votre application reste épuré : aucune bibliothèque de nouvelles tentatives, aucun wrapper de délai d'expiration, aucun SDK de disjoncteur.
| Mécanisme | Fonction | Configuré dans |
|---|---|---|
| Délai d'expiration | Limite la durée d'attente d'une réponse pour une requête | VirtualService |
| Nouvelle tentative | Renvoie automatiquement les requêtes ayant échoué | VirtualService |
| Cloisonnement | Limite les connexions et les requêtes simultanées vers un service | DestinationRule |
| Disjoncteur | Exclut les hôtes défectueux du pool d'équilibrage de charge | DestinationRule |
Configurer un délai d'expiration
Sans délai d'expiration, une requête adressée à un service en amont qui ne répond pas bloque indéfiniment, ce qui consomme des ressources et peut bloquer l'appelant. La définition d'un délai d'expiration limite cette attente : si le service en amont ne répond pas dans la durée spécifiée, le proxy sidecar renvoie une erreur afin que l'appelant puisse exécuter une action de secours.
Une erreur de délai d'expiration ne signifie pas que l'opération en amont a échoué. L'opération peut toujours se terminer côté serveur. Un délai d'expiration signifie uniquement que l'appelant a cessé d'attendre.
Définissez le champ timeout sur une route dans un VirtualService. Ce délai d'expiration s'applique à toutes les requêtes correspondant à cette route.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
timeout: 5s
| Champ | Description |
|---|---|
timeout |
Durée maximale pendant laquelle le proxy sidecar attend une réponse. Si le service en amont ne répond pas dans ce délai, le proxy renvoie une erreur à l'appelant. |
Configurer une politique de nouvelles tentatives
Les défaillances transitoires, telles que les réinitialisations de connexion, les redémarrages brefs de service ou les perturbations réseau, se résolvent souvent d'elles-mêmes. Un mécanisme de nouvelle tentative renvoie automatiquement les requêtes ayant échoué, améliorant ainsi les taux de réussite sans intervention manuelle.
Évitez les nouvelles tentatives excessives. Un nombre trop élevé de nouvelles tentatives ou des fenêtres de nouvelle tentative trop longues peuvent amplifier la charge sur un service déjà fragilisé et déclencher des défaillances en cascade. Associez toujours les nouvelles tentatives à un délai d'expiration au niveau de la route.
Définissez un bloc retries dans un VirtualService. L'exemple suivant effectue jusqu'à 3 nouvelles tentatives en cas d'échec ou de réinitialisation de la connexion, avec un délai d'expiration de 5 secondes par tentative :
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
retries:
attempts: 3
perTryTimeout: 5s
retryOn: connect-failure,reset
| Champ | Description |
|---|---|
attempts |
Nombre maximal de nouvelles tentatives pour une requête. Si un timeout est également défini au niveau de la route, les nouvelles tentatives s'arrêtent lorsque le temps total écoulé dépasse ce délai d'expiration, même si le nombre défini dans attempts n'a pas été atteint. |
perTryTimeout |
Délai d'expiration pour chaque tentative individuelle. Prend en charge les millisecondes, les secondes, les minutes ou les heures. |
retryOn |
Liste séparée par des virgules des conditions qui déclenchent une nouvelle tentative. Consultez les tableaux ci-dessous. |
Conditions de nouvelle tentative HTTP
| Condition | Déclenchement de la nouvelle tentative |
|---|---|
connect-failure |
Échec de la connexion au service en amont (par exemple, délai d'expiration de la connexion). |
refused-stream |
Le service en amont renvoie une trame REFUSED_STREAM pour réinitialiser le flux. |
reset |
Une déconnexion, une réinitialisation ou un délai d'expiration de lecture se produit avant que le service en amont ne réponde. |
5xx |
Le service en amont renvoie un code d'état 5xx ou ne répond pas. Inclut connect-failure et refused-stream. |
gateway-error |
Le service en amont renvoie un code d'état 502, 503 ou 504. |
envoy-ratelimited |
La réponse contient un en-tête x-envoy-ratelimited. |
retriable-4xx |
Le service en amont renvoie un code d'état 409. |
retriable-status-codes |
Le service en amont renvoie un code d'état que vous avez explicitement ajouté à la valeur retryOn (par exemple, 403,404,retriable-status-codes). |
retriable-headers |
Les en-têtes de réponse contiennent un en-tête répertorié dans l'en-tête de requête x-envoy-retriable-header-names. Par exemple, x-envoy-retriable-header-names: X-Upstream-Retry,X-Try-Again. |
Conditions de nouvelle tentative gRPC
gRPC utilise HTTP/2 ; les conditions de nouvelle tentative gRPC sont donc définies dans le même champ retryOn.
| Condition | Code d'état gRPC |
|---|---|
cancelled |
1 |
unavailable |
14 |
deadline-exceeded |
4 |
internal |
13 |
resource-exhausted |
8 |
Configurer la politique de nouvelles tentatives par défaut
Par défaut, tous les services d'une instance ASM utilisent une politique de nouvelles tentatives intégrée pour les requêtes HTTP, même sans politique définie par VirtualService. Les valeurs par défaut sont les suivantes :
Retries : 2
Timeout : aucune
Conditions :
connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes
Remplacez ces valeurs par défaut via la console ASM :
Nécessite la version 1.15.3.120 d'ASM ou ultérieure. Pour les instructions de mise à jour, consultez Update an ASM instance .
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM cible. Dans le volet de navigation de gauche, choisissez ASM Instance > Base Information.
Dans la section Config Info de la page Base Information, cliquez sur Edit à côté de Default HTTP retry policy.
Dans la boîte de dialogue Default HTTP retry policy, configurez les paramètres suivants et cliquez sur OK.
| Paramètre | Description |
|---|---|
| Retries | Correspond au champ attempts. Définissez sur 0 pour désactiver globalement les nouvelles tentatives. |
| Timeout | Correspond au champ perTryTimeout. |
| Retry On | Correspond au champ retryOn. |
Configurer un cloisonnement
Un appelant dysfonctionnant peut submerger un service en ouvrant trop de connexions ou en envoyant trop de requêtes simultanées. Le modèle de cloisonnement isole les ressources en limitant les connexions et les requêtes, empêchant ainsi un service de consommer toute la capacité disponible. Les requêtes dépassant le seuil reçoivent une erreur 503 immédiate au lieu d'être mises en file d'attente indéfiniment.

Définissez les limites du pool de connexions dans une DestinationRule. L'exemple suivant limite le service httpbin à 1 connexion simultanée, 1 requête par connexion et 1 requête en attente, avec un délai d'expiration de connexion de 10 secondes :
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tcp:
connectTimeout: 10s
maxConnections: 1
| Champ | S'applique à | Description |
|---|---|---|
maxConnections |
TCP, HTTP | Nombre maximal de connexions simultanées vers le service en amont. |
connectTimeout |
TCP, HTTP | Durée maximale d'attente pour l'établissement d'une connexion. Renvoie une erreur 503 en cas de délai d'expiration. |
http1MaxPendingRequests |
HTTP/1.1, HTTP/2, gRPC | Nombre maximal de requêtes en attente mises en file d'attente pour une connexion. |
maxRequestsPerConnection |
HTTP/1.1, HTTP/2, gRPC | Nombre maximal de requêtes par connexion. Une fois cette limite atteinte, la connexion est fermée et une nouvelle est établie. |
Configurer un disjoncteur
Si un hôte en amont commence à renvoyer systématiquement des erreurs, continuer à lui envoyer du trafic gaspille des ressources et augmente les taux d'erreur. Le disjoncteur détecte les hôtes défaillants et les retire temporairement (éjection) du pool d'équilibrage de charge. Après la période d'éjection, l'hôte est rajouté. Si les échecs persistent, les durées d'éjection augmentent progressivement : chaque éjection suivante dure plus longtemps que la précédente (baseEjectionTime x nombre d'éjections consécutives).

Définissez des règles de détection des anomalies dans une DestinationRule. L'exemple suivant éjecte un hôte du service httpbin s'il renvoie 3 erreurs consécutives dans n'importe quelle fenêtre de 5 secondes. L'hôte reste éjecté pendant au moins 5 minutes, et jusqu'à 100 % des hôtes peuvent être éjectés simultanément :
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
outlierDetection:
consecutiveErrors: 3
interval: 5s
baseEjectionTime: 5m
maxEjectionPercent: 100
| Champ | Description |
|---|---|
consecutiveErrors |
Nombre d'erreurs consécutives avant l'éjection d'un hôte. |
interval |
Fenêtre temporelle pour la détection des erreurs consécutives. |
baseEjectionTime |
Durée minimale d'éjection. La durée réelle = baseEjectionTime x nombre de fois où l'hôte a été éjecté consécutivement. |
maxEjectionPercent |
Pourcentage maximal d'hôtes dans le pool d'équilibrage de charge pouvant être éjectés simultanément. |
Surveiller le disjoncteur
Le disjoncteur au niveau de l'hôte génère des métriques Envoy qui vous aident à détecter quand des éjections se produisent.
| Métrique | Type | Description |
|---|---|---|
envoy_cluster_outlier_detection_ejections_active |
Gauge | Nombre d'hôtes actuellement éjectés. |
envoy_cluster_outlier_detection_ejections_enforced_total |
Counter | Nombre total d'événements d'éjection. |
envoy_cluster_outlier_detection_ejections_overflow |
Counter | Nombre de tentatives d'éjection abandonnées car maxEjectionPercent a été atteint. |
ejections_detected_consecutive_5xx |
Counter | Nombre d'erreurs 5xx consécutives détectées sur un hôte. |
Activer le reporting des métriques
Configurez proxyStatsMatcher sur le proxy sidecar pour rapporter les métriques du disjoncteur :
Dans la configuration du proxy sidecar, sélectionnez
proxyStatsMatcher, choisissez Regular Expression Match et définissez la valeur sur.*outlier_detection.*. Pour plus de détails, consultez la section proxyStatsMatcher dans Configure sidecar proxies.Redéployez les charges de travail qui utilisent le proxy sidecar. Pour plus de détails, consultez la section « Redeploy workloads » dans Configure sidecar proxies.
Configurer des alertes
Après avoir activé le reporting des métriques, configurez Prometheus pour collecter les métriques du disjoncteur et déclencher des alertes lors des éjections. L'exemple suivant utilise Managed Service for Prometheus.
-
Dans Managed Service for Prometheus, connectez le cluster ACK sur le plan de données au composant Alibaba Cloud ASM ou mettez à jour le composant vers la dernière version. Cette étape garantit la collecte des métriques du disjoncteur. Pour plus de détails, consultez Manage components.
Si vous collectez déjà les métriques ASM via une instance Prometheus autogérée (voir Monitor ASM instances by using a self-managed Prometheus instance ), ignorez cette étape.
Créez une règle d'alerte pour le disjoncteur. Pour les instructions, consultez Use a custom PromQL statement to create an alert rule. Utilisez les paramètres suivants :
| Paramètre | Exemple | Description |
|---|---|---|
| Custom PromQL statements | (sum (envoy_cluster_outlier_detection_ejections_active) by (cluster_name, namespace)) > 0 |
Interroge si un hôte est actuellement éjecté, groupé par namespace et nom de service. |
| Alert message | Host-level circuit breaking is triggered. Some workloads encounter errors repeatedly and the hosts are ejected from the load balancing pool. Namespace: {$labels.namespace}}, Service where the host ejection occurs: {{$labels.cluster_name}}. Number of hosts that are ejected: {{ $value }} |
Inclut le namespace, le nom du service et le nombre d'hôtes éjectés. |
Références
Istio VirtualService reference -- référence complète des champs pour la configuration du délai d'expiration et des nouvelles tentatives
Istio DestinationRule reference -- référence complète des champs pour la configuration du cloisonnement et du disjoncteur
Configure sidecar proxies -- gérer les paramètres du proxy sidecar pour vos charges de travail