ProHoster > Blog > διαχείριση > Από τη ζωή με την Kubernetes: Πώς ο διακομιστής HTTP δεν ευνόησε τους Ισπανούς
Από τη ζωή με την Kubernetes: Πώς ο διακομιστής HTTP δεν ευνόησε τους Ισπανούς
Ένας εκπρόσωπος του πελάτη μας, του οποίου η στοίβα εφαρμογών βρίσκεται στο cloud από τη Microsoft (Azure), αντιμετώπισε ένα πρόβλημα: πρόσφατα, ορισμένα αιτήματα από ορισμένους πελάτες από την Ευρώπη άρχισαν να τελειώνουν με σφάλμα 400 (Κακή Αίτηση). Όλες οι εφαρμογές είναι γραμμένες σε .NET, που αναπτύσσονται στο Kubernetes...
Μία από τις εφαρμογές είναι το API, μέσω του οποίου έρχεται τελικά όλη η κίνηση. Αυτή η κίνηση ακούγεται από τον διακομιστή HTTP Είδος μικρού γερακίου, που έχει ρυθμιστεί από τον πελάτη .NET και φιλοξενείται σε ένα pod. Με τον εντοπισμό σφαλμάτων, ήμασταν τυχεροί με την έννοια ότι υπήρχε ένας συγκεκριμένος χρήστης που αναπαρήγαγε με συνέπεια το πρόβλημα. Ωστόσο, όλα ήταν περίπλοκα από την τροχαία αλυσίδα:
Φαίνεται ότι μόνο το tcpdump θα βοηθήσει στην επίλυση αυτού του προβλήματος... αλλά θα επαναλάβω για την αλυσίδα κυκλοφορίας:
Ερευνα
Προφανώς, είναι καλύτερο να ακούτε την κίνηση στον συγκεκριμένο κόμβο, όπου η Kubernetes έχει αναπτύξει ένα pod: ο όγκος του dump θα είναι τέτοιος που θα είναι δυνατό να βρεθεί τουλάχιστον κάτι αρκετά γρήγορα. Και πράγματι, κατά την εξέτασή του, παρατηρήθηκε το εξής πλαίσιο:
Μετά από προσεκτικότερη επιθεώρηση της χωματερής, η λέξη έγινε αντιληπτή M.laga. Είναι εύκολο να μαντέψει κανείς ότι δεν υπάρχει πόλη M.laga στην Ισπανία (αλλά υπάρχει Μάλαγα). Εκμεταλλευόμενοι αυτήν την ιδέα, εξετάσαμε τις ρυθμίσεις παραμέτρων Ingress, όπου είδαμε αυτό που εισήχθη πριν από ένα μήνα (κατόπιν αιτήματος του πελάτη) «ακίνδυνο» απόσπασμα:
Μετά την απενεργοποίηση της προώθησης αυτών των κεφαλίδων, όλα έγιναν καλά! (Σύντομα έγινε σαφές ότι η ίδια η εφαρμογή δεν χρειαζόταν πλέον αυτές τις κεφαλίδες.)
Τώρα ας δούμε το πρόβλημα πιο γενικά. Μπορεί να αναπαραχθεί εύκολα μέσα στην εφαρμογή κάνοντας ένα αίτημα telnet σε localhost:80:
Θα επιστρέψει 400 Bad request — στο αρχείο καταγραφής της εφαρμογής θα λάβουμε ένα σφάλμα που είναι ήδη γνωστό σε εμάς:
{
"@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
}
Αποτελέσματα της
Συγκεκριμένα το Κιρκινάκι δεν μπορεί Επεξεργαστείτε σωστά τις κεφαλίδες HTTP με τους σωστούς χαρακτήρες στο UTF-8, οι οποίοι περιέχονται στα ονόματα ενός αρκετά μεγάλου αριθμού πόλεων.
Ένας επιπλέον παράγοντας στην περίπτωσή μας είναι ότι ο πελάτης δεν σχεδιάζει επί του παρόντος να αλλάξει την εφαρμογή του Kestrel στην εφαρμογή. Ωστόσο, προβλήματα στο ίδιο το AspNetCore (№ 4318, № 7707) λένε ότι αυτό δεν θα βοηθήσει...
Συνοψίζοντας: η σημείωση δεν αφορά πλέον τα συγκεκριμένα προβλήματα του Kestrel ή του UTF-8 (το 2019;!), αλλά για το γεγονός ότι επίγνωση και συνεπής μελέτη Κάθε βήμα που κάνετε αναζητώντας προβλήματα αργά ή γρήγορα θα αποφέρει καρπούς. Καλή τύχη!