|
容器技術很火,經常為人所提及,尤其是開源容器工具Docker,已在不少數據中心里有廣泛應用。容器主要是對軟件和其依賴環(huán)境的標準化打包,將應用之間相互隔離,并能運行在很多主流操作系統(tǒng)上。這樣看來容器和虛擬機技術很類似,容器是APP層面的隔離,而虛擬化是物理資源層面的隔離,容器解決了虛擬技術的不少痛點問題,很多時候容器可以和虛擬機結合在一起使用,這也是目前數據中心主流的做法。 當企業(yè)IT建設容器云平臺時,會碰到一系列的挑戰(zhàn),根據CNCF的調查報告指出,容器的網絡和安全實現成為容器云平臺建設最主要的挑戰(zhàn),當企業(yè)開始將重要的企業(yè)核心應用遷移至容器平臺,缺乏足夠的網絡和安全管控將會給業(yè)務上線帶來潛在的巨大威脅。 除了容器網絡安全,如何更好的鏈接不同Kubernetes集群孤島,如何鏈接異構容器云平臺,這些都是一系列的網絡問題需要考慮。容器網絡技術也在持續(xù)演進,從Docker本身的動態(tài)端口映射網絡模型,到CNCF的CNI容器網絡接口到Service Mesh+CNI層次化SDN。 ![]() 端口映射
容器網絡接口CNI(Container Network Interface)是Google和CoreOS主導制定的容器網絡標準,它是在RKT網絡提議 的基礎上發(fā)展起來的,綜合考慮了靈活性、擴展性、IP分配、多網卡等因素。CNI旨在為容器平臺提供網絡的標準化。不同的容器平臺(比如目前的Kubernetes、Mesos和RKT)能夠通過相同的接口調用不同的網絡組件。這個協(xié)議連接了兩個組件:容器管理系統(tǒng)和網絡插件,具體的事情都是插件來實現的,包括:創(chuàng)建容器網絡空間(network namespace)、把網絡接口(interface)放到對應的網絡空間、給網絡接口分配IP等。 目前采用CNI提供的方案一般分為兩種,隧道方案和路由方案。 Callico![]() Callico容器網絡和其他虛擬網絡最大的不同是,它沒有采用overlay網絡做報文轉發(fā),提供了純三層網絡模型。三層通信模型表示每個容器都通過IP直接通信,要想路由工作能夠正常,每個容器所在的主機節(jié)點必須有某種方法知道整個集群的路由信息,Callico采用 BGP路由協(xié)議,使得全網所有的Node和網絡設備都記錄到全網路由,然而這種方式會產生很多的無效路由,對網絡設備路由規(guī)格要求較大,整網不能有路由規(guī)格低的設備。另外,Callico實現了從源容器經過源宿主機,經過數據中心路由,然后到達目的宿主機,最后分配到目的容器,整個過程中始終都是根據BGP協(xié)議進行路由轉發(fā),并沒有進行封包,解包過程,這樣轉發(fā)效率就會快得多,這是Callico容器網絡的技術優(yōu)勢。 Flannel![]() Flannel是CoreOS提出用于解決容器集群跨主機通訊的網絡解決方案。Flannel實質上是一種覆蓋網絡Overlay network,也就是將TCP數據包裝在另一種網絡包里面進行路由轉發(fā)和通信,目前已支持UDP、VXLAN、AWS VPC、GCE路由等數據轉發(fā)方式,其中以VXLAN技術最為流行,很多數據中心在考慮引入容器時,也考慮將網絡切換到Flannel的VXLAN網絡中來。Flannel為每個主機分配一個subnet,容器從此subnet中分配IP,這些IP可在主機間路由,容器間無需NAT和端口映射就可以跨主機通訊。Flannel讓集群中不同節(jié)點主機創(chuàng)建容器時都具有全集群唯一虛擬IP地址,并連通主機節(jié)點網絡。Flannel可為集群中所有節(jié)點重新規(guī)劃IP地址使用規(guī)則,從而使得不同節(jié)點上的容器能夠獲得“同屬一個內網”且“不重復的”的IP地址,讓不同節(jié)點上的容器能夠直接通過內網IP通信,網絡封裝部分對容器是不可見的。源主機服務將原本數據內容UDP封裝后根據自己的路由表投遞給目的節(jié)點,數據到達以后被解包,然后直接進入目的節(jié)點虛擬網卡,然后直接達到目的主機容器虛擬網卡,實現網絡通信目的。Flannel雖然對網絡要求較高,要引入封裝技術,轉發(fā)效率也受到影響,但是卻可以平滑過渡到SDN網絡,VXLAN技術可以和SDN很好地結合起來,值得整個網絡實現自動化部署,智能化運維和管理,較適合于新建數據中心網絡部署。 Weave![]() Weave實質上也是覆蓋網絡,Weave可以把不同主機上容器互相連接的網絡虛擬成一個類似于本地網絡的網絡,不同主機之間都使用自己的私有IP地址,當容器分布在多個不同的主機上時,通過Weave可以簡化這些容器之間的通信。Weave網絡中的容器使用標準的端口提供服務(如MySQL默認使用3306),管理微服務是十分直接簡單的。每個容器都可以通過域名來與另外的容器通信,也可以直接通信而無需使用NAT,也不需要使用端口映射或者復雜的聯接。部署Weave容器網絡最大的好處是無需修改你的應用代碼。Weave通過在容器集群的每個主機上啟動虛擬路由器,將主機作為路由器,形成互聯互通的網絡拓撲,在此基礎上,實現容器的跨主機通信。要部署Weave需要確保主機Linux內核版本在3.8以上,Docker 1.10以上,主機間訪問如果有防火墻,則防火墻必須彼此放行TCP 6783和UDP 6783/6784這些端口號,這些是Weave控制和數據端口,主機名不能相同,Weave要通過主機名識別子網。Weave網絡類似于主機Overlay技術,直接在主機上進行報文流量的封裝,從而實現主機到主機的跨Underlay三層網絡的互訪,這是和Flannel網絡的最大區(qū)別,Flannel是一種網絡Overlay方案。 Macvlan網絡方案Macvlan是Linux kernel比較新的特性,允許在主機的一個網絡接口上配置多個虛擬的網絡接口,這些網絡interface有自己獨立的MAC地址,也可以配置上IP地址進行通信。Macvlan下的虛擬機或者容器網絡和主機在同一個網段中,共享同一個廣播域。Macvlan和Bridge比較相似,但因為它省去了Bridge的存在,所以配置和調試起來比較簡單,而且效率也相對高。除此之外,Macvlan自身也完美支持VLAN。 不同的容器網絡方案,適用于不同的應用場景,就看企業(yè)如何選擇了,從難易度上來講,Callico最簡單,其次Flannel,Weave最復雜,從網絡技術來看,Weave和Flannel都是網絡封裝技術,區(qū)別在于封裝的位置在網絡設備上還是主機上。下圖是4中方案的比較。 ![]() CNI方案也面臨著自身的問題
服務網格+CNI服務網格是當下的一個熱點,業(yè)界有些聲音說服務網格是下一代SDN,但是Service Mesh并不能替代CNI,與CNI一起提供層次化微服務應用所需要的網絡服務。 ![]() CNI需要交付給容器云L2-4層細化至微服務內部的每個Pod容器應用終端交付所需要的L2網絡連接,L3路由,L2-4層安全隔離,容器云整體安全,負載均衡,etc……雖然現有的CNI僅提供非常有限的功能,此部分可通過后邊介紹的NSX Datacenter完整交付。 Service Mesh更多的致力于微服務應用層面的服務治理,致力于L5-7層網絡服務,服務網格在每一個應用容器前部署一個Sidecar Envoy應用代理,提供微服務間的智能路由,分布式負載均衡,流量管理,藍綠,金絲雀發(fā)布,微服務彈性,限流熔斷,超時重試,微服務間的可視化,安全等等。但是Service Mesh并不會替代CNI,他們工作在不同的SDN層次,CNI更多工作在L2-4層,Mesh在5-7層application SDN。Mesh不能獨立于CNI部署。根據Gartner報告指出,在2020年,幾乎100%容器云都將內置Service mesh技術。而目前開源的Istio Service Mesh僅提供單一Kubernetes集群內部微服務治理,缺失異構容器云,跨云能力。 從物理機到虛擬機,再到容器,這是服務器虛擬化技術發(fā)展的必然趨勢,容器解決虛擬機的使用限制,但也將網絡引入更復雜的境地,數據中心網絡要去適應這種變化,要去適配容器,所以才出現了百花齊放的容器網絡方案,這些方案都是為容器而生,從網絡層面去適配容器。希望本文能作為一個引子,讓業(yè)界的同仁能更好在容器化的浪潮下更好的劈波斬浪。 |
|
|