Rainbond設計分享系列(1)基於Midonet的多租戶網絡設計

今天跟你們分享Rainbond基於Midonet的多租戶網絡設計和思考。git

Rainbond對多租戶支持的實現基礎是對多租戶的網絡支持,Rainbond公有云要求每一個租戶之間網絡必須隔離,造成相互安全的租戶網絡環境。對於不一樣的SDN網絡,實現方式各不相同,例如Calico從路由規則上隔離,Midonet能夠爲不一樣租戶建立子網等。Rainbond底層採用Kubernetes做爲應用運行方案,其採用標準的CNI網絡接入規範,爲Rainbond支持多種網絡提供了標準化支持。github

對於中小集羣用戶,Rainbond推薦使用基於Calico的網絡方案,做爲Kubernetes社區經常使用方案之一,本文再也不詳細介紹。咱們今天分享重點是對於大型集羣或對租戶網絡隔離有嚴格要求的用戶,也就是基於Midonet的方案。golang

什麼是CNI規範

(CNI)[https://github.com/containernetworking/cni/blob/spec-v0.2.0/SPEC.md](Container Networking Interface)是爲在Linux運行的容器提出的一種通用的基於插件的網絡解決方案,其最初來源於Rkt容器網絡設計,目前被Kubernetes等項目標準支持。其最新已到0.3.0版本,目前Rainbond支持0.2.0版本。其面向兩個抽象實體:安全

容器 能夠被認爲是Linux網絡命名空間的同義詞。與之相對應的單元取決於特定的容器運行時實現:例如,在應用容器規範(如Rkt)的實現中,每一個容器運行在惟一的網絡名稱空間中。另外一方面,在Docker中,每一個單獨的Docker容器一般都存在網絡名稱空間。服務器

網絡 是指一組實體,它們是惟一可尋址的,能夠相互通訊。這能夠是單個容器(如上所述),機器或其餘網絡設備(例如路由器)。容器能夠在概念上添加到一個或多個網絡或從中刪除。restful

Rainbond中每一個應用運行實例使用一個網絡空間,運行實例建立和銷燬分別會設置和回收網絡資源。所以,網絡資源是一個動態的可複用的資源。網絡

MidoNet SDN網絡

MidoNet是由日本的SDN公司Midkura研發的一款網絡虛擬化軟件,其基於底層物理設施來實現網絡虛擬化,具備分佈式、分散、多層次的特色,主要做爲OpenStack中的默認網絡組件,可讓虛擬網絡解決方案,特別是專爲網絡基礎設施設計的方案,爲雲平臺如OpenStack服務,而且將其網絡存貯棧虛擬化。MidoNet爲每一個租戶分配一個邏輯router,租戶與租戶之間是相互隔離的,租戶內部之間是可以相互通信的,Midonet支持L2交換、L3路由、L4負載均衡 有狀態和無狀態NAT,邏輯和分佈式防火牆,BGP與ECMP支持。其架構主要包含如下組件:架構

Midolman(Midonet Agent):Midonet

Agent安裝在各個計算節點,負責創建網絡流量控制和提供分佈式Midonet網絡服務,路由,NAT等他把相關的虛擬網絡信息存放到NSDB。併發

Network State

Database(NSDB):存儲網絡配置和狀態,網絡拓撲,路由,Midonet不集中處理網絡功能,由Midonet Agent處理,Midonet Agent會跟NSDBs作實時同步當有變化時候會及時同步而且更新NSDB負載均衡

MidonetAPI

midonet提供restful API接口提供全套的模型操做,這對於咱們爲其作CNI-plugin奠基基礎。

MidoNet支持大規模SDN集羣,其架構理論上支持上萬節點。Rainbond基於Midonet網絡可支持上萬節點集羣,其最初設計用於OpenStack虛擬機網絡,咱們將其與容器適配,使其成爲標準的容器網絡解決方案。

MidoNet多租戶下網絡結構模型

SDN(軟件定義網絡),midonet軟件定義你所熟知的網絡組件。如下簡單介紹幾個核心的軟件定義概念:

  • Router(路由器)
    一個租戶對應一個Router,鏈接到同一個Router的Bridge網絡互通。Midonet會建立一個PrivierRouter,全部租戶Router鏈接到PrivierRouter與外網互通。能夠理解爲一個路由器內網互通,鏈接上級路由器接入公網。
  • Bridge(網橋)
    一個租戶下能夠有多個Bridge,每一個Bridge使用不一樣的網段。例如一個Bridge網段爲192.168.0.0/24,最多能夠有253個虛擬設備鏈接到本Bridge。
  • Port(設備通訊端口)
    Router與Router之間,Router與Bridge之間的通訊接口。
  • Route(路由)
    路由規則,給Router定義流量包轉發端口的規則。
  • Rule(過濾規則)
    定義包過濾條件。相似於iptables。
    image

基於MidoNet的CNI插件實現

midonet數據交換工做在三層,可是其自己不提供IP地址管理(IPAM),所以基於Midonet的cni插件須要完成如下工做:

IPAM 區別不一樣的租戶爲應用實例分配可用IP和回收已銷燬實例的IP地址,同時還須要爲下文涉及的Router,Bridge 分配IP網段。每個Router具備一個IP地址,且全局惟一不衝突。每個Bridge具備一個惟一網段,鏈接的虛擬網卡具備全局惟一IP。IPAM須要數據存儲,本該是有狀態的守護服務。可是CNI-Plugin必須設計成無狀態的命令,所以咱們使用etcd做爲咱們的數據存儲服務,其全局一致性保證了咱們端口分配的正確性。 租戶Router建立 一個新租戶第一個實例啓動階段會爲當前租戶在Midonet中建立虛擬租戶子網。並鏈接到PrivierRouter與外圍直連。 租戶Bridge建立 一個租戶能夠有一個或多個Bridge,根據其實例數量決定,每一個網橋具備不一樣的虛擬網段,最多支持253個運行實例。 容器網卡建立 爲目標容器建立網卡接口是CNI插件必備的功能,根據須要可建立多個或一個,這裏接入Midonet Bridge須要一個網卡。 端到端鏈接創建 每個Bridge須要與租戶Router創建鏈接,每個運行實例須要與對應的Bridge創建鏈接。 路由過濾規則 PrivierRouter到租戶Router須要路由規則,租戶Router到Bridge須要路由規則和過濾規則。

租戶網絡初始化

當新租戶第一次建立容器時進行租戶虛擬設備的初始化建立,上文咱們已經介紹了一個租戶須要建立的虛擬設備有哪些,這裏我講講細節。 Midonet提供了Rest-API來操做虛擬設備。這裏注意,根據使用的不一樣版本的Midonet使用不一樣版本的API。 github.com/barnettZQG/…
咱們基於Golang須要封裝了midonet client,支持1.*和5.*API版本的經常使用API。 建立步驟以下:

  1. 建立租戶,調用Keystone API。
  2. 建立Router,幷包含建立進出Chain。
  3. 建立PrivierRouter Port並賦IP,建立Router Port並賦IP。建立PortLink鏈接兩個Port。
  4. 爲前面建立的Chain建立對應的路由規則
  5. 爲前面建立的Port建立包過濾規則
  6. 建立一個默認的Bridge。並建立Port連上Router。
  7. 存儲以上建立的相關數據進etcd.

容器網卡建立和網絡綁定

Virtual Ethernet Pair

簡稱veth pair,是一個成對的端口,全部從這對端口一端進入的數據包都將從另外一端出來,反之也是同樣.其兩端可存在於不一樣的網絡空間(Network Namespace)。容器建立成功後具備一個網絡空間,容器建立時調用CNI插件ADD方法進行網絡設置。插件首先建立一對Veth pair。將其一端置於宿主機網絡空間,調用Midonet 綁定API將其與Bridge一個Port綁定。另外一端在容器內並由IPAM模塊分配並賦予IP地址,其與Docker0網卡部分原理一致。

設置容器內路由規則

將默認路由設置到上文建立的網卡上。例如上文建立的網卡命名爲eth0,默認出口路由設置到eth0網卡,如此用戶應用的出口網絡將默認使用Midonet網絡統一管理。在Rainbond的用例中,須要外網訪問的應用除了eth0網卡之外還有一塊接入宿主機的網卡eth1,其映射到宿主機後由邊緣負載均衡代理向外網提供服務,所以Rainbond還會設置自定義的路由規則。

設置DNS 根據須要設置一些DNS信息,例如Rainbond會設置Rainbond相關的應用DNS信息。

CNI插件實現的注意事項

  1. CNI插件的添加和刪除操做應該具備冪等性,即一樣的參數傳入無論調用多少次都應該有相同的效果。
  2. CNI插件應該支持併發性,主要是租戶相關組件的建立和IP地址分配的強一致性。
  3. CNI插件有必定的規範,請參考:github.com/containerne…

FAQ

  • Rainbond是什麼?是否開源? Rainbond是國內首個開源的生產級無服務器PaaS,深度整合基於Kubernetes的容器管理、多類型CI/CD應用構建與交付、多數據中心的資源管理等技術,提供雲原生應用全生命週期解決方案,構建應用與基礎設施、應用之間及基礎設施之間的互聯互通生態體系。Rainbond目前基於L-GPL(v3)開源協議開源。 項目地址: https://github.com/goodrain/rainbond 官網: http://www.rainbond.com

  • Midonet CNI-Plugin是否開源? Midonet CNI-Plugin做爲Rainbond網絡組件的一部分開源。 項目地址: https://github.com/goodrain/midonet-cni

相關文章
相關標籤/搜索