現在我有三個 Pod 在跑,但真的要連它們的時候問題就來了。Pod 的 IP 是動態的,自癒重建會換一個,昨天做滾動更新更是整批換掉,所以拿 Pod IP 當入口這件事不成立
Service 就是來解這個問題的。它是一個固定不動的入口,後面掛哪些 Pod 由 selector 決定,Pod 換了它自己會跟上
service.yaml
apiVersion: v1
kind: Service
metadata:
name: web
namespace: ithome-lab
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 80
kubectl apply -f manifests/base/service.yaml
kubectl get service -n ithome-lab

那個 CLUSTER-IP 就是固定入口。它是虛擬的,不對應任何一台實體機器,K8s 在每個節點上做轉發,把打到這個 IP 的流量導去後面的 Pod
kubectl get endpointslices -n ithome-lab

EndpointSlice 記錄的是這個 Service 現在實際指到哪些 Pod。Service 本身並沒有記住 Pod 清單,是另外有個控制器一直拿 selector 去比對 Label,比對到的 Pod IP 就寫進 EndpointSlice
這件事為什麼重要,因為 Service 的 selector 打錯字的時候,get service 看起來完全正常,CLUSTER-IP 也還在,只有 EndpointSlice 會是空的。
先確認現在是通的
kubectl port-forward -n ithome-lab service/web 8080:80

一樣是 port-forward,但這次接的是 service/web 而不是某一個特定的 Pod。不過要注意,port-forward 只是幫你從目前的 Pod 裡面挑一個出來打,挑定之後整個 session 都固定連同一個,那個 Pod 沒了 session 就直接斷掉,它本身沒有負載平衡這回事。真正會依 selector 分散到不同 Pod 的,是叢集內部走 ClusterIP 的流量,也就是下面這個做法
叢集內部要連的話還有更方便的方式,因為 Service 會有 DNS 名稱
kubectl run tmp -n ithome-lab --rm -it --image=curlimages/curl -- sh
curl http://web
curl http://web.ithome-lab.svc.cluster.local

那個 --rm 是離開的時候順便把這個 Pod 刪掉,-it 進互動模式。同一個 namespace 裡面直接用 Service 名字就連得到,跨 namespace 才需要寫完整的那一長串。測完打 exit,Pod 就會自己清掉
今天到這裡,明天見 :D

學長!我9/21有在您的文章下面留幾個問題,若學長有空的話請再幫我撥冗回覆,謝謝學長!
學長別鬧了


為什麼不行QAQ