本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何學術交流,可隨時聯繫。node
Flannel是如何作到爲不一樣Node上的Pod分配IP且不產生衝突的?由於Flannel使用集中的etcd服務管理這些地址資源信息,它每次分配的地址段都在同一個公共區域獲取,這樣天然能隨時協調,避免衝突了。在Flannel分配好地址段後,接下來的工做就轉交給Docker完成了。Flannel經過修改Docker的啓動參數將分配給它的地址段傳遞進去。docker
--bip=172.17.18.1/24
複製代碼
經過這些操做,Flannel就控制了每一個Node節點上的docker0地址段的地址,也能保障全部Pod的IP地址在同一水平的網絡中且不產生衝突了api
每臺物理主機都安裝有flannel,假設k8s定義的flannel網絡爲10.0.0.0/16,各主機的flannel從這個網絡申請一個子網。pod1所在的主機的flannel子網爲10.0.13.1/24,pod2所在主機的flannel子網爲10.0.14.1/24。網絡
每臺主機有cni0和flannel.1虛擬網卡。cni0爲在同一主機pod共用的網橋,當kubelet建立容器時,將爲此容器建立虛擬網卡vethxxx,並橋接到cni0網橋。flannel.1是一個tun虛擬網卡,接收不在同一主機的POD的數據,而後將收到的數據轉發給flanneld進程。性能
Calico把每一個操做系統的協議棧認爲是一個路由器,而後把全部的容器認爲是連在這個路由器上的網絡終端,在路由器之間跑標準的路由協議——BGP的協議,而後讓它們本身去學習這個網絡拓撲該如何轉發。因此Calico方案實際上是一個純三層的方案,也就是說讓每臺機器的協議棧的三層去確保兩個容器,跨主機容器之間的三層連通性。學習
對於控制平面,它每一個節點上會運行兩個主要的程序,一個是Felix,它會監聽ECTD中心的存儲,從它獲取事件,好比說用戶在這臺機器上加了一個IP,或者是分配了一個容器等。接着會在這臺機器上建立出一個容器,並將其網卡、IP、MAC都設置好,而後在內核的路由表裏面寫一條,註明這個IP應該到這張網卡。綠色部分是一個標準的路由程序,它會從內核裏面獲取哪一些IP的路由發生了變化,而後經過標準BGP的路由協議擴散到整個其餘的宿主機上,讓外界都知道這個IP在這裏,大家路由的時候獲得這裏來。大數據
因爲Calico是一種純三層的實現,所以能夠避免與二層方案相關的數據包封裝的操做,中間沒有任何的NAT,沒有任何的overlay,因此它的轉發效率多是全部方案中最高的,由於它的包直接走原生TCP/IP的協議棧,它的隔離也由於這個棧而變得好作。由於TCP/IP的協議棧提供了一整套的防火牆的規則,因此它能夠經過IPTABLES的規則達到比較複雜的隔離邏輯。加密
從上圖能夠看出,當容器建立時,calico爲容器生成veth pair,一端做爲容器網卡加入到容器的網絡命名空間,並設置IP和掩碼,一端直接暴露在宿主機上,並經過設置路由規則,將容器IP暴露到宿主機的通訊路由上。於此同時,calico爲每一個主機分配了一段子網做爲容器可分配的IP範圍,這樣就能夠根據子網的CIDR爲每一個主機生成比較固定的路由規則。spa
當容器須要跨主機通訊時,主要通過下面的簡單步驟:操作系統
calico目前只支持TCP、UDP、ICMP、ICMPv6協議,若是使用其餘四層協議(例如NetBIOS協議),建議使用weave、原生overlay等其餘overlay網絡實現。 基於三層實現通訊,在二層上沒有任何加密包裝,所以只能在私有的可靠網絡上使用。 流量隔離基於iptables實現,而且從etcd中獲取須要生成的隔離規則,有一些性能上的隱患
Kubernetes網絡解決方案爲大規模集羣部署提供化多爲一的網絡,本文結合做者在大規模IOT物聯網大數據支撐平臺的實踐經驗,進行總結,此文尚不完善,請持續關注凱新雲技術社區
秦凱新