成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何跨過(guò)使用Docker網(wǎng)絡(luò)解決方案Weave遇到的“坑”?

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

前言

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

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

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

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

1. 問(wèn)題描述

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

問(wèn)題分析導(dǎo)致網(wǎng)絡(luò)斷開(kāi)的原因是由于觸發(fā)了內(nèi)核的一個(gè)bug,該內(nèi)核bug的commit鏈接地址:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=8a0cafc9a8131cc545dc9924aed38f7176ee4ad7 (網(wǎng)址過(guò)長(zhǎng),可輸入http://t.cn/Ro53BsH 查看)

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

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

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

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

2. 解決方法

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

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

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

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

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

坑二:Weave無(wú)法使用FastDb模式

1. 問(wèn)題描述

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

2. 問(wèn)題分析

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

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

在MTU為1454的情況下,會(huì)出現(xiàn)下面的ICMP錯(cuò)誤報(bào)文。

出現(xiàn)的錯(cuò)誤ICMP報(bào)文

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

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

  1. if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->ignore_df) || 
  2.                    (IPCB(skb)->frag_max_size && 
  3.                     IPCB(skb)->frag_max_size > mtu))) { 
  4.               IP_INC_STATS(dev_net(dev), IPSTATS_MIB_FRAGFAILS); 
  5.               ICMP_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, 
  6.                        htonl(mtu)); 
  7.               kfree_skb(skb); 
  8.               return -EMSGSIZE; 
  9.        } 

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

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

  1. void skb_scrub_packet(struct sk_buff *skb, bool xnet) 
  2.         skb->tstamp.tv64 = 0
  3.         skb->pkt_type = PACKET_HOST
  4.         skb->skb_iif = 0
  5.          skb->ignore_df = 0
  6.          skb_dst_drop(skb); 
  7.          secpath_reset(skb); 
  8.          nf_reset(skb); 
  9.          nf_reset_trace(skb); 
  10.          if (!xnet) 
  11.                  return; 
  12.          skb_orphan(skb); 
  13.          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ù)并沒(méi)有對(duì)skb->local_df(低版本內(nèi)核使用local_df)進(jìn)行重新初始化,也就是skb->local_df值仍舊為1,因此在該版本上不會(huì)出現(xiàn)上述問(wèn)題。

  1. static inline void 
  2. secpath_reset(struct sk_buff *skb) 
  3. #ifdef CONFIG_XFRM 
  4.         secpath_put(skb->sp); 
  5.         skb->sp = NULL
  6. #endif 

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

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

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

解決方法

保證接口的MTU值為默認(rèn)為1500。

總結(jié)

Weave的ODP功能使用了內(nèi)核特性,在使用Weave的FastDb功能時(shí)遇到上述兩個(gè)問(wèn)題都與內(nèi)核密切相關(guān)。通過(guò)對(duì)內(nèi)核層分析,可以定位到問(wèn)題的根本原因,所以后續(xù)遇到類(lèi)似問(wèn)題時(shí),可以多從內(nèi)核角度進(jìn)行考慮。

【本文是51CTO專(zhuān)欄機(jī)構(gòu)作者“大U的技術(shù)課堂”的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)(ucloud2012)聯(lián)系作者】

 戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-08-01 05:44:10

Dockerweave虛擬機(jī)

2015-12-02 15:35:08

Redis Clust遷移解決方案

2024-06-24 00:30:00

2019-12-05 08:44:20

MybatisSQL場(chǎng)景

2021-08-31 07:57:21

輪詢(xún)鎖多線(xiàn)編程Java

2021-10-18 07:58:33

MyBatis Plu數(shù)據(jù)庫(kù)批量插入

2010-12-24 12:49:39

2009-02-19 10:13:00

2009-10-19 17:30:45

智能網(wǎng)絡(luò)布線(xiàn)解決方案

2017-08-03 09:37:35

SparkStreamKafkaDirect

2018-08-09 05:40:27

SD-WANWAN廣域網(wǎng)

2020-09-02 07:34:15

NDR網(wǎng)絡(luò)檢測(cè)和響應(yīng)網(wǎng)絡(luò)安全

2009-10-27 15:35:08

2021-09-06 13:45:21

數(shù)據(jù)驅(qū)動(dòng)大數(shù)據(jù)SaaS

2022-07-13 15:03:23

網(wǎng)絡(luò)安全數(shù)據(jù)安全遠(yuǎn)程工作

2013-05-13 10:03:04

git

2023-04-14 14:14:52

物聯(lián)網(wǎng)IoT

2023-02-03 17:10:55

物聯(lián)網(wǎng)智能停車(chē)

2022-11-08 14:17:39

2017-05-11 17:11:13

SDNOpenFlow網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 毛片链接 | 日韩亚洲欧美综合 | 狼色网 | 四虎免费视频 | 亚洲精品视频二区 | 亚洲日本成人 | 成人免费视频在线观看 | 欧洲亚洲精品久久久久 | 岛国av一区二区 | 狠狠综合久久av一区二区老牛 | 黄色大片免费播放 | a看片| 欧美日韩在线精品 | 91色在线 | 国产jizz女人多喷水99 | 天天摸天天干 | 亚洲高清在线观看 | 日本爱爱视频 | 精品香蕉一区二区三区 | 天天插天天操 | 久久亚洲一区二区三 | 国产精品国产精品国产专区不卡 | www久久99 | 欧美亚洲国产成人 | 九色国产 | 中文天堂在线一区 | 欧产日产国产精品v | 激情网五月天 | 男女在线网站 | 亚洲香蕉 | 亚洲福利av | 黄视频网站免费观看 | 国产一区二区三区四区五区加勒比 | 男女那个视频 | 国产精品黄色 | 天天操天天射天天 | 一区二区三区国产精品 | 亚洲综合色 | 久久这里只有精品首页 | 久久精品欧美一区二区三区不卡 | 一本色道精品久久一区二区三区 |