溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑

發(fā)布時間:2021-12-13 17:27:43 來源:億速云 閱讀:146 作者:iii 欄目:云計算

這篇文章主要介紹“怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑”,在日常操作中,相信很多人在怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

前 言

Weave作為Docker(一個開源的應(yīng)用容器引擎)跨主機集群網(wǎng)絡(luò)解決方案的一種,可以用于連接部署在多臺主機上的Docker容器,使用網(wǎng)絡(luò)的應(yīng)用程序不必去配置端口映射、鏈接等信息。另外,Weave的通信支持加密,用戶可以從一個不受信任的網(wǎng)絡(luò)連接到主機。

Weave在控制層和Calico類似,在數(shù)據(jù)層通過UDP封裝實現(xiàn)L2 overlay。Weave在1.2 版本之前都是通過usersapce實現(xiàn),在Weave-1.2版本之后,Weave結(jié)合了內(nèi)核Open vSwitch模塊,實現(xiàn)了Open vSwitch datapath(ODP)功能,結(jié)合kernel的vxlan特性,在網(wǎng)絡(luò)性能上有較大提升。

由于ODP功能與內(nèi)核相關(guān)模塊結(jié)合較為緊密,因此在實際使用中可能會遇到一些與內(nèi)核相關(guān)的“坑”。本文描述的這兩個問題都跟內(nèi)核有關(guān)系。

坑一:使用Weave FastDb造成網(wǎng)絡(luò)中斷

問題描述

在Weave的1.2版本之后,考慮到原先sleeve模式網(wǎng)絡(luò)性能較差,故增加FastDb模式,該模式也成為Weave啟動時的默認模式。在FastDb模式中使用了kernel中的Open vSwitch模塊,做報文封裝時使用vxlan協(xié)議。在使用qemu-kvm創(chuàng)建的云主機上,如果安裝CentOS7.0,內(nèi)核版本為kernel-3.10.123,那么在啟動Weave并使用FastDb模式時,會造成virtio_net虛擬網(wǎng)卡無法發(fā)送數(shù)據(jù),進而導(dǎo)致整個虛擬機的網(wǎng)絡(luò)中斷。

問題分析

導(dǎo)致網(wǎng)絡(luò)斷開的原因是由于觸發(fā)了內(nèi)核的一個bug,該內(nèi)核bug的commit鏈接地址http://t.cn/Ro53BsH。

觸發(fā)該bug主要是因為Weave在初始化時會發(fā)送一個60000字節(jié)的UDP數(shù)據(jù)包進行PMTU探測,并且 Weave發(fā)送使用的套接字為raw socket,導(dǎo)致virtio_net使用的內(nèi)存被污染,具體表現(xiàn)就是無法通知到宿主機上vhost獲取數(shù)據(jù),在接口上看到發(fā)送報文的計數(shù)始終不會增加。

該問題不是只有Weave才能觸發(fā),用普通應(yīng)用程序建立socket時使用raw socket,并且發(fā)送的數(shù)據(jù)大于接口的MTU值,接口的UFO功能是打開的,這些情況下都極有可能觸發(fā)該問題,造成網(wǎng)絡(luò)中斷。

怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑

(圖1:FastDb模式的數(shù)據(jù)流原理)

解決方法

1、升級內(nèi)核,保證內(nèi)核版本大于等于3.13;

2、關(guān)閉虛擬機網(wǎng)卡的ufo特性;

3、CentOS7.1的kernel-3.10.229內(nèi)核已經(jīng)修復(fù)了該問題。

怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑

(圖2:guest通知vhost讀取數(shù)據(jù)流程)

坑二:Weave無法使用FastDb模式

問題描述

在內(nèi)核版本CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core)上 ,Weave版本大于1.2,如果云主機的MTU值為1450或者小于1474,Weave啟動時無法正常選擇Fast Data Path模式。在Weave啟動后一直選擇sleeve模式,本應(yīng)該默認模式為FastDb,該問題也和內(nèi)核的版本相關(guān)。

問題分析

