Flannel解讀

概念

由我上篇博文Docker網絡解讀可知,flannel主要用來解決容器的跨主機通信問題,同時也是kubernetes主要實現網絡互通的方式,那麼flannel是如何實現容器間跨主機通信的呢,下面我們引入flannel github上的一張原理圖來解讀:
圖片描述
要完整解讀此圖,在此之前,我們首先要了解下flannel關聯的一個重要組件"Etcd”的概念。

什麼是Etcd?

我們引用下Etcd的基本概念:etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並通過Raft一致性算法處理日誌複製以保證強一致性。Raft是一個來自Stanford的新的一致性算法,適用於分佈式系統的日誌複製,Raft通過選舉的方式來實現一致性,在Raft中,任何一個節點都可能成爲Leader。Google的容器集羣管理系統Kubernetes、開源PaaS平臺Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。

在上面這一大段話中,我們可以瞭解到etcd是一個基於服務發現的系統。服務發現可理解爲在一個Cluster集羣內記錄各node信息的數據庫,其他node可通過該數據庫獲取該Cluster集羣內各node的信息。

Flannel實現原理

瞭解了以上概念之後,我們就能說明flannel的實現原理了,爲了解釋清楚,我們把實現原理分爲以下幾個步驟:

  1. 數據從Web App Frontend1這個容器發出經veth0網橋轉發到宿主機的docker0網橋上
  2. docker0網橋根據數據包的目的地址進行轉發,若爲非本機容器地址則轉發給Flannel0網卡處理
  3. Flannel0網卡交給flanneld這個進程處理,flanneld通過查詢etcd,找到目的容器地址,並進行轉發
  4. 數據包到達目的主機,經flanneld解包,最後由docker0轉發到目的容器

這樣整個數據包發送過程就解釋完成了。

當然僅僅是這樣還不夠,flannel爲每個在它管理下的容器賦予了一個獨立的不會重複的ip地址,這樣跨主機容器的ip地址就不會重複了,在這個前提下才能實現以上步驟的精確轉發。

總結

flannel爲集羣內每個容器分配一個獨立的ip地址,通過etcd的服務發現功能存儲各node容器的ip信息,實現數據包的精確轉發,解決了各容器間的跨主機通信問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章