Kubernetes學習4--容器之間通訊方式及Flannel工作原理
阿新 • • 發佈:2019-02-19
接著上一篇的建立完pod後,自然會考慮到容器之間的通訊方式,也整理總結其通訊方式並介紹下Flannel的工作原理。
一. 容器之間通訊方式
k8s裡面容器是存在於pod裡面的,所以容器之間通訊,一般分為三種類型:(1) pod 訪問service服務
(2) pod內部容器之間
(3) pod 與 pod 容器之間
1. pod 訪問service服務
此方式在上篇文章介紹過,其通過暴露主機IP和埠的形式進行通訊,此篇不再介紹了。2. pod內部容器之間
這種情況下容器通訊比較簡單,因為pod內部的容器是共享網路空間的,所以容器直接可以使用localhost訪問其他容器。k8s在啟動容器的時候會先啟動一個Pause容器
每個Pod裡執行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網路棧和Volume掛載卷,因此他們之間通訊和資料交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務程序放入同一個Pod中。
3. pod 與 pod 容器之間
此種類型又分為兩種情況:(1)兩個pod在一臺節點上:此時是利用docker預設的自身網橋方式互連容器的。
(2)兩個pod在不同節點上:這種情況k8s官方推薦的是使用flannel組建一個大二層扁平網路,pod的ip分配由flannel統一分配,通訊過程也是走flannel的網橋方式。(flannel 的叢集配置方法已在Kubernetes學習2--叢集部署與搭建介紹過)
接下來就詳細介紹下 flannel 工作原理吧。
二. 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範圍。
結合部署叢集的情況
Flannel啟動之後會建立一個檔案 subnet.env
vim /run/flannel/subnet.env
因此,以此次叢集部署為例,通俗解析下不同節點上pod容器通訊過程:(假設容器1是 nginx ,容器2是 tomcat )
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)。