本章節主要學習Flannel網絡是如何通信,從而深刻理解從內部到外部,從外部到內部的資源訪問。
一、container-container通信原理解析
這種場景對於Kubernetes來說沒有任何問題,根據Kubernetes的架構設計。Kubernetes創建Pod時,首先會創建一個pause容器,為Pod指派一個唯一的IP位址。然後,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost進行通信。
二、Pod-Pod通信原理解析
flannel會在每一個宿主機上運行名為flanneld代理,其負責為宿主機預先分配一個子網,並為Pod分配IP位址。同時,Flannel使用etcd來存儲網絡配置、分配的子網和主機公共IP等信息。數據包則通過VXLAN、UDP或host-gw等轉發類型的後端機制進行數據轉發。
1、在同一個Node節點中不同Pod間通信
(1)查看k8s-node-1中Pod運行狀態
(2)查看k8s-node-1的IP位址以及路由
(3)查看k8s-node-1中Pod的IP位址
Pod-1:
Pod-2:
(4)測試連通性
2、在不同Node節點間不同Pod間通信
(1)查看Pod運行狀態
(2)查看Node節點上的IP位址:
K8s-Node-1:
K8s-Node-2:
(3)查看k8s-Node-1的Pod-1和k8s-Node-2的Pod-3的IP位址
Pod-1:
Pod-3:
(4)測試連通性
三、Pod-Service通信原理解析
Service是Kubernetes中最核心的概念,正是因為對此概念的支持,Kubernetes在某種角度下可以被看成是一種微服務平臺。Kubernetes中的pod並不穩定,比如由ReplicaSet、Deployment、DaemonSet等副本控制器創建的pod,其副本數量、pod名稱、pod所運行的節點、pod的IP位址等,會隨著集群規模、節點狀態、用戶縮放等因素動態變化。Service是一組邏輯pod的抽象概念,分配一個虛擬網絡,為一組pod提供統一入口,用戶只需與service打交道,service提供DNS解析名稱,負責追蹤pod動態變化並更新轉發表,通過負載均衡算法最終將流量轉發到後端的pod。
創建一個service時,相應會創建一個指向這個service的域名,域名規則為{服務名}.{namespace}.svc.{集群名稱}。全部為iptables維護和轉發。iptables則由kubelet維護。service僅支持udp和tcp協議,所以ping的icmp協議是用不了的,無法ping通service ip。
1、查看DNS
2、查看Pod
3、查看service
4、查看service詳細信息
四、Pod與外部通信原理
1、Pod訪問外部
(1)查看Pod的解析記錄
(2)查看去外網的路由表
(3)測試與外網的連通性
2、外部訪問內部群集
將服務暴露給外部客戶端,以便外部訪問kubernetes群集。方法有很多種,在這裡介紹以下兩種方式以便理解去原理:
(1)將服務的類型設置成NodePort
NodePort 服務是引導外部流量到你的服務的最原始方式。NodePort,正如這個名字所示,在所有節點(虛擬機)上開放一個特定埠,任何發送到該埠的流量都被轉發到對應服務。
(2)將服務的類型設置成LoadBalance
LoadBalancer 服務是暴露服務到 internet 的標準方式。在 GKE 上,這種方式會啟動一個Network Load Balancer,它將給你一個單獨的 IP 地址,轉發所有流量到群集中的服務。kubernetes默認應用此方式。所有通往你指定的埠的流量都會被轉發到對應的服務。它沒有過濾條件,沒有路由等。這意味著你幾乎可以發送任何種類的流量到該服務,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意種類。
這個方式的最大缺點是每一個用LoadBalancer暴露的服務都會有它自己的IP位址,每個用到的LoadBalancer都需要付費,這將是非常昂貴的。
1、查看service相信信息
2、從外部訪問內部Pod資源