پرش به محتویات

آموزش کوبرنتیز؛ شب پنجم: Service و EndpointSlice

Podها موقتی‌اند و IP آن‌ها ممکن است تغییر کند. امشب با یک Service، آدرس IP و نام DNS پایداری مقابل Podهای در حال تغییر قرار می‌دهیم:

Client → Service DNS/ClusterIP → EndpointSlice → Selected Pod

راه‌اندازی آزمایش

فایل web.yaml شامل یک Deployment و یک Service است:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: course-night-5
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          ports:
            - name: http
              containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: course-night-5
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
    - name: http
      port: 80
      targetPort: http

منابع را بسازید:

kubectl create namespace course-night-5
kubectl apply -f web.yaml
kubectl rollout status deployment/web --namespace course-night-5
kubectl get pods,services,endpointslices --namespace course-night-5 -o wide

Labelهای Pod را با Selector سرویس مقایسه کنید:

kubectl get pods --namespace course-night-5 --show-labels
kubectl get service web --namespace course-night-5 \
  -o jsonpath='{.spec.selector}{"\n"}'
kubectl get endpointslices --namespace course-night-5 \
  -l kubernetes.io/service-name=web -o yaml

Service به کمک Selector، Podهای مقصد را پیدا می‌کند و EndpointSlice آدرس Endpointهای انتخاب‌شده را نگه می‌دارد. port درگاه Service و targetPort درگاه مقصد در Pod است.

آزمایش Service Discovery پایدار

یک Client موقت بسازید:

kubectl run curl \
  --namespace course-night-5 \
  --rm -it \
  --restart=Never \
  --image=curlimages/curl \
  -- sh

داخل Container این فرمان‌ها را اجرا کنید:

nslookup web
nslookup web.course-night-5.svc.cluster.local
curl -I http://web
exit

نام کوتاه در همان Namespace کار می‌کند. نام کامل Service یا FQDN در سراسر کلاستر قابل استفاده است، مگر آن‌که Policy شبکه جلوی ترافیک را بگیرد.

پایداری هنگام جایگزینی Pod

kubectl get pods --namespace course-night-5 -o wide
kubectl delete pod <one-pod-name> --namespace course-night-5
kubectl get pods,endpointslices --namespace course-night-5 --watch

ممکن است Pod جایگزین IP دیگری بگیرد، اما نام Service و ClusterIP ثابت می‌مانند. با Ctrl+C مشاهده را متوقف کنید.

تمرین خرابی Selector

Selector سرویس را عمداً خراب کنید:

kubectl patch service web \
  --namespace course-night-5 \
  --type merge \
  --patch '{"spec":{"selector":{"app":"does-not-exist"}}}'

kubectl get endpointslices --namespace course-night-5 \
  -l kubernetes.io/service-name=web
kubectl describe service web --namespace course-night-5

از Client موقت، شکست اتصال را ببینید:

kubectl run curl \
  --namespace course-night-5 \
  --rm -it \
  --restart=Never \
  --image=curlimages/curl \
  -- curl --max-time 5 -I http://web

Selector را تعمیر و Endpointها را دوباره بررسی کنید:

kubectl patch service web \
  --namespace course-night-5 \
  --type merge \
  --patch '{"spec":{"selector":{"app":"web"}}}'

kubectl get endpointslices --namespace course-night-5 \
  -l kubernetes.io/service-name=web

چک‌لیست پایان

  • ClusterIP، Selector، Target Port و EndpointSlice را توضیح می‌دهم.
  • Service را از طریق DNS پیدا کرده و به آن وصل شده‌ام.
  • هنگام تغییر IP یک Pod، پایداری Service را دیده‌ام.
  • Selector بدون Endpoint را تشخیص داده و تعمیر کرده‌ام.
kubectl delete namespace course-night-5