ملخص الأوامر - خدمات Kubernetes

2 دقيقة

المشروع projet11-kubernetes-services · كل الأوامر للنشر والعرض واختبار الخدمات.

جدول المحتويات


1. بناء الصورة والنشر

من مجلد المشروع (projet11-kubernetes-services):

powershell
kubectl config use-context docker-desktop
docker build -t demo-k8s:1.0 ./app          # (إن لم تُبنَ بعد في المشروع 10)
kubectl apply -f k8s/                        # deployment + 3 خدمات
kubectl get pods                             # 3 Pods Running

2. مراقبة الخدمات

powershell
kubectl get svc                              # TYPE، CLUSTER-IP، EXTERNAL-IP، PORT(S)
kubectl get svc -o wide
kubectl describe svc demo-clusterip          # تفاصيل + Endpoints

قراءة kubectl get svc:

العمودالمعنى
TYPEClusterIP / NodePort / LoadBalancer
CLUSTER-IPIP داخلي (حاضر دائماً)
EXTERNAL-IPIP خارجي (LoadBalancer) أو <none>
PORT(S)port الخدمة (و :nodePort لـ NodePort)

3. ClusterIP: اكتشاف الخدمات (DNS)

ClusterIP غير قابل للوصول من المضيف: يُستدعى من Pod، باسمه.

powershell
# Pod عميل يُرمى (--rm : يُحذف عند الخروج)
kubectl run client --rm -it --image=curlimages/curl -- sh

ثم، في صدفة الـ Pod:

sh
curl http://demo-clusterip           # استدعاء بالاسم (يحله CoreDNS)
curl http://demo-clusterip           # أعد التشغيل: يتغيّر اسم الـ Pod
exit

اختبار حل DNS:

powershell
kubectl run dnstest --rm -it --image=busybox:1.36 -- sh
# في الـ Pod:
nslookup demo-clusterip
wget -qO- http://demo-clusterip

4. NodePort: وصول خارجي

powershell
kubectl get svc demo-nodeport
# افتح في المتصفح:
start http://localhost:30082
# أو اختبر من سطر الأوامر:
curl http://localhost:30082

5. LoadBalancer: IP خارجي

powershell
kubectl get svc demo-lb                      # يجب أن يصير EXTERNAL-IP "localhost"
start http://localhost:8090
curl http://localhost:8090

إن بقي EXTERNAL-IP على <pending>، انتظر بضع ثوانٍ (يوفّر Docker Desktop الـ LB). في عنقود kind يبقى نوع LoadBalancer على <pending> بلا MetalLB: استخدم kubectl port-forward (انظر الملحق).


6. Endpoints والمُنتقيات

powershell
kubectl get endpoints demo-clusterip         # عناوين IP للـ Pods خلف الخدمة
kubectl get pods -o wide --show-labels       # وسوم الـ Pods
kubectl get pods --selector app=demo-back    # الـ Pods نفسها التي ينتقيها الخدمة

رؤية التوزيع (10 طلبات عبر port-forward):

powershell
kubectl port-forward svc/demo-clusterip 8091:80
# في طرفية أخرى:
1..10 | ForEach-Object { (Invoke-WebRequest -Headers @{Accept="application/json"} http://localhost:8091).Content }

7. التنظيف

powershell
kubectl delete -f k8s/
# أو حسب الكائن:
kubectl delete svc demo-clusterip demo-nodeport demo-lb
kubectl delete deployment demo-back

الملحق — استكشاف الأخطاء

العَرَضالسبب المحتملالحل
يفشل curl http://demo-clusteripليس من Pod، أو الخدمة غائبةالاستدعاء من Pod؛ تحقق من kubectl get svc
Endpoints فارغةالمُنتقي لا يطابق أي وسم Podمحاذاة selector (الخدمة) و labels (الـ Pods)
EXTERNAL-IP على <pending>لا موزّع حمل (kind، سحابة غير مضبوطة)Docker Desktop: انتظر؛ وإلا kubectl port-forward
localhost:30082 غير متاحNodePort غير منشأة / منفذ مشغولkubectl get svc demo-nodeport؛ غيّر nodePort
ImagePullBackOffالصورة demo-k8s:1.0 غائبة عن العنقودابنِها؛ في kind: kind load docker-image demo-k8s:1.0
powershell
# حل عام لوصول مؤقت إلى أي خدمة:
kubectl port-forward svc/demo-clusterip 8091:80   # -> http://localhost:8091

دورة من إعداد د. هيثم رحومة — تطوير ونشر حلول البيانات