تشريح منزلي Kubernetes العنقودية

قبل عام ، أدركت أنني أردت إنشاء مجموعة Kubernetes الخاصة بي. أنا مطور البرمجيات. عادةً ما أستخدم مجموعة محلية أحادية العقدة أو استخدم مجموعة عن بُعد متعددة العقد لاختبار مشروعاتي. عند العمل مع مجموعة أحادية العقدة ، عادةً ما أعتمد على Minikube ، على الرغم من وجود حلول أخرى ، مثل مشروع Kind ، والتي يمكن أن تحاكي وجود عدة عقد في مجموعة. قد يظهر دعم للعقد المتعددة في Minikube.

لذا ، أود أن يكون تحت تصرفي قدرات كل من البيئات المذكورة أعلاه. أي أنه سيكون لدي مجموعة تتكون من عدة عقد ، وبالتالي فإن العمل مع هذه المجموعات لا يعني تأخيرات في الشبكة نموذجية للتفاعل مع البيئات البعيدة. تم بالفعل كتابة العديد من البرامج التعليمية الرائعة حول بناء مجموعات Kubernetes متعددة العقدة باستخدام أجهزة الكمبيوتر ذات اللوحة الواحدة . تستخدم العديد من هذه الكتيبات Raspberry Pi كـ SBC. برؤية هذا ، قررت أن أتبع المسار الأقل مقاومة واخترت هذا الكمبيوتر أيضًا. أثبتت منصة Raspberry Pi نفسها كحل غير مكلف وميسور التكلفة.





وتجدر الإشارة إلى أن اختيار هذه المنصة يوفر بعض التنازلات. على سبيل المثال ، لم ترخص Broadcom و Raspberry Pi Foundation ARMv8 ملحقات التشفير (يعد ذلك ضروريًا لتسريع الأجهزة لدعم AES). حل آخر مثير للجدل هو استخدام بطاقات microSD في شكل وسيط تخزين قياسي يتم تحميل نظام التشغيل منه.

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

المتطلبات


  • يجب أن تكون المجموعة محاطة بسكن منفصل ، يمكن تحريكها وفتحها وصيانتها بسهولة ، والعمل مع وحدات منفصلة من النظام ؛
  • , . , , . , . , .
  • , .
  • , , , .

وراء هذه المتطلبات ، هناك هدف واحد غير واضح ، وهو أنني كنت بحاجة إلى ابنتي البالغة من العمر أربع سنوات للعمل مع المجموعة. آمل أن يصبح لها دليلاً دراسيًا يساعدها في التعرف على أجهزة الكمبيوتر وقذائف الأوامر والمحطات الطرفية.

مستلزمات


التفاصيلمصدر
بيكو 5 راسبيري بي 5 اس كيتpicocluster.com
كمبيوتر واحد: 2 راسبيري باي 4 بي (4 جيجا) 3 راسبيري بي 3 بي +
5 بطاقات microSD من فئة 32GB فئة 10 / A1 raspberrypi.org
كابلات إيثرنت: 2 0.25 م كات. 83 0.15 م كات .7 ، S / FTP1attack.de
كبلات USB PortaPow 20AWG2 كبل USB-C3 كبل USB صغيرportablepowersupplies.co.uk
شاشة راسبيري باي الرسمية 7 ″ تعمل باللمسraspberrypi.org
مزود الطاقة Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
محول 12V-5V 15A DC-Buckdroking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

حقيبة PicoCluster صغيرة الحجم وسهلة الاستخدام للغاية. من مجموعة المبتدئين التي طلبتها ، استخدمت الهيكل فقط ، بما في ذلك المزالج والرفوف ، بالإضافة إلى مفتاح Gigabit Ethernet ذي 8 منافذ.

الآن أفهم أنه سيكون من الأفضل إذا باعت PicoCluster نسخة من مجموعتها دون أي مكونات كهربائية. بديل آخر لهذه المجموعة هو تطوير الضميمة الخاصة بها. هذا ، ومع ذلك ، سوف يتطلب المزيد من الوقت. سوف أضطر إلى إنشاء رسومات متجهة ، وسأضطر إلى استخدام خدمات القطع بالليزر في شركة تقدم صفائح أكريليك ، وبشكل مثالي صفائح ذات طلاء يبدد التفريغ الكهروستاتيكي.

