在Kubernetes中,Service和Endpoints是兩個重要的概念,它們之間存在著密切的關係。
-
Service:Service是Kubernetes中用於定義一組Pod的訪問方式的抽象。透過建立Service,可以為一組具有相同標籤的Pod提供統一的訪問入口,使得客戶端可以透過Service來訪問這些Pod,而無需瞭解其具體的IP地址和埠號。Service透過標籤選擇器(selector)來選擇匹配的Pod,並將請求轉發到這些Pod上。
-
Endpoints:Endpoints是Kubernetes中的另一個資源物件,它儲存了與一個Service相關聯的實際後端Pod的列表和對應的網路終結點資訊(即IP地址和埠號)。當Service被建立時,Kubernetes會自動管理Endpoints物件,將與Service標籤選擇器匹配的Pod的IP地址和埠號資訊儲存在Endpoints中。
因此,Service和Endpoints之間的關係可以總結為:Service定義了一組Pod的訪問方式
,而Endpoints則儲存了這些Pod的實際網路終結點資訊
,Service透過Endpoints來實現對後端Pod的負載均衡和代理轉發。
ingress,service,endpoints和pod四者關係
在這個示意圖中,Ingress定義了對外部流量的訪問規則,包括主機名(host)和路徑(path)等。Ingress透過指向一個Service來實現流量的轉發。Service根據自身的selector選擇與之匹配的Pod,並將請求轉發到這些Pod上。Endpoints儲存了與Service相關聯的後端Pod的IP地址和埠資訊,而Pod則是應用程式執行的實際容器。
因此,Ingress定義了對外部流量的訪問規則,Service提供了對後端Pod的訪問入口,Endpoints儲存了這些後端Pod的網路終結點資訊,而Pod是應用程式實際執行的地方。
endpoint顯示的ip是誰的?
Pod在Kubernetes中是有自己的IP地址的,這個IP地址通常由Kubernetes的網路外掛(如Calico、Flannel等)負責分配和管理。每個Pod都會被分配一個獨立的IP地址,用於在叢集內部進行通訊。
而Endpoints物件儲存的是與Service關聯的後端Pod的IP地址和埠資訊,它記錄了Service需要代理的實際後端Pod的網路終結點資訊。Endpoints並不儲存所有Pod的IP地址,而是僅儲存與特定Service相關聯的Pod的IP地址和埠資訊。
因此,可以說Pod具有自己的IP地址,並且Endpoints物件儲存了與Service相關的Pod的IP地址和埠資訊。
- 這是一個pod的資訊
[root@lind~]# kubectl describe pod envoy-deployment-786c44794b-rb6wm -n=default
Name: envoy-deployment-786c44794b-rb6wm
Namespace: default
Priority: 0
Node: 192.168.60.1/192.168.60.1
Start Time: Tue, 19 Dec 2023 09:54:24 +0800
Labels: app=envoy
pod-template-hash=786c44794b
workloadID_ingress-10aa232e236bc59c6a7d7d59053154a8=true
workloadID_ingress-c7fdea094d8b2ab0912781e0867ce277=true
Annotations: cattle.io/timestamp: 2023-12-19T01:54:22Z
cni.projectcalico.org/podIP: 10.42.0.150/32
cni.projectcalico.org/podIPs: 10.42.0.150/32
field.cattle.io/ports:
- 這是對應的endpoint的資訊
[root@lind~]# kubectl get endpoints -n=default
NAME ENDPOINTS AGE
envoy-service 10.42.0.150:9901,10.42.0.150:10000 70d
- 這是對應的service的資訊
[root@lind~]# kubectl get svc -n=default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
envoy-service NodePort 10.43.189.206 <none> 9901:25568/TCP,10000:13908/TCP 70d
- 這是對應的ingress的資訊
[root@lind~]# kubectl get ingress -n=default
NAME CLASS HOSTS ADDRESS PORTS AGE
envoy-final-kc <none> test.xxx.com 192.168.60.2,192.168.60.3,192.168.60.4 80 13d
好了,今天的k8s四壯士的文章就寫到這裡吧,感謝閱讀!