ProHoster > Blog > administration > De la vie avec Kubernetes : comment le serveur HTTP n'a pas favorisé les Espagnols
De la vie avec Kubernetes : comment le serveur HTTP n'a pas favorisé les Espagnols
Un représentant de notre client, dont la pile d'applications réside dans le cloud Microsoft (Azure), a résolu un problème : récemment, certaines requêtes de certains clients européens ont commencé à se terminer par l'erreur 400 (Bad Request). Toutes les applications sont écrites en .NET, déployées dans Kubernetes...
L’une des applications est l’API, par laquelle passe finalement tout le trafic. Ce trafic est écouté par le serveur HTTP Crécerelle, configuré par le client .NET et hébergé dans un pod. Avec le débogage, nous avons eu de la chance dans le sens où il y avait un utilisateur spécifique qui reproduisait systématiquement le problème. Cependant, tout était compliqué par la chaîne du trafic :
Il semblerait que seul tcpdump aidera à résoudre ce problème... mais je vais répéter à propos de la chaîne de trafic :
Enquête
Évidemment, il vaut mieux écouter le trafic sur ce nœud spécifique, où Kubernetes a déployé un pod : le volume du dump sera tel qu'il sera possible de trouver au moins quelque chose assez rapidement. Et en effet, en l’examinant, on a remarqué le cadre suivant :
En inspectant de plus près la décharge, le mot a été remarqué M.laga. Il est facile de deviner qu’il n’y a pas de ville de M.laga en Espagne (mais il y en a Málaga). Saisissant cette idée, nous avons regardé les configs Ingress, où nous avons vu celle insérée il y a un mois (à la demande du client) extrait "inoffensif":
Après avoir désactivé le transfert de ces en-têtes, tout s'est bien passé ! (Il est vite devenu évident que l’application elle-même n’avait plus besoin de ces en-têtes.)
Voyons maintenant le problème plus généralement. Il peut être facilement reproduit dans l'application en effectuant une requête telnet à localhost:80:
Reviendra 400 Bad request — dans le journal des applications, nous recevrons une erreur qui nous est déjà familière :
{
"@t":"2019-03-31T12:59:54.3746446Z",
"@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
"@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
"ConnectionId":"0HLLLR1J974L9",
"message":"Malformed request: invalid headers.",
"EventId":{
"Id":17,
"Name":"ConnectionBadRequest"
},
"SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
"ThreadId":71
}
Les résultats de
Plus précisément crécerelle ne peut pas traiter correctement les en-têtes HTTP avec les caractères corrects en UTF-8, qui sont contenus dans les noms d'un assez grand nombre de villes.
Un facteur supplémentaire dans notre cas est que le client n'envisage pas actuellement de modifier l'implémentation de Kestrel dans l'application. Cependant, des problèmes dans AspNetCore lui-même (№ 4318, № 7707) ils disent que cela ne servira à rien...
Pour résumer : la note ne porte plus sur les problèmes spécifiques du Kestrel ou de l'UTF-8 (en 2019 ?!), mais sur le fait que pleine conscience et étude cohérente Chaque pas que vous faites dans la recherche de problèmes portera tôt ou tard ses fruits. Bonne chance!