Kubernets學習筆記:Flannel

Kubernets學習筆記:Flannel

今天來大概來寫下pod內容器是如何通信的,K8s裡的容器都存在於Pod中,容器之間的通信分為三種類型:

Pod訪問Service服務

其通過暴露主機IP和端口的形式進行通訊,Service分配的ip叫cluster ip是一個虛擬ip(相對固定,除非刪除service),這個ip只能在k8s集群內部使用,如果service需要對外提供,只能使用Nodeport方式映射到主機上,使用主機的ip和端口對外提供服務。

Pod內部容器之間

這種情況下容器通訊比較簡單,因為pod內部的容器是共享網絡空間的,所以容器直接可以使用localhost訪問其他容器。k8s在啟動容器的時候會先啟動一個Pause容器,這個容器就是實現這個功能的:每個Pod裡運行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此他們之間通信和數據交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。

Pod與Pod容器之間

此種類型又分為兩種情況:

兩個pod在一臺節點上:此時是利用docker默認的自身網橋方式互連容器的。

兩個pod在不同節點上:這種情況k8s官方推薦的是使用flannel組建一個大二層扁平網絡,pod的ip分配由flannel統一分配,通訊過程也是走flannel的網橋方式。

Flannel工作原理

默認的節點間數據通信方式是UDP轉發,在Flannel的GitHub頁面有如下的一張原理圖:(有點像GRE通用路由封裝)

Kubernets學習筆記:Flannel

簡單的說flannel做了三件事情:

1. 數據從源容器中發出後,經由所在主機的docker0虛擬網卡轉發到flannel0虛擬網卡,這是個P2P的虛擬網卡,flanneld服務監聽在網卡的另外一端。 Flannel也是通過修改Node的路由表實現這個效果的。

2. 源主機的flanneld服務將原本的數據內容UDP封裝後根據自己的路由表投遞給目的節點的flanneld服務,數據到達以後被解包,然後直接進入目的節點的flannel0虛擬網卡,然後被轉發到目的主機的docker0虛擬網卡,最後就像本機容器通信一樣由docker0路由到達目標容器。

3. 使每個結點上的容器分配的地址不衝突。Flannel通過Etcd分配了每個節點可用的IP地址段後,再修改Docker的啟動參數。“--bip=X.X.X.X/X”這個參數,它限制了所在節點容器獲得的IP範圍。

看看下邊的實例:

Kubernets學習筆記:Flannel

1. 在發送端節點node1上,數據請求從 nginx 容器(10.0.46.2:2379)中發出後,首先經由所在主機的docker0虛擬網卡(10.0.46.1)轉發到flannel0虛擬網卡(10.0.46.0)。

2. 接著 flannel 服務將原本的數據內容UDP封裝後根據自己的路由表投遞給目的節點的flanneld服務。在此包中,包含有outer-ip(source:192.168.8.227 dest:192.168.8.228),還有inner-ip(source:10.0.46.2:2379 dest:10.0.90.2:8080)等數據信息。

3. 然後在接收端節點node2上,數據到達以後被解包,直接進入目的節點的flannel0虛擬網卡中(10.0.90.0),且被轉發到目的主機的docker0虛擬網卡(10.0.90.1),最後就像本機容器通信一樣由docker0路由到達目標 tomcat 容器(10.0.90.2:8080)。


分享到:


相關文章: