標籤:

kubernetes的網路實現

kubernetes的網路實現

kubernetes的網路設計主要針對以下幾種情況實現的:

  1. 同一pod下容器與容器的通信;
  2. 同一節點下不同的pod之間的容器間通信;
  3. 不同節點下容器之間的通信;
  4. 集群外部與內部組件的通信;
  5. pod與service之間的通信;

同一pod下容器與容器的通信

同一個pod下的容器之間的通信,其實原理很簡單,因為容器都在共用一個linux協議棧,可以

簡單的看作在同一個網路裡面,所以可以理解為一個容器為web服務,一個容器為mysql。

web服務可以使用宿主機的IP地址+3306埠就可以訪問,不需要通過其他組件的處理,這種

訪問方式是最簡單的。

同一節點下不同的pod之間的容器間通信

這種通信方式就會比前面的複雜一點,至少需要理解pod之間的通信方式。

同一個node上的不同pod之間的通信:

在同一個node上,pod之間都是通過veth鏈接到docker0網橋上,docker0會動態地分配IP地址給pod。

綜上所述:由於它們在同一個節點上,而且共用一個docker0網橋,所以網路地址也是相同點的,也可以直連。

不同節點下容器之間的通信

不同節點的容器通信就複雜點,不過理解還是很容易的。

由於容器分別在不同的容器上,所以她們就會由不同的docker0來分配不同的IP地址,有可能

就不會在同一個網段內,為了實現通信呢,就必須想辦法通過IP地址定址的方式來實現通信。

pod與service之間的通信

kubernetes創建服務時,會為服務分配一個虛擬的IP地址,即為ClusterIP,客戶端通過訪問這

個虛擬IP地址來訪問內部組件。實質上具體訪問內部的工作都是kube-proxy來完成的。kube-

proxy擔負著透明代理和負載均衡的角色,其實就是將某個訪問service的請求,通過一套演算法

和規則轉發給後端的pod,這裡說的演算法就是Round Robin負載均衡演算法和session粘連規則。

我們還可以通過修改service裡面的service.spec.sessionAffinity參數的值來實現會話保持特

的定向轉發。

總之,不管是clusterIP+targetPort,還是節點IP+NodePort,都會被Iptables規則重新定向到

kube-proxy監聽服務的代理埠。

集群外部與內部組件的通信

集群外部與內部的通信,目前就是兩種方式:

(1)NodeIP+NodePort

這種方式就是直接在宿主機上打開一個埠,用來訪問集群內部服務。

(2)loadBalance

使用外部雲服務提供商的負載均衡器。

其原理也是很簡單

外部請求訪問內部服務,iptables為設置Nodeport規則,將對Service的訪

問轉接到kube-proxy作為負載均衡器,然後經過負載均衡演算法進入到pod中。

aHR0cDovL3dlaXhpbi5xcS5jb20vci9ma1ByOC1mRWhLcjdyYk9ROXhacw== (二維碼自動識別)


推薦閱讀:

kubernetes1.4.5安裝文檔
編排工具充分發揮了 Linux 容器技術優勢
漫畫:小黃人學 Kubernetes Service
梁勝關於容器的年終總結,沒再提Docker
使用Heapster和Splunk監控Kubernetes運行性能

TAG:Kubernetes |