العودة إلى المدونة

كيفية استكشاف أخطاء شبكات Kubernetes وإصلاحها وفحصها

كيفية استكشاف أخطاء شبكات Kubernetes وإصلاحها وفحصها

Kubernetes هي أداة مفتوحة المصدر بالغة الأهمية في تنسيق الحاويات. تساعد Kubernetes في تنسيق وإدارة المجموعات على نطاق واسع عبر بيئات سحابية مختلفة أو حتى خوادم محلية. المجموعة هي مجموعة من المضيفين المخصصين لتشغيل التطبيقات والخدمات المغلفة في حاويات. تحتاج المجموعة إلى عقدتين على الأقل للعمل – عقدة رئيسية واحدة وعقدة عاملة. يمكنك توسيع البنية التحتية لـ Kubernetes عن طريق إضافة المزيد من العقد العاملة. يجب أن تكون العقدة الرئيسية والعقد العاملة التابعة لها قادرة على الاتصال عبر الشبكة لكي تعمل البنية التحتية. للحصول على نظرة عامة على أهم ميزات Kubernetes، يرجى اتباع برنامجنا التعليمي حول التعرف على Kubernetes.

في هذا البرنامج التعليمي، سنعرض لك العديد من الأدوات والتقنيات للمساعدة في فحص واستكشاف أخطاء شبكات Kubernetes وإصلاحها.

المتطلبات الأساسية

  • يجب أن يكون لديك أيضًا kubectl مثبتًا محليًا. اعتمادًا على بيئتك المحلية، اتبع الوثائق الرسمية الخاصة بـ تثبيت أدوات Kubernetes. يجب تهيئة kubectl للاتصال بمجموعتك. سنشرح ذلك بالتفصيل في القسم أدناه.

سنقوم بتشغيل العديد من الأوامر محليًا وعلى عقدة Kubernetes. فلنبدأ!

تهيئة kubectl المحلي للاتصال بمجموعة Kubernetes بعيدة

لنبدأ بتثبيت kubectl. تعمل بيئتنا المحلية بنظام التشغيل Ubuntu، اتبع هذا الرابط إذا كنت تقوم بتشغيل بيئة محلية مختلفة. لتثبيت kubectl على بيئة محلية بنظام Ubuntu/Debian باستخدام مدير الحزم apt، قم بتشغيل الأوامر التالية لتحديث مستودع apt وتثبيت الحزم اللازمة:

بعد ذلك، قم بتشغيل الأمر التالي لتنزيل مفتاح التوقيع العام لـ Google Cloud:

ثم، أضف مستودع apt الخاص بـ Kubernetes:

بعد ذلك، قم بتحديث فهرس apt وتثبيت kubectl باستخدام الأمر التالي:

ثم، تحقق من أن kubectl مثبت عن طريق التحقق من الإصدار باستخدام الأمر التالي:

إليك المخرجات إذا قمت للتو بتثبيت kubectl محليًا:

kubectl version

في لقطة الشاشة أعلاه، يحاول kubectl الاتصال بمجموعة Kubernetes المحلية. ومع ذلك، فإنه يفشل لأننا لا نملك مجموعة Kubernetes تعمل على جهازنا المحلي بعد.

للاتصال بمجموعة Kubernetes البعيدة، ستقوم أولاً بتنزيل بيانات اعتماد Kubernetes من المجموعة البعيدة. إليك أمر لنسخ بيانات الاعتماد من العقدة الرئيسية:

استبدل الأجزاء المحددة باسم مستخدم ssh الخاص بك وعنوان IP العام للعقدة الرئيسية. بمجرد انتهاء تنزيل بيانات الاعتماد، انسخ بيانات الاعتماد إلى دليلك الرئيسي:

هذا كل شيء. يجب أن يكون kubectl المحلي قادرًا على الاتصال بمجموعة Kubernetes البعيدة وإصدار الأوامر إليها. للتأكد من أن kubectl المحلي متصل بالمجموعة البعيدة، تحقق باستخدام أمر الإصدار مرة أخرى:

إليك المخرجات، والتي توضح نجاح الاتصال:

kubectl version json

اختياريًا، يمكنك تشغيل أمر get nodes كالتالي:

kubectl get nodes

الحصول على عنوان Cluster IP الخاص بـ Pod

يمكنك الحصول على عنوان Cluster IP الخاص بـ Pod عن طريق تشغيل أمر kubectl get pod على جهازك المحلي. لعرض المزيد من المعلومات مثل العقدة التي تستضيف الـ pod، وعنوان cluster IP الخاص بالـ pod، أضف العلامة -o wide إلى الأمر:

إليك المخرجات من عنقود Kubernetes الخاص بنا. في الدرس التعليمي السابق، قمنا بإنشاء نشر لخادم ويب Nginx كما ترى:

kubectl get pod -o wide

يوضح عمود IP عنوان IP الداخلي لكل pod على حدة. إذا لم يظهر الـ pod الذي تبحث عنه في القائمة، فقد تكون في مساحة أسماء مختلفة. يمكنك تشغيل الأمر التالي لعرض الـ pods في جميع namespaces:

الحصول على عنوان IP الخاص بـ Service

يمكنك أيضًا الحصول على عنوان IP الخاص بـ Service على العنقود الخاص بك. من خلال إضافة علامة --all-namespaces ، ستحصل على جميع الخدمات التي تعمل على العنقود:

المخرجات من الأمر أعلاه هي كالتالي. عنوان Service IP موجود في عمود cluster-ip :

kubectl get svc

الحصول على مساحات أسماء شبكة الـ Pod والوصول إليها

لكل pod في Kubernetes مساحة أسماء شبكة (network namespace) مخصصة له. مساحات أسماء الشبكة، والتي يُشار إليها أيضًا باسم netns، هي مكتبات شبكات أصلية في Linux توفر العزل بين أجهزة الشبكة.

للتحقق من دقة DNS أو اتصال الشبكة العام، يمكنك تشغيل الأوامر داخل مساحة أسماء شبكة الـ pod. لتحقيق ذلك، تبدأ بالبحث عن معرف العملية (process ID) لأحد الحاويات في الـ pod. يمكنك القيام بذلك بسهولة في Docker باستخدام أوامر خاصة بـ Docker. يعرض الأمر الأول الحاويات التي تعمل على عقدة. قم بتسجيل الدخول إلى إحدى عقد العمل (worker nodes) الخاصة بك وقم بتشغيل الأمر التالي:

docker ps

في المخرجات، نحن مهتمون بعمود معرف الحاوية (container ID) أو الأسماء (Names). لاحظ حاوية Nginx التي قمنا بنشرها في الدرس التعليمي السابق How to Install and Use Kubernetes on Ubuntu 20.04.

بعد ذلك، انسخ معرف الحاوية أو اسمها لأننا سنستخدمه في الأمر التالي للعثور على معرف العملية:

استبدل الجزء المميز بقيمتك المنسوخة من الأمر السابق. فيما يلي المخرجات التي حصلنا عليها، وهي معرف العملية:

docker inspect

الآن بعد أن أصبح لدينا معرف العملية، يمكننا استخدامه لتشغيل أمر nsenter داخل مساحة أسماء الشبكة الخاصة بالعملية:

استبدل الجزء المميز بمعرف العملية الذي حصلت عليه في الأمر السابق. ثم بدلاً من ip addr، يمكنك وضع أي أمر ترغب في تشغيله داخل مساحة أسماء شبكة الـ pod. يمكنك أيضًا تشغيله باستخدام sudo في حالة حصولك على خطأ رفض الإذن.

يسمح لك أمر nsenter بتشغيل مجموعة أوسع من الأوامر المتاحة على العقدة مقارنة باستخدام docker exec الذي يقصرك فقط على الأوامر المثبتة داخل الحاوية.

استرداد واجهة إيثرنت الافتراضية الخاصة بـ Pod

