由我上篇博文Docker網絡解讀可知,flannel主要用來解決容器的跨主機通訊問題,同時也是kubernetes主要實現網絡互通的方式,那麼flannel是如何實現容器間跨主機通訊的呢,下面咱們引入flannel github上的一張原理圖來解讀:
要完整解讀此圖,在此以前,咱們首先要了解下flannel關聯的一個重要組件"Etcd」的概念。node
咱們引用下Etcd的基本概念:etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並經過Raft一致性算法處理日誌複製以保證強一致性。Raft是一個來自Stanford的新的一致性算法,適用於分佈式系統的日誌複製,Raft經過選舉的方式來實現一致性,在Raft中,任何一個節點均可能成爲Leader。Google的容器集羣管理系統Kubernetes、開源PaaS平臺Cloud Foundry和CoreOS的Fleet都普遍使用了etcd。git
在上面這一大段話中,咱們能夠了解到etcd是一個基於服務發現的系統。服務發現可理解爲在一個Cluster集羣內記錄各node信息的數據庫,其餘node可經過該數據庫獲取該Cluster集羣內各node的信息。github
瞭解了以上概念以後,咱們就能說明flannel的實現原理了,爲了解釋清楚,咱們把實現原理分爲如下幾個步驟:算法
這樣整個數據包發送過程就解釋完成了。docker
固然僅僅是這樣還不夠,flannel爲每一個在它管理下的容器賦予了一個獨立的不會重複的ip地址,這樣跨主機容器的ip地址就不會重複了,在這個前提下才能實現以上步驟的精確轉發。數據庫
flannel爲集羣內每一個容器分配一個獨立的ip地址,經過etcd的服務發現功能存儲各node容器的ip信息,實現數據包的精確轉發,解決了各容器間的跨主機通訊問題。segmentfault