CNI(容器網絡接口)是一種操做容器網絡規範,包含方法規範,參數規範等。 CNI只關心容器的網絡鏈接,在容器建立時分配網絡資源,並在刪除容器時刪除分配的資源。由於這個焦點,CNI有普遍的支持,規格易於實現。CNI接口只須要實現兩個方法,一個建立容器時調用,一個刪除容器時調用。linux
kubernetes首先以插件的形式完成(pod)容器的網絡資源設置。內置的插件包括:cni,kubenet,hostport等。這裏簡單說說kubenet。這是一個簡單的網絡插件,每臺機器上建立一個br0網橋,根據PodCIDR爲每一個pod設置ip鏈接到br0網橋上。次方式可結合一些網絡路由工具完成一個小規模的集羣網絡pod互聯。咱們主要講CNI插件。kubernetes以cni插件來支持cni規範,調用其餘廠商和我的開發的遵循cni規範的各類網絡插件,例如Calico
,Flannel
等。k8s默認狀況下cni模式不支持端口映射等。k8s將容器網絡設置none,徹底交給插件去管理容器網絡資源。 git
容器網絡資源包括:虛擬網卡,IP地址,DNS,網絡路由等等。容器使用獨立的網絡命名空間,能夠具備本身的網絡資源信息。這些信息數據由不一樣的CNI插件根據不一樣的SDN網絡的實現給容器配置。github
MidoNet是由日本的SDN公司Midkura研發的一款網絡虛擬化軟件,其基於底層物理設施來實現網絡虛擬化,具備分佈式、分散、多層次的特色,主要做爲OpenStack中的默認網絡組件,可讓虛擬網絡解決方案,特別是專爲網絡基礎設施設計的方案,爲雲平臺如OpenStack服務,而且將其網絡存貯棧虛擬化。MidoNet爲每一個租戶分配一個邏輯router,租戶與租戶之間是相互隔離的,租戶內部之間是可以相互通信的,Midonet支持L2交換、L3路由、L4負載均衡golang
有狀態和無狀態NAT,邏輯和分佈式防火牆,BGP與ECMP支持。其架構主要包含如下組件:shell
Agent安裝在各個計算節點,負責創建網絡流量控制和提供分佈式Midonet網絡服務,路由,NAT等他把相關的虛擬網絡信息存放到NSDB。api
Database(NSDB):存儲網絡配置和狀態,網絡拓撲,路由,Midonet不集中處理網絡功能,由Midonet Agent處理,Midonet Agent會跟NSDBs作實時同步當有變化時候會及時同步而且更新NSDB MidoNet支持大規模SDN集羣,其架構理論上支持上萬節點。咱們可使用MidoNet完成k8s集羣內租戶內Pod網絡互聯。網絡
SDN(軟件定義網絡),Midonet軟件定義你所熟知的網絡組件。如下簡單介紹幾個核心的軟件定義概念:架構
192.168.0.0/24
,最多能夠有253個虛擬設備鏈接到本Bridge。Midonet數據交換工做在三層,可是其自己不提供IP地址管理(IPAM),所以基於Midonet的cni插件須要完成如下工做:IPAM,租戶Router、Bridge建立,容器網卡建立,以及全部端到端鏈接和路由過濾規則建立。併發
須要完成兩個層面的IP管理,Router級別的地址管理,每個Router具備一個IP地址,且全局惟一不衝突。每個Bridge具備一個惟一網段,鏈接的虛擬網卡具備全局惟一IP 。
IPAM有不少實現方式,CNI插件是無狀態應用,或許你須要一個守護進程來完成IPAM工做。基於簡化架構的思路,咱們使用ETCD來存儲IP數據,直接由插件來操做ETCD。完成IP的使用和釋放。負載均衡
當新租戶第一次建立容器時進行租戶虛擬設備的初始化建立,上文咱們已經介紹了一個租戶須要建立的虛擬設備有哪些,這裏我講講細節。 Midonet提供了Rest-API來操做虛擬設備。這裏注意,根據使用的不一樣版本的Midonet使用不一樣版本的API。 https://github.com/barnettZQG/golang-midonetclient
封裝了golang版的Midonet api操做方法,支持1.*和5.*API版本。 建立步驟以下:
簡稱veth pair,是一個成對的端口,全部從這對端口一 端進入的數據包都將從另外一端出來,反之也是同樣.其兩端可存在於不一樣的網絡空間(Network Namespace)。容器建立成功後具備一個網絡空間,k8s此時調用CNI插件ADD方法進行網絡設置。插件首先建立一對Veth pair。將其一端置於宿主機網絡空間,調用Midonet 綁定API將其與Bridge一個Port綁定。另外一端在容器內並賦予IP地址,根據當前使用的Bridge網段。 與Docker0網卡部分原理一致。
將默認路由設置到上文建立的網卡上。例如上文建立的網卡命名爲eth0。
根據須要設置一些DNS信息。
1.使用shell命令。
ip link * ip netns * ip address * ip route *
以上命令詳細使用方法網上不少了,這裏再也不描述。
https://github.com/vishvananda/netlink 定義了關於網卡相關與linux內核通訊的用戶空間的相關接口。
好雨雲開源基於ETCD版的的midonet cni插件具備上文提到的全部功能和特性。 github:https://github.com/goodrain/midonet-cni