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

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 أولا

brew install minikube

Kubectl

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

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

brew install kubectl 

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

kubectl version --client

Docker

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

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

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

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

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

minikube start --addons=dashboard --addons=metric-server --addons="ingress" --addons="ingress-dns" 

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

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

kubectl get nodes

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

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

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

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

minikube stop

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

minikube start 

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

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

Kubectl run —-image=“negix” web

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

Kubectl get pods

ولكن ما هو ال Pod

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

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

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

Kubectl describe pod web 

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

مثال

apiVersion: v1
kind: Pod
metadata:
  name: green
  labels:
    app: blue-green
spec:
  containers:
    - name: green
      image: docker.io/mtinside/blue-green:green

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

Kubectl apply -f “filename” 

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

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

Kubectl expose pod “pod name” --port 8080 --name “your service name”

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

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

kubectl get services

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

Kubectl get pod “Pod Name” -o yaml 
#export the yaml "تصدير كملف"
kubectl get pod web -o yaml > web.yaml

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

kubectl diff -f "file to check what will be changed"

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

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

Kubectl delete TYPE NAME 

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

Mininkube ip

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

Kubectl port-forward “pod name” “localPort”:”remote Port”

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

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

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

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

Kubectl logs “Pod Name”
#By Label
Kubectl logs -l app=“label”

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

kubectl exec -ti "pod name" -- /bin/sh

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

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

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

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

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

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

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

kubectl create namespace testing

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

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

kubectl get namespaces

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

kubectl run nginx --image=nginx --namespace=testing

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

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

kubectl get pods --namespace=testing

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

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

kubectl apply -f deployment.yaml --namespace=staging

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

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

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

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

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

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

kubectl rollout undo deployment/your-deployment-name

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

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

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

kubectl rollout history deployment/your-deployment-name

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

kubectl rollout undo deployment/your-deployment-name --to-revision=revision-number

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

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

kubectl -n production rollout restart deployment/your-deployment-name

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

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

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

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

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

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

شارك هذا الموضوع: