Guide du status et du débogage d'Envoy Gateway : ce que veulent vraiment dire Accepted, ResolvedRefs et Programmed
Le scénario d'ingénierie le plus pénible n'est pas un message d'erreur, c'est plutôt :
Vous avez appliqué le YAML, kubectl apply a réussi, mais le trafic ne circule toujours pas.
Si, à ce stade, vous ne faites que fixer spec, vous finirez par avoir l'impression de lire dans des feuilles de thé.
La vraie information de diagnostic dans Gateway API vit dans status.
Cet article a un seul objectif : vous donner le chemin de débogage le plus court possible. Quand un Gateway, HTTPRoute ou Listener ne prend pas effet, vous saurez où regarder d'abord, au lieu de commencer immédiatement à douter du sens de l'univers.
Commencez ici : déboguez en lisant status, pas en changeant spec
Les commandes les plus utiles :
kubectl get gateway -A
kubectl get httproute -A
kubectl get grpcroute -A
kubectl describe gateway <name>
kubectl describe httproute <name>
kubectl get gateway <name> -o yaml
kubectl get httproute <name> -o yamlLe but n'est pas de relire le YAML cent fois de plus, mais de vérifier si le contrôleur a réellement accepté votre configuration.
Voyez status comme le relevé de notes d'un examen :
specest la copie que vous avez renduestatusest le résultat corrigé par le système
Ne regarder que ce que vous avez soumis, sans jamais vérifier la note, ce n'est pas du débogage, c'est juste du réconfort émotionnel.
Les trois conditions les plus importantes : maîtrisez-les et vous êtes couvert
Accepted
Cela indique généralement si la ressource a été acceptée par son parent. Pour une route, cela signifie souvent :
- Si elle s'est correctement attachée au Gateway/listener visé
- Si les règles comportent des conflits évidents ou une configuration invalide
Si Accepted vaut False, soupçonnez d'abord :
- Des
parentRefspointant vers le mauvais Gateway ou listener - Des conditions de hostname/listener qui ne correspondent pas
- Un listener qui rejette ce type de route
allowedRoutesqui vous bloque
ResolvedRefs
Cela indique si les objets référencés à l'intérieur de la ressource ont bien été résolus. Par exemple :
- Le
Serviceréférencé dansbackendRefsexiste-t-il ? - Le
SecretdanscertificateRefspeut-il être référencé légalement ? ReferenceGrantest-il bien configuré pour les références inter-namespace ?
Cette condition est extrêmement utile. Beaucoup d'échecs de configuration ne viennent pas d'une logique de routage erronée, mais d'éléments référencés qui n'existent tout simplement pas, ou auxquels vous n'avez pas le droit d'accéder.
Programmed
Cela indique généralement si la configuration a réellement été appliquée au niveau de l'implémentation. Pensez-y comme ceci :
- Le contrôleur a accepté la configuration
- Et il l'a poussée dans le plan de données ou l'infrastructure
Si Accepted vaut déjà True mais que le trafic ne circule toujours pas, c'est le moment où il devient utile de vérifier Programmed, l'adresse du Gateway, le status des listeners et les ressources Envoy sous-jacentes.
💡 Différentes ressources peuvent exposer des ensembles de conditions différents, mais
Accepted,ResolvedRefsetProgrammedsont le premier trio sur lequel construire votre intuition.
Le flux de débogage le plus court : cet ordre fonctionne généralement
Étape 1 : vérifier que le Gateway tourne réellement
kubectl get gateway -A
kubectl get gateway eg -o yamlVérifiez :
status.addressescontient-il une valeur ?- Y a-t-il des conditions anormales sur les listeners ?
- Le hostname/protocole/port du listener correspond-il à ce que vous attendez ?
Si le Gateway n'a pas d'adresse, même le plus beau YAML de route n'est que de l'écriture créative.
Étape 2 : vérifier que la Route s'est bien attachée
kubectl get httproute -A
kubectl get httproute app-route -o yamlPriorité à :
status.parentsAcceptedResolvedRefsobservedGeneration
observedGeneration mérite qu'on y prête attention.
S'il n'a pas rattrapé metadata.generation, le contrôleur n'a peut-être pas encore traité la dernière version de votre configuration.
Étape 3 : vérifier que les ressources référencées existent vraiment
Cette étape est plus souvent sautée que toutes les autres :
kubectl get svc -A
kubectl get secret -A
kubectl get referencegrant -AProblèmes courants :
- Le nom du service backend est faux
- Le port est faux
- Le Secret n'est pas dans le namespace que vous imaginez
- La référence inter-namespace n'a pas de
ReferenceGrant
Si ResolvedRefs vaut False, remontez la piste par ici.
Étape 4 : vérifier le plan de données et le contrôleur
Si les status du Gateway et de la Route semblent globalement corrects mais que le trafic ne circule toujours pas, allez plus loin :
kubectl get pods -n envoy-gateway-system
kubectl logs -n envoy-gateway-system deployment/envoy-gatewayÀ ce stade, vous ne déboguez plus "la règle a-t-elle été acceptée", vous vérifiez si le plan de contrôle et le plan de données fonctionnent normalement.
Si vous avez egctl installé, il peut vous aider à inspecter rapidement le status.
Mais même sans lui, kubectl get/describe -o yaml permet de résoudre la plupart des problèmes.
Quatre patterns d'échec les plus courants
1. La route est correcte, mais ne s'est pas attachée au listener voulu
Symptômes :
- Le YAML semble correct
- Mais le trafic ne touche pas la règle
Vérifiez :
parentRefs.nameparentRefs.sectionName- Si le nom du listener du Gateway correspond exactement
Dans les setups multi-listeners, une simple faute de frappe dans sectionName suffit pour gaspiller toute une session de débogage.
2. Accepted réussit, mais ResolvedRefs échoue
Cela signifie généralement que la logique d'attachement est bonne, mais qu'un élément référencé pose problème. Causes les plus fréquentes :
- Le Service backend n'existe pas
- Le nom du Secret est incorrect
- Référence inter-namespace sans autorisation
Ce type d'échec est particulièrement frustrant parce qu'il donne l'impression que vous êtes presque arrivé, alors qu'en réalité vous êtes encore bloqué à l'étape des références.
3. Le Gateway a des listeners, mais pas l'adresse attendue
Cela apparaît fréquemment dans les clusters locaux ou dans les environnements sans implémentation LoadBalancer.
Ce n'est pas que Gateway API soit cassé, c'est simplement que l'infrastructure sous-jacente ne provisionne pas d'adresse externe.
Options :
- Vérifier si le cluster possède la capacité
LoadBalancer - Utiliser
port-forwardpour valider le chemin de routage
4. Le YAML a pris effet, mais les requêtes renvoient 404 / 503
À ce stade, ce n'est généralement pas un seul champ erroné, mais une chaîne cassée quelque part :
- Mauvais header Host
- Le path ne matche aucune règle
- Le Pod backend n'est pas sain
- Le selector du Service ne sélectionne aucun Pod
Les problèmes d'entrée ressemblent parfois à un échec du proxy, alors que le backend n'était tout simplement pas prêt. N'accusez pas tout de suite la couche proxy, elle en a déjà assez sur les épaules.
Résumé en une ligne
La manière la plus efficace de déboguer Gateway API n'est pas de modifier sans cesse le YAML, mais d'apprendre à lire status.
Accepted vous dit si la demande a été prise en compte. ResolvedRefs vous dit si les références ont été résolues. Programmed vous dit si la configuration a réellement été appliquée. Examinez ces trois couches séparément et la vitesse de dépannage augmentera fortement.
Étape suivante
Cela termine la série de 10 articles sur Envoy Gateway. Si vous souhaitez revoir la carte complète de la série :