مستوى المقال: محترف — يفترض إنك بتشغّل خدمات على Kubernetes وعندك إلمام بـ Pods و resolv.conf وأساسيات DNS.
ndots:5: ليه نداء DNS واحد في Kubernetes بيتحوّل لـ 5 استعلامات
تقدر تشيل عشرات المللي ثانية من زمن كل نداء خارجي في كلاستر Kubernetes بسطر واحد في تعريف الـ Pod. المشكلة مش في الشبكة ولا في CoreDNS نفسه، المشكلة في إعداد افتراضي اسمه ndots:5 بيخلّي كل نداء لاسم خارجي زي api.stripe.com يتحوّل لحد 5 استعلامات DNS بدل استعلام واحد.
المشكلة باختصار
خدمتك بتنادي API خارجي، والـ p99 بيقفز بشكل غير مفهوم رغم إن الترافيك عادي والـ CPU مرتاح. تفتح traces تلاقي وقت ضايع قبل أول بايت في الاتصال. ده وقت resolution، مش وقت السيرفر البعيد. السبب إن الـ Pod بيسأل DNS كذا مرة على كل اسم قبل ما يوصل للإجابة الصح.
يعني إيه ndots أصلًا؟ (المثال البسيط الأول)
تخيّل إنك في مكتب فيه سنترال داخلي. لو قلت للسنترال رقم قصير زي "204"، هو مش هيفترض إنه رقم خارجي، هيحاول يوصّلك جوّه الشركة الأول. لو قلتله رقم طويل واضح إنه خارجي، هيطلبه على طول برّه. ndots هو بالظبط "كام نقطة لازم يكون في الاسم عشان النظام يعتبره اسمًا خارجيًا كاملًا ويطلبه دايركت".
في Kubernetes، القيمة الافتراضية ndots:5. يعني أي اسم فيه أقل من 5 نقاط، النظام هيفترض إنه اسم داخلي ناقص، وهيحاول يكمّله بالـ search domains بتاعة الـ Pod الأول قبل ما يجرّبه كاسم مطلق. اسم زي api.stripe.com فيه نقطتين بس، فبيقع تحت الشرط ده.
الشرح العلمي الدقيق
كل Pod بياخد ملف /etc/resolv.conf شبه ده:
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
nameserver 10.96.0.10
options ndots:5لمّا الـ resolver يشوف اسمًا فيه عدد نقاط أقل من ndots، بيطبّق قاعدة الـ search list: بيلزق كل search domain على الاسم ويسأل عليه بالترتيب، ولو كلهم فشلوا يسأل على الاسم المطلق في الآخر. يعني api.stripe.com بيتحوّل عمليًا للتسلسل ده:
api.stripe.com.default.svc.cluster.local← NXDOMAINapi.stripe.com.svc.cluster.local← NXDOMAINapi.stripe.com.cluster.local← NXDOMAINapi.stripe.com.ec2.internal← NXDOMAINapi.stripe.com.← الإجابة الصح أخيرًا
كل ده لاستعلام واحد. وبما إن الـ stub resolver بيسأل عن سجل A و AAAA مع بعض، اضرب العدد في 2: ممكن توصل لحوالي 10 حزم DNS لكل نداء خارجي واحد.
ليه ده بيوجع في الإنتاج؟
الافتراض إن عندك خدمة بتعمل نداءات كتير لـ APIs خارجية (بوابة دفع، مخزن كائنات، Webhooks). لو الخدمة بتفتح اتصال جديد لكل نداء من غير reuse، كل اتصال بيدفع ضريبة الـ 4 استعلامات الفاشلة قبل الاستعلام الصح.