انتقل إلى المحتوى الرئيسي

المختبر 1.1 - النشر الأول على Kubernetes

أهداف المختبر​

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

  • نشر أول تطبيق لك على Kubernetes
  • استخدام kubectl لإنشاء الموارد
  • فهم الـ Pods والـ Deployments
  • التحقق من حالة النشر الخاص بك
  • الوصول إلى تطبيقك

المدة المقدرة​

30-45 دقيقة

المتطلبات المسبقة​

  • تثبيت وتكوين kubectl
  • وجود Cluster Kubernetes محلي يعمل (minikube أو kind)
  • اتصال بالإنترنت (لتنزيل صور Docker)

التحقق من البيئة​

قبل البدء، دعونا نتحقق من أن كل شيء جاهز:

# 1. التحقق من kubectl
kubectl version --client

# 2. التحقق من الاتصال بالـ cluster
kubectl cluster-info

# 3. عرض الـ nodes (يجب أن يظهر على الأقل 1 node)
kubectl get nodes

النتيجة المتوقعة:

NAME           STATUS   ROLES           AGE   VERSION
minikube Ready control-plane 5m v1.28.0

إذا رأيت خطأ، عد إلى الفصل 1 لتكوين بيئتك.


الجزء 1: نشر بسيط باستخدام kubectl​

الخطوة 1: إنشاء Pod بسيط​

لنبدأ بإنشاء Pod بسيط يقوم بتشغيل nginx:

kubectl run nginx-pod --image=nginx:latest

التفسير:

  • kubectl run: أمر لإنشاء Pod
  • nginx-pod: اسم الـ Pod
  • --image=nginx:latest: صورة Docker للاستخدام

الخطوة 2: التحقق من الـ Pod​

دعونا نتحقق من أن الـ Pod قد تم إنشاؤه:

kubectl get pods

النتيجة المتوقعة:

NAME        READY   STATUS    RESTARTS   AGE
nginx-pod 1/1 Running 0 30s

تفسير الأعمدة:

  • NAME: اسم الـ Pod
  • READY: عدد الحاويات الجاهزة / العدد الكلي (1/1 = جاهز)
  • STATUS: حالة الـ Pod (Running = قيد التشغيل)
  • RESTARTS: عدد مرات إعادة التشغيل
  • AGE: الوقت منذ الإنشاء

الخطوة 3: الحصول على مزيد من التفاصيل​

لرؤية المزيد من المعلومات حول الـ Pod:

kubectl describe pod nginx-pod

يعرض هذا الأمر:

  • أحداث الـ Pod
  • حالة الحاويات
  • الموارد المخصصة
  • التسميات والتعليقات

الخطوة 4: عرض السجلات​

اطلع على سجلات الـ Pod:

kubectl logs nginx-pod

يجب أن ترى سجلات خادم nginx.

الخطوة 5: تنفيذ أمر داخل الـ Pod​

لنقم بتنفيذ أمر داخل الـ Pod:

kubectl exec -it nginx-pod -- /bin/bash

التفسير:

  • exec: تنفيذ أمر داخل حاوية
  • -it: وضع تفاعلي مع طرفية
  • -- /bin/bash: الأمر المراد تنفيذه

بمجرد الدخول إلى الـ Pod، جرب:

# عرض محتوى الدليل
ls -la

# التحقق من أن nginx يعمل
curl localhost

# الخروج من الـ Pod
exit

الخطوة 6: حذف الـ Pod​

لنقم بحذف الـ Pod الذي أنشأناه للتو:

kubectl delete pod nginx-pod

دعونا نتحقق من أنه قد تم حذفه:

kubectl get pods

الجزء 2: النشر باستخدام ملف YAML​

الآن، لنقم بإنشاء نشر أكثر احترافية باستخدام ملف YAML.

الخطوة 1: إنشاء ملف YAML​

قم بإنشاء ملف nginx-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80

تفسير الملف:

  • apiVersion: إصدار API Kubernetes
  • kind: نوع المورد (Deployment)
  • metadata: البيانات الوصفية (الاسم، التسميات)
  • spec: مواصفات النشر
    • replicas: عدد النسخ (3)
    • selector: كيفية تحديد الـ Pods
    • template: نموذج لإنشاء الـ Pods

الخطوة 2: تطبيق النشر​

لنقم بتطبيق ملف YAML:

kubectl apply -f nginx-deployment.yaml

النتيجة المتوقعة:

deployment.apps/nginx-deployment created

الخطوة 3: التحقق من النشر​

دعونا نتحقق من أن النشر قد تم إنشاؤه:

kubectl get deployments

النتيجة المتوقعة:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment 3/3 3 3 30s

التفسير:

  • READY: 3/3 = 3 Pods جاهزة من 3 مطلوبة
  • UP-TO-DATE: 3 Pods محدثة
  • AVAILABLE: 3 Pods متاحة

الخطوة 4: عرض الـ Pods التي تم إنشاؤها​

النشر قد أنشأ 3 Pods:

kubectl get pods -l app=nginx

النتيجة المتوقعة:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7d4b8c9f5c-abc12 1/1 Running 0 1m
nginx-deployment-7d4b8c9f5c-def34 1/1 Running 0 1m
nginx-deployment-7d4b8c9f5c-ghi56 1/1 Running 0 1m

ملاحظة: أسماء الـ Pods تُنشأ تلقائيًا مع رمز فريد.

الخطوة 5: تفاصيل النشر​

لنحصل على مزيد من المعلومات حول النشر:

kubectl describe deployment nginx-deployment

يعرض هذا الأمر:

  • عدد النسخ
  • استراتيجية النشر
  • الأحداث
  • الشروط

الجزء 3: تعريض التطبيق​

الآن، دعونا نعرض التطبيق للوصول إليه من الخارج.

الخطوة 1: إنشاء خدمة​

قم بإنشاء ملف nginx-service.yaml:

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080

التفسير:

  • kind: Service: إنشاء خدمة
  • type: NodePort: تعريض الخدمة على منفذ لكل node
  • selector: اختيار الـ Pods بالتسمية app: nginx
  • nodePort: 30080: منفذ يمكن الوصول إليه من الخارج

الخطوة 2: تطبيق الخدمة​

kubectl apply -f nginx-service.yaml

الخطوة 3: التحقق من الخدمة​

kubectl get services

النتيجة المتوقعة:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service NodePort 10.96.123.45 <none> 80:30080/TCP 30s

الخطوة 4: الوصول إلى التطبيق​

مع minikube:​

# الحصول على عنوان URL للخدمة
minikube service nginx-service --url

# أو فتح مباشرة في المتصفح
minikube service nginx-service

مع kind:​

# العثور على عنوان IP للـ node
kubectl get nodes -o wide

# الوصول عبر http://<NODE-IP>:30080

اختبار مع curl:​

# من جهازك
curl http://localhost:30080

# أو من داخل Pod
kubectl run curl-test --image=curlimages/curl --rm -it -- curl http://nginx-service

يجب أن ترى الصفحة الرئيسية الافتراضية لـ nginx!


الجزء 4: التوسيع والتحديث​

الخطوة 1: زيادة عدد النسخ​

لنقم بزيادة عدد الـ Pods من 3 إلى 5:

kubectl scale deployment nginx-deployment --replicas=5

دعونا نتحقق:

kubectl get pods -l app=nginx

يجب أن ترى الآن 5 Pods!

الخطوة 2: تقليل عدد النسخ​

لنقم بتقليل العدد إلى 2 Pods:

kubectl scale deployment nginx-deployment --replicas=2

الخطوة 3: تحديث الصورة​

لنقم بتحديث صورة nginx إلى إصدار أحدث:

kubectl set image deployment/nginx-deployment nginx=nginx:1.26

دعونا نتحقق من التحديث:

kubectl rollout status deployment/nginx-deployment

يعرض هذا الأمر تقدم التحديث التدريجي.

الخطوة 4: عرض تاريخ النشر​

kubectl rollout history deployment/nginx-deployment

الخطوة 5: التراجع (اختياري)​

إذا حدث خطأ ما، يمكننا العودة إلى الوراء:

kubectl rollout undo deployment/nginx-deployment

الجزء 5: التنظيف​

لنقم بتنظيف الموارد التي أنشأناها:

# حذف الخدمة
kubectl delete -f nginx-service.yaml

# حذف النشر (يحذف أيضًا الـ Pods)
kubectl delete -f nginx-deployment.yaml

# التحقق من أن كل شيء قد تم حذفه
kubectl get all

ملخص المختبر​

في هذا المختبر، قمت بـ:

إنشاء أول Pod لك باستخدام kubectl
إنشاء نشر باستخدام ملف YAML
تعريض التطبيق باستخدام خدمة NodePort
توسيع النشر (زيادة/تقليل عدد النسخ)
تحديث صورة Docker
تنظيف الموارد


أسئلة للتفكير​

  1. ما الفرق بين Pod و Deployment؟

    • الـ Pod هو مثيل واحد لحاوية
    • الـ Deployment يدير عدة Pods (نسخ) ودورة حياتها
  2. لماذا نستخدم Deployment بدلاً من Pod مباشرة؟

    • الـ Deployment يدير النسخ تلقائيًا
    • يسمح بالتحديثات التدريجية
    • يعيد تشغيل الـ Pods التي تتعطل تلقائيًا
  3. ما هي الخدمة ولماذا نحتاجها؟

    • الخدمة تعرض مجموعة من الـ Pods بشكل ثابت
    • توفر التوازن في التحميل
    • تسمح بالوصول من خارج الـ cluster

الخطوات التالية​

الآن بعد أن قمت بنشر أول تطبيق لك، أنت جاهز لـ:

الفصل 2: استكشاف متعمق للـ Pods
الوحدة 2: هيكلية Kubernetes بالتفصيل


الموارد​


تم إنشاء المختبر في: ديسمبر 2024