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