تتواصل مساحة أسماء الشبكة على الـ pod مع الـ netns الجذرية للعقدة من خلال أنبوب إيثرنت افتراضي. من جانب العقدة، يظهر هذا الأنبوب كجهاز يبدأ اسمه بـ veth وينتهي بمعرف فريد، مثل veth742f721 أو veth90. بينما داخل الـ pod يتم تحديد الأنبوب كـ eth0.

قد ترغب في معرفة أي جهاز veth مقترن بأي pod. يمكنك البدء بسرد جميع أجهزة الشبكة على العقدة، ثم سرد جميع الأجهزة في شبكة الـ pod. لتحديد أي جهاز veth مقترن بـ pod معين، يمكنك ربط أرقام الأجهزة بين القائمتين.

استخدم أمر nsenter لتشغيل أمر ip addr في مساحة أسماء شبكة الـ pod. ستحتاج إلى معرفة أحد معرفات العمليات الخاصة بالحاوية. لذلك، راجع القسم السابق حول Getting and Accessing Pod Network Namespaces.

بعد ذلك، نفّذ الأمر التالي على الطرفية الخاصة بعقدة العامل (worker node)، مع استبدال الجزء المظلل بشكل مناسب:

يُخرج الأمر قائمة بواجهات الـ pod:

nsenter ip addr

لاحظ الـ if7 محارف بعد الـ eth0@ في المخرجات أعلاه. هذا يعني أن الـ eth0 مقترن بالواجهة السابعة للعقدة. بعد ذلك، قم بسرد الواجهات داخل مساحة الأسماء الافتراضية (default namespace) للعقدة عن طريق تشغيل الأمر ip addr :

يسرد الأمر الواجهات كما هو موضح أدناه:

Kubernetes Networking ip addr

في المخرجات، الواجهة السابعة هي veth254b50e6@if3  – أنبوب الإيثرنت الافتراضي المقترن بالـ pod الذي نقوم بالاختبار عليه.

مراجعة قواعد Iptables

يمكنك تنفيذ الأمر iptables-save لسرد جميع قواعد iptables على العقدة:

يمكن أن تكون مخرجات الأمر طويلة، لذا قد ترغب في حفظها في ملف لفحصها لاحقًا:

يمكنك أيضًا استخدام less لتصفح المخرجات صفحة بصفحة:

بما أننا مهتمون فقط بقواعد NAT الخاصة بـ Kubernetes، أضف العلامة -L لتحديد الهدف الصحيح:

إليك المخرجات:

Kubernetes Networking iptables

فحص تفاصيل IPVS

إن Kube-proxy هو وكيل شبكة (network proxy) يعمل على كل عقدة في عنقود Kubernetes الخاص بك. ويمكن استخدامه لتكوين IPVS لمعالجة ترجمة عناوين IP الخاصة بالخدمات الافتراضية (virtual Service IPs) إلى عناوين IP الخاصة بالـ pods. لسرد جدول ترجمة عناوين IP، يمكنك استخدام الأمر ipvsadm . أولاً، تحتاج إلى تثبيته على عقدتك:

الآن يمكنك تنفيذ الأمر التالي:

لعرض عنوان IP لخدمة واحدة، أضف العلامة -t ، مع تحديد عنوان IP المطلوب:

الاستعلام عن نظام أسماء النطاقات للعنقود (Cluster DNS)

هناك بضع طرق يمكنك اتباعها لتصحيح أخطاء دقة نظام أسماء النطاقات (DNS resolution) في عنقودك. الوثائق الرسمية تصف إحدى الطرق بنشر حاوية تصحيح أخطاء (debug container) تحتوي على جميع الأدوات اللازمة، ثم استخدام kubectl لتنفيذ nslookup.

اختياريًا، يمكنك الاستعلام عن DNS باستخدام الأمر dig و nsenter من العقدة نفسها. أولاً، سيتعين عليك تثبيت dig على العقدة الرئيسية (master node). بالنسبة لنظام التشغيل Ubuntu، قم بالتثبيت باستخدام الأمر apt :