أثناء العمل ، صادفت تحذيرات بشأن عدم كفاية الجهدواكتشفت أن المشكلة ناتجة عن كبلات USB صغيرة تأتي مع العلبة. بالإضافة إلى ذلك ، إلى جانب الحالة ، كان هناك محول DC-DC من 12 إلى 5 فولت ، 30 وات ، والذي استبدله بمحول أكثر قوة. فعلت ذلك لأسباب سأناقشها أدناه في القسم الخاص بتشغيل النظام.

في الوقت الذي بدأت فيه العمل في هذا المشروع ، لم أخطط لاستخدام لوحات Raspberry Pi 4 التي تم إصدارها في عام 2019. يوضح هذا أنه لا يزال لدي ثلاث لوحات Raspberry Pi 3 تعمل كعقد عمل. لقد استبدلت لوحين آخرين مثل Raspberry Pi 4. يتم استخدامهما للعقد التي تحتاج إلى المزيد من الموارد. هذه هي العقدة الرئيسية والعقدة العاملة ، والتي ، من بين أمور أخرى ، تستخدم لإنشاء نسخ احتياطية للبيانات.

بعد وقت قصير من إطلاق Raspberry Pi 4 ، أطلقت PicoCluster هيكلًا جديدًا مصممًا خصيصًا لهذه اللوحات. يتضمن مزود طاقة قوي ، ومروحتين ومفتاح طاقة. صحيح ، هذه الحالة أكبر من حالتي ، وسيتضح أن المراوح ستكون أعلى من Noctua NF-A4x20. يمكن التحكم في سرعة دوران هذه المروحة باستخدام تعديل عرض النبض (PWM) ، مع مراعاة نتائج قياسات درجة الحرارة التي يتم إجراؤها على الألواح.

وتجدر الإشارة إلى أن كل من SoC Broadcom BCM2837 (Raspberry Pi 3) و SoC BCM2711 (Raspberry Pi 4) لديهما مؤقتات أجهزة قادرة على توليد إشارات PWM. ونتيجة لذلك ، من السهل جدًا إصدار إشارات التحكم في الإدخالمتوقع من Noctua NF-A4x20 PWM دون زيادة التحميل على المعالج. بالإضافة إلى ذلك ، المروحة بالكاد مسموعة عندما تعمل بنصف السرعة التي تدعمها (حوالي 2500 دورة في الدقيقة). هذا ، كما اتضح ، يكفي للحفاظ على درجة حرارة النظام أقل من 45 درجة مئوية / 113 درجة فهرنهايت تحت الحمل العادي.

تحتوي العلبة الجديدة على مصدر طاقة متكامل. علاوة على ذلك ، فهو أغلى من الذي اخترته. كل هذه الميزات لهذه الحالة هي السبب في أنني سأختار مجموعة Pico 5S حتى إذا اشتريت العلبة الآن. يجب بذل المزيد من الجهود لوضعها في الاعتبار ، لكن ما اتضح في النهاية يبدو لي أفضل مما كان سيحدث ، إذا اخترت مبنى مختلفًا. بشكل عام ، فإنه يستحق الجهد والوقت.

المجسم


panel اللوحة الأمامية



اللوحة

الأمامية تحتوي اللوحة الأمامية على فتحة للوصول إلى بطاقات microSD. هذا مريح ، حتى مع الأخذ في الاعتبار حقيقة أنني أخطط لتنظيم تمهيد النظام باستخدام تمهيد تخزين USB كبير السعة . أخطط للقيام بذلك مباشرة بعد أن يدعم Raspberry Pi 4 وضع التمهيد هذا بشكل كامل. تساعد الفتحة أيضًا على تنظيم دوران الهواء في السكن. في هذه الحالة ، يوجد محركا أقراص SSD مباشرة أمام المروحة ، مما يساعد على الحفاظ على درجة حرارة التشغيل المثلى.

