轉自: https://blog.csdn.net/weixin_29115985/article/details/78963125
k8s里面容器是存在于pod里面的,所以容器之間通訊,一般分為三種類型:
(1) pod 訪問service服務
(2) pod內部容器之間
(3) pod 與 pod 容器之間
此方式在上篇文章介紹過,其通過暴露主機IP和端口的形式進行通訊,此篇不再介紹了。
這種情況下容器通訊比較簡單,因為pod內部的容器是共享網絡空間的,所以容器直接可以使用localhost訪問其他容器。
k8s在啟動容器的時候會先啟動一個
Pause容器
,這個容器就是實現這個功能的:
每個Pod里運行著一個特殊的被稱之為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此他們之間通信和數據交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。
此種類型又分為兩種情況:
(1)
兩個pod在一臺節點上
:此時是利用docker默認的自身網橋方式互連容器的。
(2)
兩個pod在不同節點上
:這種情況k8s官方推薦的是使用flannel組建一個大二層扁平網絡,pod的ip分配由flannel統一分配,通訊過程也是走flannel的網橋方式。(flannel 的集群配置方法已在Kubernetes學習2--集群部署與搭建介紹過)
接下來就詳細介紹下 flannel 工作原理吧。
Flannel是CoreOS團隊針對Kubernetes設計的一個網絡規劃服務,簡單來說,它的功能是讓集群中的不同節點主機創建的Docker容器都具有全集群唯一的虛擬IP地址。
Flannel實質上是一種“ 覆蓋網絡(overlay network) ”,也就是將TCP數據包裝在另一種網絡包里面進行路由轉發和通信,Flannel的設計目的就是為集群中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重復的”IP地址,并讓屬于不同節點上的容器能夠直接通過內網IP通信。
默認的節點間數據通信方式是UDP轉發,在Flannel的GitHub頁面有如下的一張原理圖:
簡單的說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范圍。
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) 。
--------------------- 本文來自 JamlyHuang 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/weixin_29115985/article/details/78963125?utm_source=copy
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。