Kubernetes هي أداة مفتوحة المصدر بالغة الأهمية في تنسيق الحاويات. تساعد Kubernetes في تنسيق وإدارة المجموعات على نطاق واسع عبر بيئات سحابية مختلفة أو حتى خوادم محلية. المجموعة هي مجموعة من المضيفين المخصصين لتشغيل التطبيقات والخدمات المغلفة في حاويات. تحتاج المجموعة إلى عقدتين على الأقل للعمل – عقدة رئيسية واحدة وعقدة عاملة. يمكنك توسيع البنية التحتية لـ Kubernetes عن طريق إضافة المزيد من العقد العاملة. يجب أن تكون العقدة الرئيسية والعقد العاملة التابعة لها قادرة على الاتصال عبر الشبكة لكي تعمل البنية التحتية. للحصول على نظرة عامة على أهم ميزات Kubernetes، يرجى اتباع برنامجنا التعليمي حول التعرف على Kubernetes.
في هذا البرنامج التعليمي، سنعرض لك العديد من الأدوات والتقنيات للمساعدة في فحص واستكشاف أخطاء شبكات Kubernetes وإصلاحها.
المتطلبات الأساسية
-
لمتابعة هذا البرنامج التعليمي، يجب أن يكون لديك مجموعة Kubernetes. لدينا برنامج تعليمي يشرح كيفية تثبيت واستخدام Kubernetes على Ubuntu 20.04 والذي يمكنه توجيهك خلال إعداد مجموعة أساسية للعرض التوضيحي.
-
يجب أن يكون لديك أيضًا kubectl مثبتًا محليًا. اعتمادًا على بيئتك المحلية، اتبع الوثائق الرسمية الخاصة بـ تثبيت أدوات Kubernetes. يجب تهيئة kubectl للاتصال بمجموعتك. سنشرح ذلك بالتفصيل في القسم أدناه.
سنقوم بتشغيل العديد من الأوامر محليًا وعلى عقدة Kubernetes. فلنبدأ!
تهيئة kubectl المحلي للاتصال بمجموعة Kubernetes بعيدة
لنبدأ بتثبيت kubectl. تعمل بيئتنا المحلية بنظام التشغيل Ubuntu، اتبع هذا الرابط إذا كنت تقوم بتشغيل بيئة محلية مختلفة. لتثبيت kubectl على بيئة محلية بنظام Ubuntu/Debian باستخدام مدير الحزم apt، قم بتشغيل الأوامر التالية لتحديث مستودع apt وتثبيت الحزم اللازمة:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
بعد ذلك، قم بتشغيل الأمر التالي لتنزيل مفتاح التوقيع العام لـ Google Cloud:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
ثم، أضف مستودع apt الخاص بـ Kubernetes:
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
بعد ذلك، قم بتحديث فهرس apt وتثبيت kubectl باستخدام الأمر التالي:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
ثم، تحقق من أن kubectl مثبت عن طريق التحقق من الإصدار باستخدام الأمر التالي:
|
1 |
kubectl version |
إليك المخرجات إذا قمت للتو بتثبيت kubectl محليًا:

في لقطة الشاشة أعلاه، يحاول kubectl الاتصال بمجموعة Kubernetes المحلية. ومع ذلك، فإنه يفشل لأننا لا نملك مجموعة Kubernetes تعمل على جهازنا المحلي بعد.
للاتصال بمجموعة Kubernetes البعيدة، ستقوم أولاً بتنزيل بيانات اعتماد Kubernetes من المجموعة البعيدة. إليك أمر لنسخ بيانات الاعتماد من العقدة الرئيسية:
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
استبدل الأجزاء المحددة باسم مستخدم ssh الخاص بك وعنوان IP العام للعقدة الرئيسية. بمجرد انتهاء تنزيل بيانات الاعتماد، انسخ بيانات الاعتماد إلى دليلك الرئيسي:
|
1 |
cp -r .kube $HOME/ |
هذا كل شيء. يجب أن يكون kubectl المحلي قادرًا على الاتصال بمجموعة Kubernetes البعيدة وإصدار الأوامر إليها. للتأكد من أن kubectl المحلي متصل بالمجموعة البعيدة، تحقق باستخدام أمر الإصدار مرة أخرى:
|
1 |
kubectl version --output='json' |
إليك المخرجات، والتي توضح نجاح الاتصال:

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

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

يوضح عمود IP عنوان IP الداخلي لكل pod على حدة. إذا لم يظهر الـ pod الذي تبحث عنه في القائمة، فقد تكون في مساحة أسماء مختلفة. يمكنك تشغيل الأمر التالي لعرض الـ pods في جميع namespaces:
|
1 |
kubectl get pod -o wide --all-namespaces |
الحصول على عنوان IP الخاص بـ Service
يمكنك أيضًا الحصول على عنوان IP الخاص بـ Service على العنقود الخاص بك. من خلال إضافة علامة --all-namespaces ، ستحصل على جميع الخدمات التي تعمل على العنقود:
|
1 |
kubectl get service --all-namespaces |
المخرجات من الأمر أعلاه هي كالتالي. عنوان Service IP موجود في عمود cluster-ip :

الحصول على مساحات أسماء شبكة الـ Pod والوصول إليها
لكل pod في Kubernetes مساحة أسماء شبكة (network namespace) مخصصة له. مساحات أسماء الشبكة، والتي يُشار إليها أيضًا باسم netns، هي مكتبات شبكات أصلية في Linux توفر العزل بين أجهزة الشبكة.
للتحقق من دقة DNS أو اتصال الشبكة العام، يمكنك تشغيل الأوامر داخل مساحة أسماء شبكة الـ pod. لتحقيق ذلك، تبدأ بالبحث عن معرف العملية (process ID) لأحد الحاويات في الـ pod. يمكنك القيام بذلك بسهولة في Docker باستخدام أوامر خاصة بـ Docker. يعرض الأمر الأول الحاويات التي تعمل على عقدة. قم بتسجيل الدخول إلى إحدى عقد العمل (worker nodes) الخاصة بك وقم بتشغيل الأمر التالي:
|
1 |
docker ps |

في المخرجات، نحن مهتمون بعمود معرف الحاوية (container ID) أو الأسماء (Names). لاحظ حاوية Nginx التي قمنا بنشرها في الدرس التعليمي السابق How to Install and Use Kubernetes on Ubuntu 20.04.
بعد ذلك، انسخ معرف الحاوية أو اسمها لأننا سنستخدمه في الأمر التالي للعثور على معرف العملية:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-أو-name |
استبدل الجزء المميز بقيمتك المنسوخة من الأمر السابق. فيما يلي المخرجات التي حصلنا عليها، وهي معرف العملية:

الآن بعد أن أصبح لدينا معرف العملية، يمكننا استخدامه لتشغيل أمر nsenter داخل مساحة أسماء الشبكة الخاصة بالعملية:
|
1 |
sudo nsenter -t container-pid -n ip addr |
استبدل الجزء المميز بمعرف العملية الذي حصلت عليه في الأمر السابق. ثم بدلاً من 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)، مع استبدال الجزء المظلل بشكل مناسب:
|
1 |
sudo nsenter -t container-pid -n ip addr |
يُخرج الأمر قائمة بواجهات الـ pod:

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

في المخرجات، الواجهة السابعة هي veth254b50e6@if3 – أنبوب الإيثرنت الافتراضي المقترن بالـ pod الذي نقوم بالاختبار عليه.
مراجعة قواعد Iptables
يمكنك تنفيذ الأمر iptables-save لسرد جميع قواعد iptables على العقدة:
|
1 |
iptables-save |
يمكن أن تكون مخرجات الأمر طويلة، لذا قد ترغب في حفظها في ملف لفحصها لاحقًا:
|
1 |
iptables-save > iptables.txt |
يمكنك أيضًا استخدام less لتصفح المخرجات صفحة بصفحة:
|
1 |
iptables-save | less |
بما أننا مهتمون فقط بقواعد NAT الخاصة بـ Kubernetes، أضف العلامة -L لتحديد الهدف الصحيح:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
إليك المخرجات:

