Kubernates網路解決方案技術原理深入剖析-Kubernates商業環境實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡。
1 Dokcer網路模型

2 Kubernates網路模型
2.1 Flannel如何控制同一水平網路
-
Flannel是如何做到為不同Node上的Pod分配IP且不產生衝突的?因為Flannel使用集中的etcd服務管理這些地址資源資訊,它每次分配的地址段都在同一個公共區域獲取,這樣自然能隨時協調,避免衝突了。在Flannel分配好地址段後,接下來的工作就轉交給Docker完成了。Flannel通過修改Docker的啟動引數將分配給它的地址段傳遞進去。
--bip=172.17.18.1/24 複製程式碼
通過這些操作,Flannel就控制了每個Node節點上的docker0地址段的地址,也能保障所有Pod的IP地址在同一水平的網路中且不產生衝突了

2.1.1 Flannel核心原理
- flannel利用Kubernetes API或者etcd用於儲存整個叢集的網路配置,其中最主要的功能為:設定整個叢集的網路地址空間段。例如,設定整個叢集內所有容器的IP都取自網段“10.1.0.0/16”。
- flannel在每個物理主機中執行flanneld作為agent,它會為所在主機從叢集的網路地址空間中(網段“10.1.0.0/16”),獲取一個小的網段subnet,本主機內所有容器的IP地址都將從中分配(如:分配主機1網段:10.1.1.0/24,主機2網段:10.1.2.0/24)
- flanneld再將本主機獲取的subnet以及用於主機間通訊的Public IP,同樣通過kubernetes API或者etcd儲存起來。
- flannel利用各種backend mechanism,例如udp,vxlan,hostgw等等,跨主機轉發容器間的網路流量,完成容器間的跨主機通訊。
2.1.2 Flannel使用VXLAN協議網路原理
-
每臺物理主機都安裝有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程序。