تخطَّ إلى المحتوى

Services

ستتعلم لماذا نحتاج Service، وكيف تختار بين ClusterIP و NodePort و LoadBalancer، وكيف تشخص مشاكل selector و endpoints.

Pods مؤقتة. Service يعطيك اسم DNS و IP ثابت داخل cluster، ثم يوجه traffic إلى Pods التي تطابق selector.

flowchart LR
C[Client Pod] --> DNS[web.default.svc.cluster.local]
DNS --> S[Service web]
S --> E[EndpointSlices]
E --> P1[Pod web-1]
E --> P2[Pod web-2]

استخدم Deployment من الدرس السابق، ثم أنشئ service.yaml:

apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
labels:
app: web
spec:
type: ClusterIP
selector:
app: web
ports:
- name: http
protocol: TCP
port: 80
targetPort: http

شرح سريع:

الجزءالمعنى
type: ClusterIPService داخلي داخل cluster
selector.app: webيختار Pods التي عندها label app=web
portالمنفذ الذي يتصل به العميل على Service
targetPortالمنفذ داخل Pod أو اسم المنفذ
النوعمتى أستخدمه؟
ClusterIPاتصال داخلي بين التطبيقات داخل cluster
NodePortتجربة محلية أو بيئة بسيطة بدون load balancer
LoadBalancerتعريض خدمة مباشرة عبر cloud load balancer
ExternalNameاسم داخلي يشير إلى DNS خارجي

في Production غالبا تستخدم ClusterIP خلف Ingress أو Gateway، وليس NodePort مباشرة.

Terminal window
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get svc web
kubectl get endpoints web
kubectl get endpointslices -l kubernetes.io/service-name=web

Expected output:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web ClusterIP 10.96.120.10 <none> 80/TCP 20s
NAME ENDPOINTS AGE
web 10.244.0.10:80,10.244.0.11:80 20s

اختبار Service من داخل cluster

Section titled “اختبار Service من داخل cluster”
Terminal window
kubectl run curl --rm -it --image=curlimages/curl:8.10.1 --restart=Never -- curl -s http://web

Expected output:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
flowchart TD
A[Service لا يعمل] --> B{هل endpoints موجودة؟}
B -->|لا| C[راجع selector و labels]
B -->|نعم| D{هل port صحيح؟}
D -->|لا| E[راجع port و targetPort]
D -->|نعم| F[افحص التطبيق و NetworkPolicy]
المشكلةأمر التشخيصالحل
لا توجد endpointskubectl get endpoints webطابق selector مع labels الخاصة بالـ Pods
connection refusedkubectl describe svc webتأكد من targetPort والمنفذ داخل container
DNS لا يعملkubectl exec داخل Pod ثم nslookup webافحص CoreDNS و namespace
يعمل داخليا ولا يعمل خارجياkubectl get ingress أو kubectl get gatewayراجع Ingress/Gateway وليس Service فقط

Lab: Service داخلي لتطبيق web

المستوى: مبتدئ الوقت: 35 دقيقة الأدوات: kubectl

الهدف: إنشاء Service يوجه traffic إلى Deployment، ثم اختبار الاتصال من Pod مؤقت.

  • Deployment باسم web يعمل بثلاث Pods.
  • labels في Pods تحتوي app: web.
  1. احفظ YAML في service.yaml.
  2. طبق Service:
Terminal window
kubectl apply -f service.yaml
kubectl get svc web
  1. تأكد من endpoints:
Terminal window
kubectl get endpoints web
  1. اختبر الاتصال:
Terminal window
kubectl run curl --rm -it --image=curlimages/curl:8.10.1 --restart=Never -- curl -s http://web
  1. غيّر selector عمدا إلى app: wrong وطبق الملف، ثم راقب endpoints:
Terminal window
kubectl apply -f service.yaml
kubectl get endpoints web
  1. أعد selector إلى app: web.

قبل الخطأ:

web 10.244.0.10:80,10.244.0.11:80,10.244.0.12:80

بعد الخطأ:

web <none>
Terminal window
kubectl delete -f service.yaml

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

في كل المشاريع ستستخدم Services داخلية بين frontend و backend و database. Ingress سيقف أمام frontend أو API، أما Service فسيظل طبقة التوجيه الداخلية.