本文主要整理一下學習和實踐過程中,外部如何訪問集群內部服務的三種方法,記錄一下實踐的過程和理解。
1. k8s集群中三種IP(NodeIP、PodIP、ClusterIP)介紹
1.1 三種 IP 定義
- NodeIP:Node 節點的 IP 地址,即物理機(虛擬機)的 IP 地址。
- PodIP:Pod 的 IP 地址,即 docker 容器的 IP 地址,此為虛擬 IP 地址。
- ClusterIP:k8s 虛擬的 Service 的 IP 地址,此為虛擬 IP 地址。
1.2 三種 IP 的理解
- Node IP:
是物理機的IP(或虛擬機IP)。每個Service都會在Node節點上開通一個端口,外部可以通過 http://NodeIP:NodePort 即可訪問 Service 里的 Pod 提供的服務。 - Pod IP:
是每個 Pod 的 IP 地址,Docker Engine根據 docker 網橋的 IP 地址段進行分配的,通常是一個虛擬的二層網絡。- 同Service下的pod可以直接根據PodIP相互通信
- 不同Service下的pod在集群間pod通信要借助於 cluster ip
- pod和集群外通信,要借助於node ip
- Cluster IP
是 Service 的 IP 地址,此為虛擬 IP 地址,外部網絡無法 ping 通,只有kubernetes集群內部訪問使用。- Cluster IP僅僅作用於Kubernetes Service這個對象,並由Kubernetes管理和分配P地址 Cluster
- IP無法被ping,他沒有一個“實體網絡對象”來響應 Cluster IP只能結合Service
- Port組成一個具體的通信端口,單獨的Cluster IP不具備通信的基礎,並且他們屬於Kubernetes集群這樣一個封閉的空間。
- 在不同Service下的pod節點在集群間相互訪問可以通過Cluster IP
1.3 三種 IP 關系圖

①:代表外部通過公有雲的 LoadBalancer 負載均衡服務訪問集群內部服務流程
②:代表外部用戶直接訪問集群內部 Service 的 ClusterIP 訪問集群內部服務流程
③:代表集群內部不同 Service 之間的 Pod 服務訪問流程
④:代表集群內部同一個 Service 中 Pod 服務之間訪問流程
2. 客戶端如何從外部訪問集群內部的服務
那么 Pod 和 Service 都是 k8s 集群內部范圍的虛擬概念,所以集群外部客戶端無法通過 Pod 的 IP 地址或者 Service 的虛擬 IP 地址和虛機端口號訪問他們。
那集群外部客戶端如何訪問內部服務呢?
第一種方法:
將 Pod 或 Service 的端口號映射到宿主機,以使客戶端應用能夠通過物理機訪問容器應用。
第二種方法:
通過公有雲的 LoadBalancer 服務負載均衡,以使客戶端從外部訪問集群內部容器應用。
第三種方法(推薦):
使用 k8s 自帶的 Ingress 負載均衡服務,以使客戶端從外部訪問集群內部容器應用。
2.1 (第一種方法)將容器應用的端口直接映射到物理機
2.1.1 將 Pod 容器的端口直接映射到宿主機(不推薦)
- webapp-pod-hostPort.yaml
apiVersion: v1 kind: Pod metadata: name: webapp labels: app: webapp spec: # hostNetwork: true # 網絡模式選擇為使用宿主機網絡,即容器所有的端口都會自動映射到宿主機上 containers: - name: webapp image: tomat ports: - containerPort: 8080 # 容器的運行端口為 8080 hostPort: 8081 # 映射到宿主機的端口為 8081,如果上邊設置了網絡模式,則不需要加 hostPort
- (不推薦)此種方法比較直接,客戶端直接訪問指定的容器服務。即客戶端通過宿主機的 8081 端口即可訪問容器服務, curl :8081 。但是這樣的方式只能訪問指定單一的容器服務,沒有負載均衡,所以不推薦。
2.1.2 將 Service 的端口映射到物理機
- webapp-service-nodePort.yaml
apiVersion: v1 kind: Service metadata: name: webapp spec: type: NodePort # 設置 Service 類型為 NodePort ports: - port: 8080 # 設置 Service 暴露的端口為 8080, 即8080(svc) <-> 80(pod) targetPort: 80 # 設置 Pod 的端口為 8080 nodePort: 30081 # 設置 NodePort 的端口為 30081,即30081(NodePort) <-> 8080(svc) <-> 80(Pod) selector: app: webapp
- Service 包含一組相關的容器,一起來提供服務。
- 將 Service 的端口映射到物理機的端口上,k8s會在每個工作節點上做端口映射,實現負載均衡服務,訪問 curl :30081,NodeIP 可以是集群中任意一個Node節點。
- 如果有 Haproxy 負載均衡服務,ClusterIP + Haproxy 為推薦方式
2.2 (第二種方法)通過 LoadBalancer 訪問集群內部容器服務
待完善 …
2.3(第三種方法)通過 Ingress 訪問集群內部容器服務
待完善 …
-
2.3(第三種方法)通過 Ingress 訪問集群內部容器服務
待完善 …
