站長資訊網
        最全最豐富的資訊網站

        Flannel入門介紹

        Flannel是CoreOS團隊針對Kubernetes設計的一個網絡規劃服務,簡單來說,它的功能是讓集群中的不同節點主機創建的Docker容器都具有全集群唯一的虛擬IP地址。 

        在Kubernetes的網絡模型中,假設了每個物理節點應該具備一段“屬于同一個內網IP段內”的“專用的子網IP”。例如: 

        節點A:10.0.1.0/24  節點B:10.0.2.0/24  節點C:10.0.3.0/24  

        但在默認的Docker配置中,每個節點上的Docker服務會分別負責所在節點容器的IP分配。這樣導致的一個問題是,不同節點上容器可能獲得相同的內外IP地址。并使這些容器之間能夠之間通過IP地址相互找到,也就是相互ping通。 
        Flannel的設計目的就是為集群中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重復的”IP地址,并讓屬于不同節點上的容器能夠直接通過內網IP通信。 

        2Flannel的工作原理

        Flannel實質上是一種“覆蓋網絡(overlay network)”,也就是將TCP數據包裝在另一種網絡包里面進行路由轉發和通信,目前已經支持UDP、VxLAN、AWS VPC和GCE路由等數據轉發方式。 

        默認的節點間數據通信方式是UDP轉發,在Flannel的GitHub頁面有如下的一張原理圖: 

        Flannel入門介紹

        這張圖的信息量很全,下面簡單的解讀一下。 
        數據從源容器中發出后,經由所在主機的docker0虛擬網卡轉發到flannel0虛擬網卡,這是個P2P的虛擬網卡,flanneld服務監聽在網卡的另外一端。 
        Flannel通過Etcd服務維護了一張節點間的路由表,在稍后的配置部分我們會介紹其中的內容。 
        源主機的flanneld服務將原本的數據內容UDP封裝后根據自己的路由表投遞給目的節點的flanneld服務,數據到達以后被解包,然后直 接進入目的節點的flannel0虛擬網卡,然后被轉發到目的主機的docker0虛擬網卡,最后就像本機容器通信一下的有docker0路由到達目標容器。 
        這樣整個數據包的傳遞就完成了,這里需要解釋三個問題。 

        第一個問題,UDP封裝是怎么一回事? 

        我們來看下面這個圖,這是在其中一個通信節點上抓取到的ping命令通信數據包??梢钥吹皆赨DP的數據內容部分其實是另一個ICMP(也就是ping命令)的數據包。 

        Flannel入門介紹

        原始數據是在起始節點的Flannel服務上進行UDP封裝的,投遞到目的節點后就被另一端的Flannel服務還原成了原始的數據包,兩邊的Docker服務都感覺不到這個過程的存在。 

        第二個問題,為什么每個節點上的Docker會使用不同的IP地址段? 

        這個事情看起來很詭異,但真相十分簡單。其實只是單純的因為Flannel通過Etcd分配了每個節點可用的IP地址段后,偷偷的修改了Docker的啟動參數,見下圖。 

        Flannel入門介紹

        這個是在運行了Flannel服務的節點上查看到的Docker服務進程運行參數。 

        注意其中的“–bip=172.17.18.1/24”這個參數,它限制了所在節點容器獲得的IP范圍。 

        這個IP范圍是由Flannel自動分配的,由Flannel通過保存在Etcd服務中的記錄確保它們不會重復。 

        第三個問題,為什么在發送節點上的數據會從docker0路由到flannel0虛擬網卡,在目的節點會從flannel0路由到docker0虛擬網卡? 

        我們來看一眼安裝了Flannel的節點上的路由表。下面是數據發送節點的路由表: 

        Flannel入門介紹

        這個是數據接收節點的路由表: 

        Flannel入門介紹

        例如現在有一個數據包要從IP為172.17.18.2的容器發到IP為172.17.46.2的容器。根據數據發送節點的路由表,它只與 172.17.0.0/16匹配這條記錄匹配,因此數據從docker0出來以后就被投遞到了flannel0。同理在目標節點,由于投遞的地址是一個容 器,因此目的地址一定會落在docker0對于的172.17.46.0/24這個記錄上,自然的被投遞到了docker0網卡。 

        回到頂部

         

        3Flannel的安裝和配置

        Flannel是Golang編寫的程序,因此的安裝十分簡單。 
        從 https://github.com/coreos/flannel/releases和 https://github.com/coreos/etcd/releases分別下載Flannel和Etcd的最新版本二進制包。 
        解壓后將Flannel的二進制文件“flanneld”和腳本文件“mk-docker-opts.sh”、以及Etcd的二進制文件“etcd”和“etcdctl”放到系統的PATH目錄下面安裝就算完成了。 
        配置部分要復雜一些。 
        首先啟動Etcd,參考 https://github.com/coreos/etcd … overy。 
        訪問這個地址: https://discovery.etcd.io/new?size=3 獲得一個“Discovery地址” 
        在每個節點上運行以下啟動命令: 
        etcd -initial-advertise-peer-urls http://<當前節點IP>:2380 -listen-peer-urls http://<當前節點IP>:2380 -listen-client-urlshttp://<當前節點IP>:2379,http://<當前節點IP>:2379 -advertise-client-urls http://<當前節點IP>:2379 -discovery <剛剛獲得的Discovery地址> & 
        啟動完Etcd以后,就可以配置Flannel了。 

        Flannel的配置信息全部在Etcd里面記錄,往Etcd里面寫入下面這個最簡單的配置,只指定Flannel能用來分配給每個Docker節點的擬IP地址段: 

        etcdctl set /coreos.com/network/config '{ "Network": "172.17.0.0/16" }'

        然后在每個節點分別啟動Flannel: 

        flanneld &

        最后需要給Docker動一點手腳,修改它的啟動參數和docker0地址。 

        在每個節點上執行: 

        sudo mk-docker-opts.sh -i  source /run/flannel/subnet.env  sudo rm /var/run/docker.pid  sudo ifconfig docker0 ${FLANNEL_SUBNET}   

        重啟動一次Docker,這樣配置就完成了。 

        現在在兩個節點分別啟動一個Docker容器,它們之間已經通過IP地址直接相互ping通了。 

        到此,整個Flannel集群也就正常運行了。 

        最后,前面反復提到過Flannel有一個保存在Etcd的路由表,可以在Etcd數據中找到這些路由記錄,如下圖。 

        Flannel入門介紹

        Q&A

        問:數據從源容器中發出后,經由所在主機的docker0虛擬網卡轉發到flannel0虛擬網卡,這種P2P實際生產中是否存在丟包,或者此機制有高可用保障么? 
        答:只是本機的P2P網卡,沒有經過外部網絡,應該還比較穩定。但我這里沒有具體數據。 

        問:UDP數據封裝,轉發的形式也是UDP么?我們一般知道UDP發送數據是無狀態的,可靠么? 
        答:轉發的是UDP,高并發數據流時候也許會有問題,我這里同樣沒有數據。 

        問:實際上,kubernates是淡化了容器ip,外圍用戶只需關注所調用的服務,并不關心具體的ip,這里fannel將IP分開且唯一,這樣做有什么好處?有實際應用的業務場景么? 
        答: IP唯一是Kubernetes能夠組網的條件之一,不把網絡拉通后面的事情都不好整。 

        問:Flannel通過Etcd分配了每個節點可用的IP地址段后,偷偷的修改了Docker的啟動參數:那么如果增加節點,或刪除節點,這些地址段(ETCD上)會動態變化么?如果不是動態變化,會造成IP地址的浪費么? 
        答會造成一些浪費,一般使用10.x.x.x的IP段。 

        問:sudo mk-docker-opts.sh -i 這個命令具體干什么了?非coreos上使用flannel有什么不同? 
        答:生成了一個Docker啟動的環境變量文件,里面給Docker增加了啟動參數。 
        沒有什么不同,只是CoreOS集成了Flannel,在CoreOS上面啟動Flannel只是一行命令:systemctl start flanneld。 

        問:容器IP都是固定的嗎?外網與物理主機能ping通,也能ping通所有Docker集群的容器IP? 
        答:不是固定的,IP分配還是Docker在做,Flannel只是分配了子網。 

        問:Flannel的能否實現VPN?你們有沒有研究過? 
        答: 應該不能,它要求這些容器本來就在一個內網里面。 

        問:Flannl是誰開發的?全是對k8s的二次開發嗎? 
        答: CoreOS公司,不是k8s的二次開發,獨立的開源項目,給k8s提供基礎網絡環境。 

        問:Flannel支持非封包的純轉發嗎?這樣性能就不會有損失了? 
        答:非封裝怎樣路由呢?發出來的TCP包本身并沒有在網絡間路由的信息,別忘了,兩個Flannel不是直連的,隔著普通的局域網絡。 

        問: Flanel現在到哪個版本了,后續版本有什么側重點?性能優化,還是功能擴展? 
        答:還沒到1.0,在GitHub上面有他們的發展計劃,性能是很大的一部分。 

        問: 就是在CoreOS中,客戶還需要安裝Flannel嗎? 
        答:不需要,在啟動的Cloudinit配置里面給Etcd寫入Flannel配置,然后加上flanneld.service command: start 就可以了,啟動完直接可用,文檔連接我不找了,有這段配置,現成的。 

        問: 可不可以直接用命令指定每個主機的ip范圍,然后做gre隧道實現節點之間的通信?這樣也可以實現不同主機上的容器ip不同且可以相互通信吧? 
        答:還不支持指定哪個節點用那段IP,不過貌似可以在Etcd手改。 

        問: Flannel只是負責通信服務,那是不是還要安裝k8s? 
        答:是的,k8s是單獨的。 

        問:現在Docker的網絡組件還有什么可以選擇或者推薦的? 
        答:Overlay網絡的常用就是Flannel和Weave,其他OVS之類的另說了。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 2020久久精品国产免费| 国产精品gz久久久| 四虎4hu永久免费国产精品| 无码人妻一区二区三区精品视频| 成人精品视频在线观看| 亚洲日韩精品无码专区网站| 91精品国产福利在线观看| 久久精品国产亚洲AV麻豆网站| 久久精品中文字幕第23页| 91精品观看91久久久久久| 国产精品成熟老女人视频| 中文无码精品一区二区三区| 日韩精品区一区二区三VR| 久久久久久久亚洲精品| 亚洲国产精品婷婷久久| 99久久成人国产精品免费| 无码精品人妻一区二区三区中| 亚洲精品麻豆av| 日本午夜精品理论片A级APP发布| 国产小呦泬泬99精品| 99久久精品无码一区二区毛片| 精品九九人人做人人爱| 91麻豆精品视频| 国产精品免费观看调教网| 久久99国产乱子伦精品免费| 亚洲AV无码成人精品区天堂| 自拍偷在线精品自拍偷 | 熟女精品视频一区二区三区| 香港aa三级久久三级老师2021国产三级精品三级在 | 国产日产韩国精品视频| 国产日韩精品欧美一区喷水| 国产精品福利自产拍在线观看| 97精品人妻系列无码人妻| jizz国产精品网站| 国产精品三级在线| 亚洲精品欧美综合| 成人午夜精品久久久久久久小说| 99久久精品免费看国产一区二区三区| 国产精品九九九| 九九久久精品无码专区| 日本精品久久久久影院日本|