مؤشرات النشاط والطاقة في المجالس واضحة للعيان ، مما يسمح لك بتقييم حالة الكتلة في لمحة. مؤشرات النشاط لمحول إيثرنت مرئية أيضًا.


اللوحة العلوية للحالة بدون

شاشة يمكن تحريك الشاشة بسهولة لتقريبها من لوحة المفاتيح ، أو لتوفير الوصول إلى اللوحة العلوية عند فتح العلبة.

panel اللوحة اليسرى



اللوحة

اليسرى على اللوحة اليسرى من العلبة توجد منافذ GPIO للألواح. يربط أحد الكابلات الوحدة الرئيسية بالمروحة - لتنظيم التحكم في PWM في سرعة الدوران. يقوم كابل آخر بتوصيل العقدة الرئيسية بوحدة لوحة الدارات الكهربائية ، والتي يتم استخدامها لتشغيل وإيقاف عقد العمل. تربط أربعة كبلات كل عقد عمل بالعقدة الرئيسية. يستخدم دبابيس GPIO بمستوى نشط عالٍ عند إيقاف تشغيله. يسمح هذا للعقدة الرئيسية بإيقاف تشغيل قوة العقدة العاملة بأمان بعد اكتمال تسلسل الإجراءات المنجزة في نهاية عملها.


الوحدة المستخدمة لتوصيل المروحة بالعقدة الرئيسية

في الزاوية اليسرى العليا توجد وحدة صغيرة مصممة لتوصيل موصل مروحة Noctua 4 سنون بالعقدة الرئيسية Raspberry Pi. تم تكوين موصل GPIO المقابل ، بفضل دعم الأجهزة لتوليد إشارات PWM ، للتحكم في سرعة المروحة. يتم اختيار السرعة بناءً على تحليل درجة حرارة الألواح ، والمعلومات التي يتم جمعها بانتظام باستخدام SSH. بالإضافة إلى ذلك ، تقوم الوحدة الرئيسية لأغراض المراقبة بقراءة سرعة المروحة.

panel اللوحة الخلفية



لوحة خلفية

اللوحة الخلفية للكابلات يخفي الهيكل. يمكن اعتبار حقيقة أن كل شيء يبدو بهذه الطريقة نتيجة لمقاربة ماكرة للتنظيم النموذجي لمشروعي. كان من الصعب العثور على كابلات عالية الجودة. خاصة - كابلات USB 3.0 قصيرة مع المقابس المنحنية. الكابلات - هذه هي أكبر مجموعة من العناصر المتحركة في نظامي ، يجب أن تلبي بعض الخصائص الميكانيكية والكهربائية. تبين أنها المصدر الرئيسي للمشاكل.

كان لدي فكرة لاستخدام كابل حلزوني واحد لاستبداله بكابل شريط DSI ، الذي يتم توصيل الشاشة بالنظام. ثم يقوم الكبل الحلزوني بتوصيل الشاشة بالمجموعة وإمدادها بالطاقة. ولكن لم أجد موصل DSI مناسبًا. لقد امتنعت عن هذا المشروع وحقيقة أنني لم أكن منجذبًا لاحتمال لحام 17 سلكًا 0.14 مم². استخدمت موسع كبل DSI وقمت بتطبيق كبل طاقة USB صغير لولبي ثنائي الأسلاك. هذا أعطاني القدرة على التحرك وإيقاف الشاشة بسهولة دون فتح الحالة.


محاولة فاشلة لترتيب الكابلات

هذه محاولة فاشلة لاستخدام النظام لتنظيم إدخال الكبل في الحاوية المصممة لكابلات توسيع USB 3.0. على الرغم من المحاولات التي لا حصر لها لتوجيه الكابلات بشكل صحيح ، فقد واجهت أخطاء I / O بشكل منهجي أثناء نقل البيانات. ربما كانت ناجمة عن حقيقة أنها كانت ممددة أكثر من اللازم عند وضع الكابلات ، أو حقيقة أن هذا أضعف الاتصال الموثوق للكابلات بالموصلات.

panel اللوحة اليمنى



اللوحة

اليمنى على الجانب الأيمن من العلبة ، يمكنك رؤية مفتاح إيثرنت 8 منافذ.

تصميم النظام


▍ الغذاء



حالة مع اللوحة الأمامية المفتوحة

كان علي أن أقرر مصدر الطاقة الذي أستخدمه. على وجه الخصوص ، حول القوة بالواط التي يجب أن تدعمها من أجل تلبية احتياجات الكتلة. هذا جزء من سؤال حول ما حدث من قبل - دجاجة أو بيضة ، حيث لا يمكن إجراء القياسات قبل تطبيق الطاقة على الكتلة.

من أجل الحصول على تقدير تقريبي للطاقة ، التفت إلى الوثائق الرسمية ، التي تحتوي على بعض المعلومات حول قوة Raspberry Pi ، بالإضافة إلى مواصفات المكونات الأخرى. أعطاني هذا الأرقام التقريبية التالية بناءً على متوسط ​​استهلاك الطاقة.


ولكن ما حدث بعد مراعاة القيم القصوى لاستهلاك الطاقة من التوثيق.


كان هذا أعلى بكثير من الطاقة التي توفرها مصادر الطاقة تلك التي يمكن أن أجدها أنتجت 5 فولت ، لأن المكونات "منخفضة الطاقة" تحتاج إلى تيار 10 أمبير. استبعد هذا خيار استخدام مصدر طاقة واحد 5 فولت. في الوقت نفسه ، تعد مصادر الطاقة 12V شائعة جدًا ، والتي يمكن أن توفر المستوى الضروري من الطاقة. ونتيجة لذلك، اخترتها Dehner الكترونيك STD-12090 12V / DC 9A 108W إمدادات الطاقة وتوصيله إلى 12V إلى 5V 75W DC / DC تحويل .

هنا كان لدي خيار آخر ، وهو استخدام خمسة محولات أقل قوة - واحدة لكل لوحة Raspberry Pi ، ولكن هذا سيعقد إلى حد كبير تصميم الكتلة.


لوحة التصحيح يتم

تثبيت لوحة التصحيح المكونة من 4 أسنان على أساس MOSFET PSMN011-30YLC في الجزء السفلي من الهيكل. يتم استخدامه لتمكين وتعطيل عقد العمل. يتم تسميته 15A ، 30V ، لذلك يتكيف بشكل جيد حتى مع الحمل الذي تم إنشاؤه بواسطة أربعة Raspberry Pi.

قمت بقياس متوسط ​​الطاقة القصوى التي تستهلكها الكتلة. تتوافق نتائج القياس تقريبًا مع تلك الحسابات التقريبية التي أجريتها سابقًا. يمكن تفسير الفرق بين القيم المتوقعة والفعلية من خلال ميزات تكوين النظام وميزات الاختبار. على وجه الخصوص ، قمت بإيقاف تشغيل Wi-Fi و Bluetooth على جهاز Raspberry Pi ، وهما يعملان أيضًا دون عرض صورة على الشاشة. قد يفسر هذا حقيقة أنه في الواقع تبين أن القيم أقل.

كما اتضح ، فإن مصدر الطاقة 108 واط أقوى بكثير مما هو مطلوب للكتلة. ومع ذلك ، فإن حقيقة أنني لدي مثل هذا التيار الكهربائي يعني أنه يمكنني توسيع قدرات النظام. على سبيل المثال ، استبدل Raspberry Pi 3 بـ Raspberry Pi 4.

storage تخزين البيانات


واحدة من الميزات الرائعة الجديدة في Raspberry Pi 4 هي وجود منفذي USB 3.0 على اللوحة متصلان بـ SoC BCM2711 باستخدام اتصال PCIe سريع للغاية. وبفضل هذا ، يمكن للمرء أن يأمل في تحقيق معدلات بيانات عالية جدًا. قررت أنني كنت أستخدم منافذ USB 3.0 هذه لتوصيل أقراص SSD باستخدام محولات M.2 NVMe إلى USB 3.0. ومع ذلك ، كما اتضح ، كان من الصعب جدًا العثور على هذه المحولات. اقترحت بسذاجة أن أي محولات ستعمل بالنسبة لي. ونتيجة لذلك، اشتريت هذا أول محول دون التحقق توافقه مع التوت بي 4.

