أطر تطوير برمجيات

Kubernetes القبطان الذي يمكن أن يوصلك للحل

By حسام الكرد

April 13, 2024

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

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

نشأة Kubernetes:

تم تطوير Kubernetes ليكون مستقلاً عن البنية التحتية السحابية، مما يسمح بالتشغيل على أي منصة سحابية عامة، مثل Google Cloud Platform، Amazon Web Services، وMicrosoft Azure، إضافة إلى بيئات الحوسبة السحابية الخاصة والمحلية. هذه القدرة تجعل من Kubernetes أداة مرنة وقوية لإدارة الحاويات على مختلف البنيات التحتية.

كيف أبدأ العمل على Kubernetes

يمكن تطبيق الKubernetes حتى على جهازك المحلي بحيث تستطيع تعلم كيفية عمله بنظام مبسط، ومن ثم يمكنك تطبيق ما تعلمته على بيئتك المحلية على بيئات حقيقية ومن أشهر الأدوات في نظام ماك هو `minikube` الذي يمكنك بعمل بيئة مماثلة على جهازك بنظام ماك وهناك أيضا docker kubernetes والعديد من الأنظمة المماثلة التي تساعدك على محاكاة النظام.

سنعتمد التنصيب على بيئة Mac مع العلم جميع الأدوات على أنظمة التشغيل الأخرى مثل Windows و Linux

Mini Kube

Minikube هو أداة تسمح بتشغيل Kubernetes بسهولة على جهاز كمبيوتر محلي. يتم استخدامه بشكل أساسي لأغراض التطوير والاختبار. يقوم Minikube بإنشاء مجموعة (Cluster) صغيرة من Kubernetes تحتوي على عقدة واحدة فقط تعمل على جهاز الكمبيوتر الخاص بك. يوفر بيئة مثالية لتجربة Kubernetes وتعلم استخدامه دون الحاجة إلى توفير عدة عقد على خوادم بعيدة.

سنبدأ بتنصيب ال minikube أولا

Kubectl

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

لتنصيب الأداة

يمكنك التأكد من عمل الآداة

Docker

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

لتنصيب الأداة

يمكن تنزيل Docker Desktop for Mac من موقع Docker الرسمي واتباع الإرشادات الموجودة في المثبت.

الآن أنت جاهز للإنطلاق، لنبدأ العمل بتشغيل ال minikube

مع العلم أن الشفرة في الأسفل تحتوي على إضافات مشهورة يمكن إستعمالها في خلال العمليات الخاصة بال Kubernetes

وسيبدأ بتجهيز الأداءة وسيعطيك الأشارة بأنك جاهز للإستعمال

وللتأكد من عمل كل شيء على مرام من خلال تطبيق الأمر التالي

وفي حال كل شيء يعمل على مايرام سيكون هنا نود تشير إلى الماستر أو أنها كونترول بمعنى أنها تدير الكوبرنيتيز

وهذا يظهر لأنها تعمل على جهاز واحد ولكن في الحالة الطبيعية فإن هناك الكثير من النودز تعمل على الكلستر

العمليات الدورية وتجهيز ال Kubernetes

إذا أردت إيقاف ال miniKube يمكنك ذلك من خلال

ويمكنك إعادة تشغيله من خلال

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

الآن لنبدأ بإنشاء أول حاوية “container” وهو يمثل “image” تم تجهيزها مسبقا من خلال  “docker”

يمكنك معرفة تفاصيل البودز والتي تمثل الحاويات التي تم تشغيلها

ولكن ما هو ال Pod

Kubernetes Pod هو أصغر وحدة قابلة للنشر والإدارة في نظام Kubernetes. يمكن تعريف Pod بأنه مجموعة من واحد أو أكثر من الحاويات (مثل Docker containers) التي تشارك نفس الشبكة ومساحة تخزين ومواصفات تشغيل. الحاويات داخل Pod تشغل على نفس العقدة الفعلية أو الافتراضية داخل الكلاستر، مما يسمح لها بالتواصل بسهولة مع بعضها البعض.

