SDN實(shí)戰(zhàn)分享:Docker網(wǎng)絡(luò)使用體驗(yàn)
【編者的話】本文系SDN實(shí)戰(zhàn)團(tuán)微信群(團(tuán)主張宇峰@brocade)組織的線上技術(shù)分享整理而成,由九州云(99Cloud)培訓(xùn)經(jīng)理梁博將他對(duì)于Docker網(wǎng)絡(luò)使用體驗(yàn)和一些技術(shù)方面的理解進(jìn)行了分享。
分享嘉賓
梁博,浙江九州云信息科技有限公司首席架構(gòu)師兼培訓(xùn)業(yè)務(wù)負(fù)責(zé)人,從2012年開始OpenStack研究工作,加入九州云后聯(lián)合創(chuàng)建了 trystack.cn測(cè)試床項(xiàng)目,以及深入OpenStack SDN領(lǐng)域,多次參加各種云計(jì)算活動(dòng)和培訓(xùn)工作,梁老師在九州云擔(dān)任OpenStack奇?zhèn)b之天命判官之前也曾在微軟研發(fā)任職及多次跨界創(chuàng)業(yè)。
我今天和大家分享一下Docker的網(wǎng)絡(luò),主要是基于我的使用體驗(yàn)和對(duì)這里面的一些技術(shù)的理解,也順便聽取一下大家的建議。我是做培訓(xùn)的,大多數(shù)時(shí)候和理論的東西打交道, 順便做一些實(shí)驗(yàn),為了講課的時(shí)候不那么虛。所以,要是問(wèn),在多大規(guī)模下會(huì)是什么樣的,那我就只能說(shuō),我不知道了。
講之前,問(wèn)大家個(gè)問(wèn)題,大家知道docker0是什么嗎?實(shí)現(xiàn)docker的網(wǎng)絡(luò),有很多方式。
這張圖, 是我們?cè)谟胐ocker的時(shí)候,可以用的網(wǎng)絡(luò)連接方式,可以看出,默認(rèn)的docker對(duì)網(wǎng)絡(luò)的管理,使用的linux bridge,這個(gè)bridge的名字就叫docker0。
容器里面有一個(gè)veth連接在這個(gè)bridge上,如果是single host,容器和容器之間的通信會(huì)通過(guò)docker0,在multi host上, 我們可以把物理的網(wǎng)卡bridge到docker0上,那么容器就可以實(shí)現(xiàn)跨主機(jī)的訪問(wèn)。我主要用docker來(lái)做我自己的工具(應(yīng)用), 所以對(duì)網(wǎng)絡(luò)的要求并不復(fù)雜,但是我也考慮過(guò),如果在比較復(fù)雜的環(huán)境,例如你是做云的,或者你的應(yīng)用灰常牛逼,需要幾萬(wàn)個(gè)容器的,那么對(duì)網(wǎng)絡(luò)的要求就會(huì)比較高,在這種場(chǎng)景下,我們就不能單單用docker0了。
我們從應(yīng)用的角度來(lái)看待這個(gè)問(wèn)題,如果我是做web application的,那么就涉及到web midlleware database or other backend的架構(gòu),他們并不在一個(gè)容器里面,甚至不在一臺(tái)物理主機(jī)里面。那么我們?cè)诎l(fā)布多種這樣的應(yīng)用的時(shí)候,就會(huì)需要編排,網(wǎng)絡(luò)的管理。
例如backend通常是在private網(wǎng)絡(luò),而web server是在可以被外網(wǎng)訪問(wèn)到的網(wǎng)絡(luò)里面,那么docker的生態(tài)里面,會(huì)有一些專有的工具來(lái)管理網(wǎng)絡(luò)。這些都做過(guò)一些實(shí)驗(yàn),真正敢說(shuō)自己能在生產(chǎn)環(huán)境用的就只有docker + weave了。不過(guò)我個(gè)人認(rèn)為,所謂的生產(chǎn)環(huán)境,就是被虐了很多遍的POC而已,都是慢慢演進(jìn)來(lái)的。
特別是面對(duì)例如OpenStack,Docker這種新的東西的時(shí)候,可能群里大多比較關(guān)注SDN技術(shù),所以今天就聊聊Docker + OVS吧。docker0比較簡(jiǎn)單,你裝好docker就可以用了。但是ovs需要其他的配置。比如如果我們用k8s,可以使用ovs來(lái)封裝數(shù)據(jù)包,也就是說(shuō)用gre或者vxlan來(lái)打通所有的物理節(jié)點(diǎn)。好吧,概念是一樣的,但是也不一樣。
很多人都會(huì)比較,docker和openstack哪個(gè)好,我覺(jué)得本身他們不是相互取代的,而是共同配合來(lái)完成復(fù)雜的應(yīng)用部署。單個(gè)應(yīng)用無(wú)所謂你用什么,對(duì)吧。我說(shuō)的概念是一樣的,在網(wǎng)絡(luò)層面,他們都是通過(guò)port連接到bridge上面,只不過(guò)ovs的bridge高級(jí)一點(diǎn)。但是有一點(diǎn)不一樣,我們通常在跑虛擬化環(huán)境的時(shí)候,會(huì)心里有個(gè)數(shù)字,就是一臺(tái)物理機(jī)上跑多少虛機(jī)。跑20個(gè),50個(gè)或者100個(gè),這個(gè)是根據(jù)應(yīng)用,在部署之前心里就會(huì)知道個(gè)大概。但是docker管理的是容器,它沒(méi)有虛擬機(jī)里面OS的那層開銷或者說(shuō)很小,所以,一臺(tái)物理機(jī)跑1000個(gè)容器也是有可能的,估計(jì)群里有的朋友試過(guò)。這就對(duì)網(wǎng)絡(luò)本身提出了很大的挑戰(zhàn)
本來(lái)我家里的無(wú)線路由器只要和我的電腦打交道,結(jié)果這哥們帶了一堆設(shè)備回來(lái),現(xiàn)在連個(gè)手表都要IP地址,那么端口一下多了,網(wǎng)絡(luò)就瓶頸了。那么在一臺(tái)物理機(jī)跑很多容器的情況下,我們實(shí)際上不一定需要為每個(gè)容器都分配一個(gè)ip地址。docker可以讓我們?nèi)萜髦g共享網(wǎng)絡(luò)。也就是一個(gè)veth被N個(gè)容器來(lái)使用。
如果docker之下還有其他的cloud環(huán)境,例如AWS,GCE或者OpenStack的話,我們可以把docker的節(jié)點(diǎn)限定為一個(gè)應(yīng)用,這個(gè)應(yīng)用的stack,可以共用一個(gè)網(wǎng)絡(luò)環(huán)境。我們可以docker run --net=xxx或者docker run --net=host來(lái)指定容器的網(wǎng)絡(luò)環(huán)境,這樣用來(lái)減輕ovs管理多個(gè)網(wǎng)絡(luò)的鴨梨。這個(gè)是從單個(gè)host的視角來(lái)看的。
那么如果還是覺(jué)得這樣比較麻煩。那么就把這個(gè)事情交給它上面的管理系統(tǒng)去做。比如說(shuō)k8s,它把你的應(yīng)用做成pod,然后通過(guò)service去發(fā)布,這個(gè)我不細(xì)說(shuō)了。丟個(gè)圖:
可以在一個(gè)pod里面共享一些基礎(chǔ)資源,例如網(wǎng)絡(luò)和存儲(chǔ),service的話,就是讓多個(gè)pod來(lái)做fail over或者LB了。
使用OVS的話,就是:
#p#
所以,因?yàn)?strong>容器比較輕量級(jí),而且對(duì)系統(tǒng)的依賴不強(qiáng),所以到是比虛擬機(jī)更加靈活一點(diǎn)。我們做網(wǎng)絡(luò)管理的時(shí)候,如果是跟虛擬機(jī)打交道,我們得考慮它的管理平臺(tái)是什么,這就是OpenStack Neutron給我們帶來(lái)的一些困擾。它很靈活,但是我們得遵守它的規(guī)則來(lái)玩。我們選擇好了一個(gè)Cloud Platform,才對(duì)網(wǎng)絡(luò)做針對(duì)的設(shè)計(jì)和部署。而Docker的話,我們可以先設(shè)計(jì)好網(wǎng)絡(luò),比如我們就是用ODL這些OF Controller來(lái)管理了一堆設(shè)備,然后把這些設(shè)備下連接的X86 Server里面的OVS打通,然后隨便里面跑哪些業(yè)務(wù),這些業(yè)務(wù)也可以很方便的去做數(shù)據(jù)路徑的管理。甚至做好可視化。因?yàn)閐ocker相對(duì)來(lái)說(shuō),還是比較透明的,不像Neutron里面的tenant network。
在Docker里面,不管使用bridge還是ovs,主要還是通過(guò)namespace在進(jìn)程里面附加到網(wǎng)絡(luò)上。docker0比較簡(jiǎn)單,就是通過(guò) L2/MAC地址學(xué)習(xí)來(lái)進(jìn)行數(shù)據(jù)包的交換,其實(shí)就是在kernel里面做數(shù)據(jù)包轉(zhuǎn)發(fā)。那么docker用了很多l(xiāng)inux本身的東西來(lái)進(jìn)行更上一層的管理。比如使用iptable,它為每個(gè)容器分配了一個(gè)172.xxxx的地址,然后把這段地址里面的轉(zhuǎn)發(fā)都做了masquerade,所以,容器不需要做網(wǎng)絡(luò)的配置,直接可以訪問(wèn)到外部網(wǎng)絡(luò)。所以docker里面的ip地址的翻譯完全是通過(guò)iptable中的SNAT,DNAT來(lái)實(shí)現(xiàn)。
你原來(lái)如果用的docker0,那么部署weave的話,可以直接來(lái)用。剛才說(shuō)到docker本身的網(wǎng)絡(luò),那么就是基于這個(gè)基礎(chǔ)上面, 我們可以做進(jìn)一步的延伸,不能每次都手動(dòng)的--net是吧。所以現(xiàn)在有很多docker的編排系統(tǒng),例如k8s,messos這些。這些工具里面可以有多個(gè)網(wǎng)絡(luò)管理的選擇。特別提一下的是libnetwork,這個(gè)東西是docker搞出來(lái)的,所以直接集成到docker cli里面了。類似neutron一樣,通過(guò)命令,直接來(lái)管理租戶網(wǎng)絡(luò)。除了這個(gè),還有剛才提到的weave, flannel, socketplane等等。當(dāng)然,你也可以把容器直接連到ovs上,讓上面的controller來(lái)管理,這就是說(shuō)docker的網(wǎng)絡(luò)其實(shí)還是比較靈活的,部署的方案會(huì)比較多,我也沒(méi)有一一試過(guò),用的幾本上就是k8s + flannel,要么就是在openstack上面讓neutron去管理網(wǎng)絡(luò),docker作為計(jì)算節(jié)點(diǎn),或者更近一步的,大師兄研究過(guò),使用 openstack的magnum來(lái)管理像k8s這樣的編排工具。那會(huì)比較復(fù)雜,我比較喜歡weave是因?yàn)槲业膽?yīng)用沒(méi)那么復(fù)雜,所以docker0足夠了。因?yàn)槲乙矝](méi)錢去做一個(gè)公有云,讓很多人來(lái)用。這點(diǎn)我倒是覺(jué)得daocloud做的挺好,因?yàn)楣芾響?yīng)用,做CICD比較簡(jiǎn)單和方便。
說(shuō)說(shuō)用docker遇到的問(wèn)題吧,docker目前遇到的網(wǎng)絡(luò)問(wèn)題真不是特別多,因?yàn)榇蠹液芏噙€是拿docker來(lái)做開發(fā)測(cè)試平臺(tái)。
更多的是layered fs的問(wèn)題。不過(guò)既然docker0更簡(jiǎn)單,它是不是應(yīng)該性能更好?更多的是layered fs的問(wèn)題。不過(guò)既然docker0更簡(jiǎn)單,它是不是應(yīng)該性能更好?
如果我們使用的是docker run -P 8080:8080 ,會(huì)在iptable里面生成一條規(guī)則。從這個(gè)report的chart來(lái)看,它實(shí)際上延時(shí)比kvm的還高。
Report地址:http://domino.research.ibm.com/library/cyberdig.nsf/papers/0929052195DD819C85257D2300681E7B/$File/rc25482.pdf
這是IBM的一個(gè)報(bào)告,關(guān)心docker performance的朋友可以用來(lái)做一個(gè)參考,實(shí)際上,我現(xiàn)在試驗(yàn)性的把openstack里面的一些服務(wù)跑在容器里,就是用—net=host這種方式來(lái)跑的,這其實(shí)比較適合一個(gè)docker host跑一個(gè)app stack,在管理應(yīng)用的時(shí)候盡量把a(bǔ)pp stack部署在一個(gè)host上。然后多部署幾臺(tái)主機(jī)用LB的方式來(lái)發(fā)布。如果用docker0的話,還可以讓容器跑在privileged模式下。然后通過(guò)lso, lro來(lái)做offload。
今天就主要從網(wǎng)絡(luò)的角度來(lái)分享一下docker的使用心得。接下來(lái)可以自由發(fā)揮。我能力有限,在線回答不了的話,可以線下討論,我也可以順著大家的問(wèn)題,多做些研究,下次分享。
Q&A
--------------------------------------------------------------------------------------------------
朱堅(jiān)
Q1:現(xiàn)在Docker一般是直接部署在物理server上還是虛擬機(jī)上?如果是在虛機(jī)上部署Docker是不是又更復(fù)雜一些了?
A1:在物理機(jī)和虛擬機(jī)部署上面, 區(qū)別不大。
詼諧童子
Q2:針對(duì)IBM的report,在實(shí)際做網(wǎng)絡(luò)壓力測(cè)試的時(shí)候, docker的docker0其時(shí)沒(méi)有表現(xiàn)出它應(yīng)該有的能力,這個(gè)能力是指capacity還是performance?
A2:Performance
Q3:就是說(shuō)docker0使用的時(shí)候performance不是最佳的對(duì)么?
A3:也不能這么說(shuō),只是說(shuō),它沒(méi)有我們認(rèn)為的樣子好。它會(huì)對(duì)網(wǎng)絡(luò)的延時(shí)帶來(lái)一點(diǎn)影響,從剛才那個(gè)report的chart來(lái)看,它實(shí)際上延時(shí)比kvm的還高。
HongLiang
Q4:測(cè)試報(bào)告70多us是跨物理機(jī),還是單機(jī)內(nèi)部?
A4:用的是2個(gè)機(jī)器,測(cè)試使用的是Mellanox ConnectX-2
肖何
Q5:如果使用docker的大使模式效果如何?通過(guò)幾個(gè)docker共享其中一個(gè)docker veth連接到docker0做proxy轉(zhuǎn)發(fā)?
A5:可以這么做,減少iptable的規(guī)則數(shù)量也對(duì)性能提升有一定的幫助。
Q6:關(guān)于跨主機(jī)的docker通信,有成熟的OVS上gre支持跨主機(jī)的通信,現(xiàn)在docker 1.8后引入SDN功能,通過(guò)控制器也能做到跨主機(jī)的vxlan互通了,這個(gè)有考慮嗎?
A6:當(dāng)然,ovs也是個(gè)不錯(cuò)的選擇。特別是ovs 2.4增加了對(duì)docker網(wǎng)絡(luò)的injection的能力。可以在運(yùn)行時(shí)改變?nèi)萜骼锏木W(wǎng)絡(luò)
Q7:順著openstack我胡亂說(shuō)一點(diǎn),我覺(jué)得docker-server和OpenStack neutron-server好像有點(diǎn)接近,比如NAT/iptables這些,但在node agent,或者說(shuō)分布路由上的思路上差異比較大
A7:docker更多是在本機(jī)做路由。但是也不局限于此。它本身也是可以被其他的L2方案來(lái)接管的
Q8:docker沒(méi)有l(wèi)2/l3 agent類似的plugin實(shí)現(xiàn),它bri-int(veth)不能把tap流量map更復(fù)雜的轉(zhuǎn)發(fā)組件(bri-tun/bri-ext)上,屬于初級(jí)的聚合;而要做分布式路由,docker-server沒(méi)有OF流表下發(fā)這套,上了規(guī)模后,東西向流量處理可能也會(huì)是瓶頸。
A8:可以用docker + ovs來(lái)解決,但是需要類似ODL這樣的controller來(lái)管理,比如引流到某個(gè)設(shè)備
Q9:給docker 直接分ip這個(gè)想法如何?
A9:google就認(rèn)為ip is cheap,盡量分ip給pod
Q10:dock支持ipv6不?
A10:docker 1.5開始支持IPV6
--------------------------------------------------------------------------------------------------
SDN實(shí)戰(zhàn)團(tuán)微信群由Brocade中國(guó)區(qū)CTO張宇峰領(lǐng)銜組織創(chuàng)立,攜手SDN Lab及海內(nèi)外SDN/NFV/云計(jì)算產(chǎn)學(xué)研生態(tài)系統(tǒng)相關(guān)領(lǐng)域?qū)崙?zhàn)技術(shù)牛,每周都會(huì)組織定向的技術(shù)及業(yè)界動(dòng)態(tài)分享,歡迎感興趣的同學(xué)加微信:eigenswing,進(jìn)群參與,您有想聽的話題可以給我們留言。


























