一、k8s 網絡概述
-
Kubernetes網絡是指在Kubernetes集群中不同組件之間進行通信和交互的網絡架構,每個容器都有自己的IP地址,這些容器組成了Pod,Pod是Kubernetes調度的最小單元。
-
Pod是Kubernetes中最小的部署單元,每個Pod都有一個唯一的IP地址,Pod內的容器共享該IP地址和網絡命名空間,pod間通信可以使用多種技術,如Kubernetes默認的CNI插件:Flannel、Calico 等。
二、flannel 網絡插件
flannel 網絡通信規則
1、 pod 內部容器之間的通信
-
在Pod內部,容器之間可以通過共享網絡命名空間進行通信。所有容器共享Pod的IP地址和網絡命名空間,它們可以使用localhost或Pod的IP地址進行通信。可以通過在Pod的配置文件中指定容器之間的端口映射來定義容器之間的通信方式。
-
例如,在一個Pod中有兩個容器A和B,A需要向B發送HTTP請求。可以在Pod的配置文件中為容器A和容器B分別指定端口號,然后在容器A中使用localhost和容器B的端口號進行通信。容器B在接收到請求后可以返回HTTP響應。
2、同一主機不同 pod 之間的通信
-
Pod A 發送數據到 Pod B
-
?數據包通過Pod A的veth接口到達宿主節點
-
?數據包經由節點的虛擬網橋(如cni0)到達Pod B
3、不同主機上 pod 間通信
-
Pod A 發送數據到目標Pod(在另一節點上)
-
?數據包經過veth接口到達宿主節點
-
?flanneld對數據包進行VXLAN封裝
-
?封裝后的數據包通過底層網絡傳輸到目標節點
-
?目標節點的flanneld解封裝數據包,并將其路由到目標Pod
?優點
-
結構清晰,易于排查
-
?對系統資源占用較低
?缺點
-
數據包在出節點的情況下,需要發生三次的內核與用戶空間拷貝,代價較高
三、calico 網絡插件
calico 網絡通信規則
-
Calico的特點就是把每個宿主機當中一個虛擬路由器建立與物理網絡對等的虛擬網絡,該模式BGP協議在網絡中通告路由信息,巧妙的把二層網絡轉換成三層路由網絡,避免報文被二次封裝數據轉發效率很高,Pod IP可以在物理網絡中全局路由
calico 包含組件:
-
Felix:每個節點都要運行的calico agent,負責配置節點上的路由信息和ACL
-
ETCD:配置中心,主要負責網絡元數據一致性,確保Calico網絡狀態的準確性
-
BGP Client(BIRD):主要負責把Felix配置的路由信息分發到當前Calico網絡,確保節點間能夠進行三層通信
1、 pod 內部容器之間的通信
-
在Pod內部,容器之間可以通過共享網絡命名空間進行通信。所有容器共享Pod的IP地址和網絡命名空間,它們可以使用localhost或Pod的IP地址進行通信。可以通過在Pod的配置文件中指定容器之間的端口映射來定義容器之間的通信方式。
-
例如,在一個Pod中有兩個容器A和B,A需要向B發送HTTP請求。可以在Pod的配置文件中為容器A和容器B分別指定端口號,然后在容器A中使用localhost和容器B的端口號進行通信。容器B在接收到請求后可以返回HTTP響應。
2、同一主機不同 pod 之間的通信
-
Pod A 發送數據到 Pod B(同一節點)
-
?數據包通過veth接口進入宿主機
-
?Felix配置的路由規則直接將數據包路由到Pod B
?3、不同主機上 pod 間通信
-
Pod A 發送數據到目標Pod(另一節點)
-
?數據包到達宿主機,BGP通告的路由規則將數據包直接發送到目標節點
-
?目標節點將數據包路由到目標Pod
優點
-
高性能:Direct Routing模式避免了封裝開銷
-
?網絡策略控制:支持復雜的安全策略,提供強大的流量控制能力
-
?靈活性:支持多種模式,適配不同的網絡需求
-
?穩定性強,效率高
缺點
-
排查錯誤困難,安裝和管理需要一定經驗
參考文檔:
K8S網絡插件(CNI):Flannel和Calico詳細對比 - 墨天輪
k8s CNI組件flannel 和calico 網絡原理 - 三木燕 - 博客園