kubernetes的網路實現
kubernetes的網路實現
kubernetes的網路設計主要針對以下幾種情況實現的:
- 同一pod下容器與容器的通信;
- 同一節點下不同的pod之間的容器間通信;
- 不同節點下容器之間的通信;
- 集群外部與內部組件的通信;
- 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 |