Kubernetes集群里有三種IP地址,分別如下:
Node IP:Node節點的IP地址,即物理網卡的IP地址。
Pod IP:Pod的IP地址,即docker容器的IP地址,此為虛擬IP地址。
Cluster IP:Service的IP地址,此為虛擬IP地址。
Node IP
可以是物理機的IP(也可能是虛擬機IP)。每個Service都會在Node節點上開通一個端口,外部可以通過NodeIP:NodePort即可訪問Service里的Pod,和我們訪問服務器部署的項目一樣,IP:端口/項目名
在kubernetes查詢Node IP
1.kubectl get nodes

2.kubectl describe node nodeName

3.顯示出來的InternalIP就是NodeIP
Pod IP
Pod IP是每個Pod的IP地址,他是Docker Engine根據docker網橋的IP地址段進行分配的,通常是一個虛擬的二層網絡
同Service下的pod可以直接根據PodIP相互通信
不同Service下的pod在集群間pod通信要借助於 cluster ip
pod和集群外通信,要借助於node ip
在kubernetes查詢Pod IP
1.kubectl get pods

2.kubectl describe pod podName

Cluster IP
Service的IP地址,此為虛擬IP地址。外部網絡無法ping通,只有kubernetes集群內部訪問使用。
在kubernetes查詢Cluster IP
kubectl -n 命名空間 get Service即可看到ClusterIP

Cluster IP是一個虛擬的IP,但更像是一個偽造的IP網絡,原因有以下幾點
Cluster IP僅僅作用於Kubernetes Service這個對象,並由Kubernetes管理和分配P地址
Cluster IP無法被ping,他沒有一個“實體網絡對象”來響應
Cluster IP只能結合Service Port組成一個具體的通信端口,單獨的Cluster IP不具備通信的基礎,並且他們屬於Kubernetes集群這樣一個封閉的空間。
在不同Service下的pod節點在集群間相互訪問可以通過Cluster IP
三種IP網絡間的通信
service地址和pod地址在不同網段,service地址為虛擬地址,不配在pod上或主機上,外部訪問時,先到Node節點網絡,再轉到service網絡,最后代理給pod網絡。

Kubernetes在其所有節點上開放一個端口給外部訪問(所有節點上都使用相同的端口號), 並將傳入的連接轉發給作為Service服務對象的pod。這樣我們的pod就可以被外部請求訪問到

注:
k8s暴露服務給外部訪問有三種方式,NodePort、LoadBalane、Ingress三種暴露服務的方式,上圖是用了NodePort的方式,缺點是服務一旦多起來,NodePort 在每個節點上開啟的端口數量會極其龐大,難以維護。