I، لحسن الحظ، جاء عبر هذادليل تحميل Raspberry Pi 4 ثم اشترى محول Shinestar M.2 NVMe إلى USB 3.0 الموصى به. كان تقريبًا نفس حجم M.2 NVMe 2280 (بعرض 22 مم وطول 80 مم) ، وهو أمر رائع لحافظة Pico 5S. لقد استخدمت المحول لتوصيل Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go إلى Raspberry Pi.


محول M.2 NVMe إلى USB 3.0

بعد تثبيت كل شيء وتكوينه ، قررت اختبار محرك الأقراص بسرعة ومعرفة سرعة نقل البيانات. للقيام بذلك ، قمت بنسخ ملف كبير من SSD إلى جهاز الكمبيوتر المحمول الخاص بي باستخدامscp:

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


نتيجة 39 ميغابايت / ثانية خيب أملي. هذه الأرقام بعيدة عن تلك المطلوبة لتحميل محول Gigabit Ethernet بالكامل. بدأت في البحث عن اختناق محتمل في النظام ، وأدركت أنه أثناء نقل الملفات ، يتم دائمًا تحميل أحد نوى المعالج بنسبة 100٪. بعد أن اكتشفت أن المعالج هو عنق الزجاجة في نقل البيانات ، اكتشفت بسرعة أن Raspberry Pi 4 لا يحتوي على دعم أجهزة AES ، نظرًا لأن Broadcom و Raspberry Pi Foundation لم يرخصا ملحقات التشفير ARMv8. ومن المثير للاهتمام أن المعالج هو عنق الزجاجة للنظام على Raspberry Pi 4 ، بينما كانت الاختناقات في Raspberry Pi 3 هي USB 2.0 وواجهات الشبكة. أعطى

اختبار جديد باستخدام netcatنفس الظروف نتائج أفضل بكثير عند 104 ميجا بت / ثانية:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

بعد التعامل مع محرك الأقراص SSD الأول ، قمت بتوصيل نفس محرك الأقراص الثاني بلوحة Raspberry Pi 4. سأستخدم محرك الأقراص هذا لعمل نسخة احتياطية من محرك الأقراص الأول باستخدام شيء مثل Restic .

بالإضافة إلى ذلك ، أخطط لاستخدام محركات أقراص SSD لتنظيم التمهيد باستخدام تمهيد تخزين USB كبير السعة مباشرة بعد أن يدعم Raspberry Pi 4 أسلوب التمهيد هذا بشكل كامل. بالمقارنة مع التنزيل من microSD ، يعدك بسرعة أعلى ومستوى أداء أكثر استقرارًا.

البرمجيات


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

للبدء ، في كل عقدة ، قم بتمكين cgroups:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

ثم قم بتثبيت k3s على العقدة الرئيسية:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

الآن نحصل على رمز مميز يسمح بتوصيل عقد العمل بالعقدة الرئيسية:

$ sudo cat /var/lib/rancher/k3s/server/node-token

التالي - تثبيت k3s على كل عقدة عمل:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

إذا كنت تخطط لاستخدام السجل الداخلي لصور الحاوية ، والذي يتم تثبيته افتراضيًا ، فقد تحتاج إلى تكوينه بطريقة خاصة ، وذلك للقيام بذلك للسماح containerdبتحميل الصور منه:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

خطط مستقبلية


في هذه المادة ، لم أفصح عن بعض المواضيع المهمة التي تستحق التحليل العميق بما فيه الكفاية. على سبيل المثال ، ما يلي:


ربما سأكتب المزيد عن هذا.

بالإضافة إلى ذلك ، أخطط لمواصلة العمل على المجموعة من خلال القيام بما يلي:


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

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

القراء الأعزاء! هل حاولت القيام بشيء مماثل لما وصفه مؤلف هذا المقال؟


All Articles