ProHoster > بلوق > إدارة > من الحياة مع Kubernetes: كيف لم يفضل خادم HTTP الإسبان
من الحياة مع Kubernetes: كيف لم يفضل خادم HTTP الإسبان
قام ممثل عميلنا، الذي توجد مجموعة تطبيقاته في سحابة Microsoft (Azure)، بمعالجة مشكلة: في الآونة الأخيرة، بدأت بعض الطلبات من بعض العملاء من أوروبا تنتهي بالخطأ 400 (اقتراح غير جيد). تتم كتابة كافة التطبيقات في .NET، ونشرها في Kubernetes...
أحد التطبيقات هو واجهة برمجة التطبيقات (API)، التي تأتي من خلالها كل حركة المرور في النهاية. يتم الاستماع إلى حركة المرور هذه بواسطة خادم HTTP العاسوق، تم تكوينه بواسطة عميل .NET واستضافته في حجرة. مع تصحيح الأخطاء، كنا محظوظين، بمعنى أن هناك مستخدمًا محددًا قام بإعادة إنتاج المشكلة باستمرار. ومع ذلك، كان كل شيء معقدًا بسبب سلسلة المرور:
يبدو أن tcpdump فقط هو الذي سيساعد في حل هذه المشكلة... لكنني سأكرر ما يتعلق بسلسلة المرور:
تحقيق
من الواضح أنه من الأفضل الاستماع إلى حركة المرور على تلك العقدة المحددة، حيث قام Kubernetes بنشر جراب: سيكون حجم التفريغ بحيث سيكون من الممكن العثور على شيء ما على الأقل بسرعة كبيرة. وبالفعل عند فحصه لوحظ الإطار التالي:
عند الفحص الدقيق للمكب، تم ملاحظة الكلمة M.laga. من السهل تخمين أنه لا توجد مدينة M.laga في إسبانيا (ولكن توجد ملقة). بالاستفادة من هذه الفكرة، نظرنا إلى تكوينات Ingress، حيث رأينا تلك التي تم إدراجها قبل شهر (بناءً على طلب العميل) مقتطف "غير ضار".:
سيعود 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؟!)، بل تتعلق بحقيقة ذلك الذهن والدراسة المتسقة كل خطوة تتخذها أثناء البحث عن المشاكل ستؤتي ثمارها عاجلاً أم آجلاً. حظ سعيد!