فحص تفاصيل IPVS
إن Kube-proxy هو وكيل شبكة (network proxy) يعمل على كل عقدة في عنقود Kubernetes الخاص بك. ويمكن استخدامه لتكوين IPVS لمعالجة ترجمة عناوين IP الخاصة بالخدمات الافتراضية (virtual Service IPs) إلى عناوين IP الخاصة بالـ pods. لسرد جدول ترجمة عناوين IP، يمكنك استخدام الأمر ipvsadm . أولاً، تحتاج إلى تثبيته على عقدتك:
|
1 |
sudo apt install ipvsadm |
الآن يمكنك تنفيذ الأمر التالي:
|
1 |
sudo ipvsadm -Ln |
لعرض عنوان IP لخدمة واحدة، أضف العلامة -t ، مع تحديد عنوان IP المطلوب:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
الاستعلام عن نظام أسماء النطاقات للعنقود (Cluster DNS)
هناك بضع طرق يمكنك اتباعها لتصحيح أخطاء دقة نظام أسماء النطاقات (DNS resolution) في عنقودك. الوثائق الرسمية تصف إحدى الطرق بنشر حاوية تصحيح أخطاء (debug container) تحتوي على جميع الأدوات اللازمة، ثم استخدام kubectl لتنفيذ nslookup.
اختياريًا، يمكنك الاستعلام عن DNS باستخدام الأمر dig و nsenter من العقدة نفسها. أولاً، سيتعين عليك تثبيت dig على العقدة الرئيسية (master node). بالنسبة لنظام التشغيل Ubuntu، قم بالتثبيت باستخدام الأمر apt :
|
1 |
sudo apt install dnsutils |

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

العمود cluster-ip يحتوي على القيمة التي نحتاجها. الآن يمكننا استخدام nsenter لتشغيل dig في مساحة أسماء الحاوية (container namespace). ومع ذلك، ستحتاج إلى معرف عملية الحاوية (process ID) للوصول إلى مساحة الأسماء الخاصة بها. انظر إلى القسم الحصول على مساحات أسماء شبكة الـ Pod والوصول إليها أعلاه للحصول على إرشادات.
بمجرد حصولك على الـ container-id، نفّذ الأمر التالي على العقدة الرئيسية (master node):
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
يأخذ الأمر dig عنوان IP الخاص بخدمة DNS للعنقود ( @10.96.0.10) ويبحث عن اسم النطاق الكامل للخدمة service-name.namespace.svc.cluster.local:

للحصول على معلومات حول العثور على أسماء الخدمات ومساحات الأسماء، ألقِ نظرة على القسم الحصول على عنوان IP الخاص بالخدمة.
مراجعة تتبع الاتصالات Conntrack
يمكنك استخدام الأمر conntrack لعرض جميع الاتصالات التي يتم تتبعها حاليًا:
|
1 |
sudo conntrack -L |
يُخرج شيئًا مشابهًا للقطة الشاشة:

أضف العلامة -E لمراقبة الاتصالات الواردة باستمرار:
|
1 |
sudo conntrack -E |
لعرض الاتصالات التي يتم تتبعها إلى عنوان وجهة معين، أضف العلامة -d وحدد عنوان الوجهة:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
في بعض الأحيان يمتلئ جدول تتبع الاتصالات، مما يؤدي إلى إسقاط الاتصالات الجديدة. يتسبب هذا في حدوث مشكلات تمنع العقد الخاصة بك من إجراء اتصالات موثوقة. إذا حدث هذا، فسترى رسائل مثل الرسالة التالية في سجلات النظام الخاص بك، في الموقع /var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: جدول ممتلئ, إسقاط حزمة. |
يوجد إعداد للنظام للحد الأقصى من الاتصالات التي يتم تتبعها. استخدم الأمر التالي لسرد قيمتك الحالية:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
تكون المخرجات:

يمكنك تعديل القيمة باستخدام -w الخيار:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
قد ترغب في تعديل ملف /etc/sysctl.conf لجعل القيمة دائمة وضمان استمرارها عبر عمليات إعادة التشغيل. افتح الملف باستخدام nano:
|
1 |
sudo nano /etc/sysctl.conf |
بعد ذلك، قم بتعديل القيمة إذا كان السطر موجودًا أو أضف السطر في نهاية الملف، مع تحديد القيمة الجديدة:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
الخاتمة
عند نشر خدمات متعددة داخل حاويات، ستستفيد بشكل كبير من Kubernetes لأنه يمنحك نقطة إدارة مركزية. لضمان وجود اتصال بين وحدات Kubernetes pods المختلفة، عرضنا لك بعض أوامر فحص الشبكة التي يمكنك استخدامها لاستكشاف أي مشكلات وإصلاحها حول بنية Kubernetes الأساسية الخاصة بك.
لمعرفة المزيد عن Kubernetes وميزاته وإعداد التطبيقات ونشرها على Kubernetes، ألقِ نظرة على مختلف دروس Kubernetes التعليمية.
حوسبة سعيدة!
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.