Weave的Fast Data Path路徑使用到ODP技術(shù),也就是內(nèi)核中的OVS模塊,在Container中直接發(fā)送數(shù)據(jù)包到ovs模塊。在啟動Weave時,會自動選擇使用sleeve模式還是FastDb模式,這里通過發(fā)送心跳包來決定。出現(xiàn)該問題時,在云主機通過Docker logs Weave日志可以看到出錯信息:"FastDb timed out waiting for vxlan heartbeat"。

heartbeat數(shù)據(jù)包是一個UDP包,目的端口號為6784,在某些云主機上接口的MTU值為1454,但在發(fā)送UDP的heartbeat數(shù)據(jù)包時,發(fā)送的是1474字節(jié),這樣就會對報文在IP層進行分片,而在主機上發(fā)現(xiàn)心跳報文發(fā)送不出去,當MTU的值修改為1500后,就可以發(fā)送出去。

在MTU為1454的情況下,會出現(xiàn)下面的ICMP錯誤報文:

怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑

(圖3: 出現(xiàn)的錯誤ICMP報文)

上面出現(xiàn)錯誤的ICMP報文是內(nèi)核中的ip_fragment函數(shù)調(diào)用ICMP_send函數(shù)發(fā)送的:

if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->ignore_df) ||

(IPCB(skb)->frag_max_size &&

IPCB(skb)->frag_max_size > mtu))) {

IP_INC_STATS(dev_net(dev), IPSTATS_MIB_FRAGFAILS);

ICMP_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,

htonl(mtu));

kfree_skb(skb);

return -EMSGSIZE;}

通過上述代碼可以看出,如果出現(xiàn)錯誤ICMP報文,下面的判斷條件iph->frag_off & htons(IP_DF)) && !skb->ignore_df 需要成立。通過對抓取的報文分析可知iph->frag_off & htons(IP_DF))的值為真,那么skb->ignore_df值需要為0,而此處的關(guān)鍵在于skb->ignore_df的值是何時賦值為0的。

通過分析Weave發(fā)送心跳包的流程可知,在vxlan_tnl_send函數(shù)中,對skb->ignore_df賦值為1,最后調(diào)用tunnel的發(fā)送函數(shù)iptunnel_xmit時,調(diào)用了skb_scrub_packet函數(shù),在該函數(shù)中又重新對skb->ignore_df賦值為0(kernel版本為:3.10.0-327.el7),造成后續(xù)發(fā)送報文時,ICMP目的不可達,并且錯誤碼為ICMP_FRAG_NEEDED的報文。

void skb_scrub_packet(struct sk_buff *skb, bool xnet){

skb->tstamp.tv64 = 0;

skb->pkt_type = PACKET_HOST;

skb->skb_iif = 0;

skb->ignore_df = 0;

skb_dst_drop(skb);

secpath_reset(skb);

nf_reset(skb);

nf_reset_trace(skb);

if (!xnet)

return;

skb_orphan(skb);

skb->mark = 0;

}

上面代碼是CentOS7的3.10.0-327.el7,而在一些舊內(nèi)核版本3.10.0-123.el7上,iptunnel_xmit調(diào)用的是secpath_reset(skb)函數(shù),該函數(shù)并沒有對skb->local_df(低版本內(nèi)核使用local_df)進行重新初始化,也就是skb->local_df值仍舊為1,因此在該版本上不會出現(xiàn)上述問題。

static inline void

secpath_reset(struct sk_buff *skb){

#ifdef CONFIG_XFRM

secpath_put(skb->sp);

skb->sp = NULL;

#endif}

怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑

(圖4:內(nèi)核版本不同造成設(shè)置不同)

雖然新的內(nèi)核版本中存在該問題,不過內(nèi)核本身沒有問題,還是Weave用戶態(tài)管理datapath程序與內(nèi)核適配上出現(xiàn)問題(它并不是使用ovs-switchd),在OVS中對tunnel類型可以設(shè)置為df_default=false進行分片。

解決方法

保證接口的MTU值為默認為1500。

到此,關(guān)于“怎么跨過Docker集群網(wǎng)絡(luò)Weave遇到的坑”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI