ProHoster > blog > administrasi > Dari kehidupan dengan Kubernetes: Bagaimana server HTTP tidak menyukai orang Spanyol
Dari kehidupan dengan Kubernetes: Bagaimana server HTTP tidak menyukai orang Spanyol
Perwakilan klien kami, yang tumpukan aplikasinya berada di cloud Microsoft (Azure), mengatasi masalah: baru-baru ini, beberapa permintaan dari beberapa klien dari Eropa mulai berakhir dengan kesalahan 400 (Permintaan yang buruk). Semua aplikasi ditulis dalam .NET, diterapkan di Kubernetes...
Salah satu aplikasinya adalah API, yang melaluinya semua lalu lintas pada akhirnya datang. Lalu lintas ini didengarkan oleh server HTTP alap-alap, dikonfigurasi oleh klien .NET dan dihosting di sebuah pod. Dengan debugging, kami beruntung karena ada pengguna tertentu yang secara konsisten mereproduksi masalah tersebut. Namun, semuanya menjadi rumit karena rantai lalu lintas:
Tampaknya hanya tcpdump yang akan membantu menyelesaikan masalah ini... tapi saya akan ulangi tentang rantai lalu lintas:
Investigasi
Tentu saja, lebih baik mendengarkan lalu lintas pada node tertentu itu, di mana Kubernetes telah menyebarkan sebuah pod: volume dump akan sedemikian rupa sehingga memungkinkan untuk menemukan setidaknya sesuatu dengan cukup cepat. Dan memang, ketika diperiksa, terlihat bingkai berikut:
Setelah memeriksa tempat pembuangan sampah lebih dekat, kata itu diketahui M.laga. Mudah ditebak bahwa tidak ada kota M.laga di Spanyol (tetapi memang ada Malaga). Memanfaatkan ide ini, kami melihat konfigurasi Ingress, di mana kami melihat konfigurasi tersebut dimasukkan sebulan yang lalu (atas permintaan klien) cuplikan "tidak berbahaya".:
Setelah menonaktifkan penerusan header ini, semuanya menjadi baik-baik saja! (Segera menjadi jelas bahwa aplikasi itu sendiri tidak lagi memerlukan header ini.)
Sekarang mari kita lihat masalahnya secara lebih umum. Itu dapat dengan mudah direproduksi di dalam aplikasi dengan membuat permintaan telnet ke localhost:80:
Akan kembali 400 Bad request β di log aplikasi kita akan menerima kesalahan yang sudah tidak asing lagi bagi kita:
{
"@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
}
Hasil
Khususnya Kestrel tidak bisa memproses header HTTP dengan benar dengan karakter UTF-8 yang benar, yang terdapat dalam nama sejumlah besar kota.
Faktor tambahan dalam kasus kami adalah klien saat ini tidak berencana mengubah penerapan Kestrel dalam aplikasi. Namun, masalah di AspNetCore itu sendiri (β 4318, β 7707) mereka mengatakan bahwa ini tidak akan membantu...
Ringkasnya: catatannya bukan lagi tentang masalah spesifik Kestrel atau UTF-8 (pada tahun 2019?!), tetapi tentang fakta bahwa perhatian dan belajar secara konsisten Setiap langkah yang Anda ambil saat mencari masalah cepat atau lambat akan membuahkan hasil. Semoga beruntung!