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

المختبر 7.4 - الحاويات التمهيدية و Sidecars

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

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

  • فهم مفهوم الحاوية التمهيدية.
  • إنشاء Pods مع حاويات تمهيدية.
  • استخدام الحاويات التمهيدية لتحضير البيئة.
  • فهم نمط Sidecar.
  • تنفيذ نمط Sidecar لتسجيل الأحداث.

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

45-60 دقيقة

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

  • تثبيت وتكوين kubectl.
  • وجود عنقود Kubernetes محلي يعمل (minikube أو kind).
  • معرفة بالحاويات التمهيدية و Sidecars (الفصل 7.4).

الجزء 1: فهم الحاويات التمهيدية​

تعمل الحاويات التمهيدية قبل الحاويات الرئيسية في Pod. وهي مفيدة لـ:

  • تهيئة البيانات أو التكوينات
  • انتظار جاهزية التبعيات
  • تحضير البيئة قبل بدء التطبيق

الخصائص:​

  • تعمل بشكل تسلسلي (واحدة تلو الأخرى)
  • يجب أن تنجح جميعها قبل بدء الحاويات الرئيسية
  • لديها وصول إلى نفس الأحجام مثل الحاويات الرئيسية

الجزء 2: إنشاء Pod مع حاوية تمهيدية​

سنقوم بإنشاء Pod مع حاوية تمهيدية تحضر الملفات قبل بدء التطبيق.

الخطوة 2.1: إنشاء Pod مع حاوية تمهيدية​

أنشئ ملف pod-init-container.yaml:

# pod-init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-with-init
spec:
volumes:
- name: shared-data
emptyDir: {} # حجم مشترك بين الحاوية التمهيدية والحاوية الرئيسية
initContainers:
- name: init-setup
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "حاوية تمهيدية: تحضير البيئة..."
echo "تم تهيئة التكوين" > /shared/config.txt
echo "تم تحضير البيانات" > /shared/data.txt
echo "انتهت الحاوية التمهيدية بنجاح"
volumeMounts:
- name: shared-data
mountPath: /shared
containers:
- name: app-container
image: nginx:1.20
command: ["/bin/sh", "-c"]
args:
- |
echo "التطبيق: قراءة الملفات المحضرة بواسطة الحاوية التمهيدية"
cat /shared/config.txt
cat /shared/data.txt
echo "تم بدء التطبيق"
nginx -g "daemon off;"
volumeMounts:
- name: shared-data
mountPath: /shared
ports:
- containerPort: 80

التفسير:

  • تحضر الحاوية التمهيدية الملفات في الحجم المشترك.
  • تقرأ الحاوية الرئيسية هذه الملفات بعد البدء.

طبق الـ Pod:

kubectl apply -f pod-init-container.yaml

الخطوة 2.2: التحقق من التنفيذ​

تحقق من حالة الـ Pod:

kubectl get pods app-with-init

يجب أن ترى الـ Pod يمر بالمراحل:

  1. Init:0/1 (الحاوية التمهيدية قيد التشغيل)
  2. PodInitializing
  3. Running (الحاوية الرئيسية بدأت)

تحقق من سجلات الحاوية التمهيدية:

kubectl logs app-with-init -c init-setup

تحقق من سجلات الحاوية الرئيسية:

kubectl logs app-with-init -c app-container

يجب أن ترى أن الحاوية الرئيسية قرأت الملفات التي أنشأتها الحاوية التمهيدية.


الجزء 3: حاوية تمهيدية مع انتظار التبعية​

يمكن للحاويات التمهيدية انتظار توفر الخدمات الخارجية.

الخطوة 3.1: إنشاء Pod ينتظر خدمة​

أنشئ ملف pod-init-wait.yaml:

# pod-init-wait.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-wait-service
spec:
initContainers:
- name: wait-for-service
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "انتظار توفر الخدمة..."
until nslookup kubernetes.default.svc.cluster.local; do
echo "الخدمة غير متوفرة، انتظار..."
sleep 2
done
echo "الخدمة متوفرة!"
containers:
- name: app-container
image: busybox:1.35
command: ["/bin/sh", "-c"]
args: ["echo 'تم بدء التطبيق بعد التحقق من الخدمة' && sleep 3600"]

طبق الـ Pod:

kubectl apply -f pod-init-wait.yaml

تحقق من سجلات الحاوية التمهيدية:

kubectl logs app-wait-service -c wait-for-service

الجزء 4: نمط Sidecar​

الـ Sidecar هو حاوية مساعدة تعمل في نفس الـ Pod مع الحاوية الرئيسية لتوفير وظائف مكملة (التسجيل، المراقبة، البروكسي، إلخ).

الخطوة 4.1: إنشاء Pod مع نمط Sidecar للتسجيل​

أنشئ ملف pod-sidecar-logging.yaml:

# pod-sidecar-logging.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
volumes:
- name: shared-logs
emptyDir: {} # حجم مشترك للسجلات
containers:
- name: app-container
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
counter=0
while true; do
echo "[$(date)] Log entry $counter from application" >> /logs/app.log
counter=$((counter+1))
sleep 5
done
volumeMounts:
- name: shared-logs
mountPath: /logs
- name: log-collector
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Sidecar: جمع سجلات التطبيق..."
while true; do
if [ -f /logs/app.log ]; then
echo "=== سجلات جديدة ==="
tail -n 5 /logs/app.log
fi
sleep 10
done
volumeMounts:
- name: shared-logs
mountPath: /logs
readOnly: true # يقرأ الـ sidecar فقط السجلات

التفسير:

  • تكتب الحاوية الرئيسية السجلات في حجم مشترك.
  • يقرأ الـ sidecar هذه السجلات ويعالجها (هنا، يعرضها).

طبق الـ Pod:

kubectl apply -f pod-sidecar-logging.yaml

الخطوة 4.2: التحقق من نمط Sidecar​

تحقق من أن الحاويتين تعملان:

kubectl get pods app-with-sidecar

تحقق من سجلات الحاوية الرئيسية:

kubectl logs app-with-sidecar -c app-container

تحقق من سجلات الـ sidecar:

kubectl logs app-with-sidecar -c log-collector

يجب أن ترى الـ sidecar يعرض السجلات المجمعة من الحاوية الرئيسية.


الجزء 5: Sidecar للمراقبة​

لنقم بإنشاء مثال آخر مع sidecar للمراقبة.

الخطوة 5.1: إنشاء Pod مع Sidecar للمراقبة​

أنشئ ملف pod-sidecar-monitoring.yaml:

# pod-sidecar-monitoring.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-monitored
spec:
containers:
- name: app-container
image: nginx:1.20
ports:
- containerPort: 80
- name: metrics-collector
image: busybox:1.35
command: ["/bin/sh", "-c"]
args:
- |
echo "Sidecar: جمع المقاييس..."
while true; do
# محاكاة جمع المقاييس
echo "[$(date)] مقاييس مجمعة: CPU، Memory، Network"
sleep 15
done

طبق الـ Pod:

kubectl apply -f pod-sidecar-monitoring.yaml

تحقق من سجلات الـ sidecar:

kubectl logs app-monitored -c metrics-collector

الجزء 6: فوائد الأنماط​

الحاويات التمهيدية:​

  • فصل الاهتمامات: التحضير مقابل التنفيذ
  • ترتيب مضمون: تعمل قبل الحاويات الرئيسية
  • إعادة الاستخدام: نفس الحاوية التمهيدية لعدة Pods

Sidecars:​

  • التماسك: الحاويات في نفس الـ Pod تشارك الشبكة والتخزين
  • المرونة: إضافة وظائف دون تعديل التطبيق الرئيسي
  • العزل: يمكن لكل حاوية أن يكون لها مواردها الخاصة

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

احذف الـ Pods التي تم إنشاؤها:

kubectl delete pod app-with-init app-wait-service app-with-sidecar app-monitored

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

في هذا المختبر، استكشفت الحاويات التمهيدية ونمط Sidecar. تعلمت كيفية استخدام الحاويات التمهيدية لتحضير البيئة قبل بدء التطبيقات، وتنفيذ sidecars للتسجيل والمراقبة، وفهم فوائد هذه الأنماط لهندسة التطبيقات.


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

هذه الوحدة حول الأحمال المتقدمة الآن مكتملة. يمكنك الانتقال إلى الوحدة 8 حول Ingress و Load Balancing.

الوحدة 8: Ingress و Load Balancing


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