في Kubernetes، Pods هي الوحدات الأساسية التي يتم جدولتها على عقد (nodes) الكلاستر. يتم إدارتها بواسطة مكونات أعلى مستوى، مثل ReplicaSets، Deployments، وStatefulSets، التي تدير دورة حياة الPods، بما في ذلك النشر، التحديث، والمقياسة.

ولمعرفة حالة بود معين

يعطيك Kubernetes مجال لتحديد ما إذا كنت تريد تشغيل دائم للحاوية “container” أو تحديد خصائص كيفية تشغيل container وبالتالي فإن هذه الخصائص متعددة، لذلك يقوم container بالتعامل مع ذلك عبر ملفات YML والتي تحوي طبيعة التجهيز اللازم والكثير من الخصائص لضمان تشغيله حسب المطلوب

مثال

ويمكنك تطبيق أي إعدادات من خلال هذه الملفات عبر أمر

وبمجرد فعل ذلك سيقوم الكوبرنيتيز بتجهيز الإعدادات اللازمة حسب المحتوى

أيضا يمكنك تحديد خدمات للبود الواحد وتجهيزها بحيث يمكن إستعمالها داخليا من خلال بودز أخرى أو حتى على مستوى الكلستر كامل

يمكنك بكل تأكيد عمل ذلك كما أسلفنا من خلال YML

يمكن أيضا إستعراض الخدمات

لمعرفة ملف الإعدادات المخصصة ل Pod معين

يمكن معرفة أيضا الفرق بين ملف إعدادات تود تنفيذه وبين ما هو موجود في ال Kubernetes

بالطريقة السابقة يمكنك أيضا معرفة إعدادات أي خدمة أو نوع يدار من خلال ال Kubernetes بمعنى أن الأمر لا يقتصر فقط على ال Pod

يمكن أيضا حذف أي بود أو خدمة أو أي نوع يدار من خلال ال Kubernetes

للحصول على ال IP الخاص بال Minikube بحيث يمكنك أيضا

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

هذه الطريقة مفيدة جدًا لأغراض التطوير والاختبار، حيث يمكنها توفير وصول سريع ومؤقت إلى التطبيقات والخدمات داخل الكلاستر دون الحاجة إلى تعريف وتكوين Ingress أو خدمات مكشوفة (exposed services).

إجراء تعديلات على الإعدادات

سيؤدي تغيير العناصر الأساسية إلى إعادة تشغيل Kubernetes، بينما إذا قمت فقط بتغيير التسمية في yml وتطبيقها فلن يتم إعادة التشغيل، يمكنك تسمية مجموعة من الإعدادات تحت علامة واحدة والتحكم بها كمجموعة `label`

مثلا لمعرفة ال logs الخاصة ببود معين من خلال اسم البود أو من خلال علامة لمعرفة من خلال مجموعة تحمل نفس الlabel

كما يمكن تنفيذ أوامر مباشرة من داخل ال حاوية في ال Pod بمعنى أن تدخل إلى نافذة الأوامر الخاصة بالبود وتفحص أو تنصب أي شيء داخليا

خصائص مهمة لل Kubernetes

العديد من مهام إدارة الخوادم تُسهّل بواسطة Kubernetes؛ فعند حدوث مشكلة في أي من الPods، يتولى Kubernetes إعادة تشغيلها تلقائيًا، حتى في حال أنك قمت مثلا بتحديث ال Pods مثلا فسيقوم هو ذاتيا بإدارة تغييرها مع ضمان بقاء الخدمة دون إنقطاع.

في حالة تلقي Pod لعدد كبير من الطلبات، مما قد يؤدي إلى ضغط عليه، Kubernetes يدخل في الصورة لمعالجة هذا التحدي عبر آلياته الذكية.

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

عزل العناصر في Kubernetes بال namespace

يمكن تعريف خاصية الـ namespace في كوبرنتيس كطريقة لعزل وإدارة الموارد داخل البيئة الواحدة، حيث تسمح بتقسيم موارد النظام إلى أقسام معزولة يمكن التعامل مع كل قسم منها بشكل مستقل. هذا العزل يفيد في توفير بيئات متعددة داخل نفس الكلاستر مثل بيئات الاختبار (testing)، التجهيز (staging)، والإنتاج (production). بالإضافة إلى ذلك، يمكن استخدام الـ namespaces لتنظيم الموارد بحسب الفرق العاملة أو العملاء، مما يساعد في تحسين إدارة الأمان والوصول إلى الموارد، وكذلك في توزيع الموارد بطريقة أكثر فعالية داخل الكلاستر.