Kubernetes Networking install dnsutils

عد إلى الطرفية على جهازك المحلي، وقم بتشغيل الأمر أدناه للعثور على عنوان IP الخاص بالعنقود لخدمة kube-dns :

يُخرج الأمر:

get kube dns service

العمود cluster-ip يحتوي على القيمة التي نحتاجها. الآن يمكننا استخدام nsenter لتشغيل dig في مساحة أسماء الحاوية (container namespace). ومع ذلك، ستحتاج إلى معرف عملية الحاوية (process ID) للوصول إلى مساحة الأسماء الخاصة بها. انظر إلى القسم الحصول على مساحات أسماء شبكة الـ Pod والوصول إليها أعلاه للحصول على إرشادات.

بمجرد حصولك على الـ container-id، نفّذ الأمر التالي على العقدة الرئيسية (master node):

يأخذ الأمر dig عنوان IP الخاص بخدمة DNS للعنقود ( @10.96.0.10) ويبحث عن اسم النطاق الكامل للخدمة service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

للحصول على معلومات حول العثور على أسماء الخدمات ومساحات الأسماء، ألقِ نظرة على القسم الحصول على عنوان IP الخاص بالخدمة.

مراجعة تتبع الاتصالات Conntrack

يمكنك استخدام الأمر conntrack لعرض جميع الاتصالات التي يتم تتبعها حاليًا:

يُخرج شيئًا مشابهًا للقطة الشاشة:

Kubernetes Networking conntrac -l

أضف العلامة -E لمراقبة الاتصالات الواردة باستمرار:

لعرض الاتصالات التي يتم تتبعها إلى عنوان وجهة معين، أضف العلامة -d وحدد عنوان الوجهة:

في بعض الأحيان يمتلئ جدول تتبع الاتصالات، مما يؤدي إلى إسقاط الاتصالات الجديدة. يتسبب هذا في حدوث مشكلات تمنع العقد الخاصة بك من إجراء اتصالات موثوقة. إذا حدث هذا، فسترى رسائل مثل الرسالة التالية في سجلات النظام الخاص بك، في الموقع /var/log/syslog:

يوجد إعداد للنظام للحد الأقصى من الاتصالات التي يتم تتبعها. استخدم الأمر التالي لسرد قيمتك الحالية:

تكون المخرجات:

conntrack max

يمكنك تعديل القيمة باستخدام -w الخيار:

قد ترغب في تعديل ملف /etc/sysctl.conf لجعل القيمة دائمة وضمان استمرارها عبر عمليات إعادة التشغيل. افتح الملف باستخدام nano:

بعد ذلك، قم بتعديل القيمة إذا كان السطر موجودًا أو أضف السطر في نهاية الملف، مع تحديد القيمة الجديدة:

الخاتمة

عند نشر خدمات متعددة داخل حاويات، ستستفيد بشكل كبير من Kubernetes لأنه يمنحك نقطة إدارة مركزية. لضمان وجود اتصال بين وحدات Kubernetes pods المختلفة، عرضنا لك بعض أوامر فحص الشبكة التي يمكنك استخدامها لاستكشاف أي مشكلات وإصلاحها حول بنية Kubernetes الأساسية الخاصة بك.

لمعرفة المزيد عن Kubernetes وميزاته وإعداد التطبيقات ونشرها على Kubernetes، ألقِ نظرة على مختلف دروس Kubernetes التعليمية.

حوسبة سعيدة!

author

Pranay Kapgate

المؤلف · CloudSigma

Preslav Dobrev هو مصمم إبداعي في CloudSigma، يركز على هوية أعمال متسقة باستخدام قنوات التسويق التقليدية والمبتكرة. هو بارع في دمج الرؤية الفنية مع التسويق الاستراتيجي لخلق سرد قصصي مؤثر للعلامة التجارية.

التعليقات

لا توجد تعليقات بعد. كن أول من يعلق.