flannel-kubernetes的網路模型

最近一直在研究kubernetes,搭建集群時總是遇到一些未知的坑(對於我來說),為了搞明白kubernetes,今天仔細調研了一下flannel。

flannel,k8s的網路模型,為k8s集群內的容器提供網路服務的組件。

主要作用:

為集群內所有容器提供一個扁平化的網路環境,即:所有容器在flannel提供的網路平面上可以看作是在同一網段,自由通信。其模型為全部的容器使用一個network,然後在每個host上從network中劃分一個子網subnet。為host上的容器創建網路時,從subnet中劃分一個ip給容器。這樣就大大提高了容器之間工作效率,不用考慮IP轉換問題。

flannel網路模型(轉載)

已上圖為例解釋flannel網路模型中容器的通信方式:

1、容器網卡是通過docker0橋接到flannel0網卡,而每個host對應的flannel0網段為10.1.x.[1-255]/24,而flannel所組成的一個跨host的網段為10.1.x.x/16,而flannel0則為flanneld進程虛擬出來的網卡。

2、docker0的地址是由 /run/flannel/subnet.env 的 FLANNEL_SUBNET 參數決定的。在啟動flannel的同時會產生一個通過flannel生成的配置文件subnet.env,參數內容如下:

FLANNEL_NETWORK=10.0.0.0/16

FLANNEL_SUBNET=10.0.61.1/24

FLANNEL_MTU=1472

FLANNEL_IPMASQ=false

3、跨接點容器之間通信流程

containerAn --> docker0 --> flannel0 --> NodeA --> (IP Address) --> n NodeB --> flannel0 --> docker0 --> containerB

(1) 容器A向容器B請求數據,首先通過路由規則將數據發往docker0,docker0接受到數據後通過路由規則將數據包轉交給本節點的flannel0處理。

(2)flannel0 將數據進行封裝並發給宿主機的eth0,然後走TCP協議轉發給containerB所在的宿主機。

(3)containerB所在的宿主機接收到數據後,根據路由規則轉發給flannel0。

(4)flannel0 再次根據路由協議將數據包發送給docker0

(5)最後數據包到達containerB,完成容器之間的數據通信。


推薦閱讀:

Docker、Kubernetes 和 Apache Mesos 對比中的一些誤區
Istio:Google、IBM 和 Lyft 聯合開源的微服務 Service Mesh 框架
梁勝關於容器的年終總結,沒再提Docker

TAG:Kubernetes | Docker | PaaS |