لإنشاء namespace جديد يمكنك استخدام الأمر التالي:

هذا الأمر سيقوم بإنشاء namespace يدعى testing. يمكنك استبدال “testing” بأي اسم تفضله للـ namespace الذي تريد إنشاءه.

لرؤية قائمة بجميع الـ namespaces الموجودة في الكلاستر:

إذا أردت تشغيل pod داخل namespace محدد، يمكنك تحديد الـ namespace باستخدام العلامة --namespace مع الأمر. على سبيل المثال، لتشغيل nginx داخل namespace يدعى testing:

الحصول على معلومات حول الموارد في Namespace معين

للحصول على معلومات حول pods في namespace محدد، استخدم:

تطبيق ملف YAML داخل Namespace

إذا كان لديك ملف YAML يحدد resource مثل Deployment أو Service، وتريد تطبيقه داخل namespace محدد، يمكنك استخدام الأمر التالي:

تأكد من أن ملف YAML يحدد الـ namespace بشكل صحيح، أو يمكنك تجاوز الـ namespace المحدد في الملف باستخدام العلامة --namespace.

هذه الأمثلة توضح بعض الطرق الأساسية لاستخدام namespaces في Kubernetes لتنظيم وإدارة الموارد داخل كلاستر Kubernetes بشكل فعال.

إدارة إصدارات Deployment في Kubernetes: التراجع وإعادة الإنتاج

في بيئات Kubernetes، يعد التحكم في إصدارات التطبيقات وإمكانية التراجع عن التحديثات الأخيرة أمرًا حيويًا لضمان الاستقرار والمرونة في النظام. الأوامر التالية توفر آليات للتعامل مع إصدارات Deployment في Kubernetes، مما يسمح بالتراجع عن التغييرات وإعادة بدء الخدمات بكفاءة.

التراجع إلى الإصدار السابق من Deployment

للتراجع بسرعة إلى الإصدار السابق من Deployment في حالة وجود مشاكل بعد التحديث، يمكن استخدام الأمر التالي:

يؤدي تنفيذ هذا الأمر إلى استعادة الإصدار السابق من Deployment دون الحاجة إلى تحديد رقم الإصدار يدويًا، مما يجعله خيارًا سريعًا للتراجع عن التحديثات غير المرغوب فيها.

التراجع إلى إصدار محدد من Deployment

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

ثم، للتراجع إلى إصدار محدد، استخدم العلامة --to-revision مع الأمر التالي:

إعادة بدء Deployment في Namespace معين

لإعادة بدء Deployment في بيئة معينة مثل الإنتاج، يمكن استخدام الأمر التالي، الذي يضمن إعادة تشغيل الخدمات دون تغيير الإعدادات الحالية:

هذا الأمر يقوم بإعادة تشغيل جميع الـ Pods ضمن Deployment المحدد في الـ namespace production، مما يساعد في حالات مثل تحديث الإعدادات السرية أو التغييرات التي تحتاج إلى تطبيق فوري.

هذه الأدوات تعزز مرونة التحكم في التطبيقات داخل Kubernetes، مما يتيح للمديرين تعديل أو استعادة الخدمات بكفاءة وفقًا للمتطلبات العملية.

تعزيز الكفاءة والمرونة في إدارة الحاويات مع Kubernetes

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

عبر استخدام Kubernetes، يمكن للمطورين وفرق العمليات تسريع دورات التطوير والتأكد من استقرار وأمان التطبيقات، حتى في أكثر البيئات تحديًا وتقلبًا. هذا النظام لا يسهل فقط على الشركات توسيع نطاق تطبيقاتها بفعالية، ولكنه يمكّنها أيضًا من تحقيق استجابة أسرع لمتطلبات السوق وتغييراته.

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