آموزش کوبرنتیز؛ شب پنجم: Service و EndpointSlice¶
Podها موقتیاند و IP آنها ممکن است تغییر کند. امشب با یک Service، آدرس IP و نام DNS پایداری مقابل 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 این فرمانها را اجرا کنید:
نام کوتاه در همان 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 را تشخیص داده و تعمیر کردهام.