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

Service Discovery

Pod IP يتغير عند إعادة إنشاء Pod. لذلك لا يجب أن يعتمد تطبيق على IP الخاص بـ Pod مباشرة.

الحل هو Service.

لو عندك Service اسمها api داخل Namespace اسمه dev، يمكن الوصول لها بالأسماء:

api
api.dev
api.dev.svc
api.dev.svc.cluster.local

ClusterIP هو النوع الافتراضي من Service. يفتح الخدمة داخل Cluster فقط.

apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector:
app: api
ports:
- port: 80
targetPort: 3000

Service لا يرسل traffic بنفسه بشكل سحري. Kubernetes يربطه بـ Pods المطابقة للـ selector، ويخزن هذه الوجهات في Endpoints أو EndpointSlices.

Terminal window
kubectl get service api
kubectl get endpoints api
kubectl get endpointslices
Terminal window
kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- nslookup api

Lab: اختبار Service name

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

الهدف: التأكد أن Pod يستطيع الوصول إلى Service بالاسم.

شغل Deployment و Service باسم web، ثم نفذ:

Terminal window
kubectl run curl --rm -it --image=curlimages/curl --restart=Never -- curl http://web