المختبر 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: أمر لإنشاء Podnginx-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
تنظيف الموارد
أسئلة للتفكير
-
ما الفرق بين Pod و Deployment؟
- الـ Pod هو مثيل واحد لحاوية
- الـ Deployment يدير عدة Pods (نسخ) ودورة حياتها
-
لماذا نستخدم Deployment بدلاً من Pod مباشرة؟
- الـ Deployment يدير النسخ تلقائيًا
- يسمح بالتحديثات التدريجية
- يعيد تشغيل الـ Pods التي تتعطل تلقائيًا
-
ما هي الخدمة ولماذا نحتاجها؟
- الخدمة تعرض مجموعة من الـ Pods بشكل ثابت
- توفر التوازن في التحميل
- تسمح بالوصول من خارج الـ cluster
الخطوات التالية
الآن بعد أن قمت بنشر أول تطبيق لك، أنت جاهز لـ:
الفصل 2: استكشاف متعمق للـ Pods
الوحدة 2: هيكلية Kubernetes بالتفصيل
الموارد
- [وثائق kubectl](https://kubernetes.io/docs/reference/kubectl/)
- نشر Kubernetes
- خدمات Kubernetes
تم إنشاء المختبر في: ديسمبر 2024