ProHoster > Blog > Pentadbiran > Dari kehidupan dengan Kubernetes: Bagaimana pelayan HTTP tidak memihak kepada orang Sepanyol
Dari kehidupan dengan Kubernetes: Bagaimana pelayan HTTP tidak memihak kepada orang Sepanyol
Seorang wakil pelanggan kami, yang timbunan aplikasinya berada dalam awan Microsoft (Azure), menangani masalah: baru-baru ini, beberapa permintaan daripada beberapa pelanggan dari Eropah mula berakhir dengan ralat 400 (Permintaan buruk). Semua aplikasi ditulis dalam .NET, digunakan dalam Kubernetes...
Salah satu aplikasi ialah API, yang melaluinya semua lalu lintas akhirnya datang. Trafik ini didengari oleh pelayan HTTP kestrel, dikonfigurasikan oleh klien .NET dan dihoskan dalam pod. Dengan penyahpepijatan, kami bernasib baik dalam erti kata bahawa terdapat pengguna tertentu yang secara konsisten menghasilkan semula masalah itu. Walau bagaimanapun, semuanya rumit oleh rantaian lalu lintas:
Nampaknya hanya tcpdump akan membantu menyelesaikan masalah ini... tetapi saya akan mengulangi tentang rantaian trafik:
Siasatan
Jelas sekali, lebih baik untuk mendengar lalu lintas pada nod tertentu itu, di mana Kubernetes telah menggunakan pod: volum pembuangan akan sedemikian rupa sehingga mungkin untuk mencari sekurang-kurangnya sesuatu dengan cepat. Dan sesungguhnya, apabila memeriksanya, bingkai berikut diperhatikan:
Setelah diperiksa lebih dekat tempat pembuangan itu, perkataan itu disedari M.laga. Sangat mudah untuk meneka bahawa tidak ada bandar M.laga di Sepanyol (tetapi ada Malaga). Dengan menggunakan idea ini, kami melihat konfigurasi Ingress, di mana kami melihat konfigurasi yang dimasukkan sebulan yang lalu (atas permintaan pelanggan) coretan "tidak berbahaya".:
Selepas melumpuhkan pemajuan pengepala ini, semuanya menjadi baik! (Tidak lama kemudian menjadi jelas bahawa aplikasi itu sendiri tidak lagi memerlukan pengepala ini.)
Sekarang mari kita lihat masalahnya secara umumnya. Ia boleh diterbitkan semula dengan mudah di dalam aplikasi dengan membuat permintaan telnet kepada localhost:80:
Akan kembali 400 Bad request β dalam log aplikasi kami akan menerima ralat yang sudah biasa kepada kami:
{
"@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
}
Keputusan
Khususnya Kestrel tidak boleh memproses pengepala HTTP dengan betul dengan aksara yang betul dalam UTF-8, yang terkandung dalam nama bilangan bandar yang agak besar.
Faktor tambahan dalam kes kami ialah pelanggan tidak merancang untuk mengubah pelaksanaan Kestrel dalam aplikasi pada masa ini. Walau bagaimanapun, isu dalam AspNetCore sendiri (β 4318, β 7707) mereka mengatakan bahawa ini tidak akan membantu...
Untuk meringkaskan: nota itu bukan lagi mengenai masalah khusus Kestrel atau UTF-8 (pada 2019?!), tetapi mengenai fakta bahawa kesedaran dan kajian yang konsisten Setiap langkah yang anda ambil semasa mencari masalah lambat laun akan membuahkan hasil. Semoga berjaya!