Flannel解讀

概念

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

什麼是Etcd?

咱們引用下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實現原理

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

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

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

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

總結

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

相關文章
相關標籤/搜索