Kubernetes之叢集網路
一、Docker網路基礎
在討論Kubernetes網路之前,我們先看一下Docker網路。 下圖展示了Docker網路在整個Docker生態技術棧中的位置: docker容器網路模型CNM(Container Network Model):
-
Network Sandbox:一個容器內部的網路棧(管理容器的網絡卡、路由表以及DNS設定等)。
-
Endpoint:一個endpoint將Sandbox連結到network上,一個endpoint可以通過veth pair/open vswitch internal port等方式實現,一個endpoint只能屬於一個network,也只能屬於一個sandbox。
-
Network:一個network由一組可以相互通訊的endpoints組成。一個network可以由linux bridge,vlan或其他方式實現,一個network中可以包含多個endpoint。 Docker網路實現:
-
單機網路模式:bridge、host、joined、none
-
多級網路模式:overlay、macvlan、network plugins。 預設情況下,Docker使用bridge網路模式,bridge網路驅動的示意圖如下:
二、Kubernetes網路
kubernetes網路需要解決下面4個問題:
- 叢集內
- 同一個Pod中的container之間的通訊
- Pod和Pod之間的通訊
- Pod和Service之間的通訊
- 叢集外
- 外部應用與Service之間的通訊
2.1. 同一個Pod中容器之間的通訊
Kubernetes建立Pod時,首先會建立一個稱為pause的基礎架構容器,為Pod指派一個唯一的IP地址,然後以pause的網路名稱空間為基礎,建立同一個Pod內的其他容器(–network={container})。因此同一個Pod內的所有容器就會共享同一個網路名稱空間,所以在同一個Pod內的容器可以直接由localhost進行通訊。
2.2. 不同Pod中容器之間的通訊
Kubernetes通過flannel、calico等網路外掛解決Pod間的通訊問題。本文主要介紹flannel和calico網路外掛。
2.2.1 Flannel
flannel會為宿主機預先分配一個子網,併為Pod分配IP地址,並且使用Kubernetes的etcd來儲存網路配置相關資訊,資料包則通過VxLAN(+Directrouting)、UDP、host-gw這些型別的後端機制進行轉發。 網路策略定義了某一組Pod與另外一組Pod或者其他網路端點通訊的規則