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

使用Docker網(wǎng)絡(luò)解決方案weave遇到的那些坑

企業(yè)動態(tài)
Weave 作為 Docker 跨主機(jī)集群網(wǎng)絡(luò)解決方案的一種,可以用于連接部署在多臺主機(jī)上的 Docker 容器, 由于 odp 功能和內(nèi)核相關(guān)模塊結(jié)合較為緊密,在實際使用中可能遇到一些和內(nèi)核相關(guān)的坑,本文描述的兩個問題都和內(nèi)核有關(guān)系。

前言

Weave 作為 Docker 跨主機(jī)集群網(wǎng)絡(luò)解決方案的一種,可以用于連接部署在多臺主機(jī)上的 Docker 容器,使用網(wǎng)絡(luò)的應(yīng)用程序不必去配置端口映射等信息,Weave的通信支持加密,所以用戶可以從一個不受信任的網(wǎng)絡(luò)連接到主機(jī)。Weave 在控制層面和 Calico 類似,在數(shù)據(jù)層面通過UDP封裝實現(xiàn) L2 overlay 。 Weave 在 1.2 版本之前都是使用 usersapce 實現(xiàn),在 weave-1.2版本后, weave 結(jié)合了內(nèi)核的 openvswitch 模塊,實現(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 fastdp造成虛擬機(jī)網(wǎng)絡(luò)中斷

1. 問題描述

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

2. 問題分析

造成網(wǎng)絡(luò)斷開的原因是因為觸發(fā)了內(nèi)核的一個 bug ,該內(nèi)核 bug 的 commit 鏈接地址:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=8a0cafc9a8131cc545dc9924aed38f7176ee4ad7 。

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

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

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

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

3. 解決方案

有兩種方式可以解決該問題:

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

2)關(guān)閉虛擬機(jī)網(wǎng)卡的 ufo 特性,centos7.1 的 kernel-3.10.229 內(nèi)核已經(jīng)修復(fù)了該問題。

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

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

坑二:Weave無法使用fastdp模式

1. 問題描述

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

2. 問題分析

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

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

出現(xiàn)的錯誤icmp報文

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

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

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

通過上面的代碼可以看出,如果出現(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ā)送報文時,發(fā)送了 ICMP 目的不可達(dá),并且錯誤碼為 ICMP_FRAG_NEEDED 的報文。

  1. void skb_scrub_packet(struct sk_buff *skb, bool xnet) 
  2.  
  3.  
  4. skb->tstamp.tv64 = 0
  5.  
  6. skb->pkt_type = PACKET_HOST
  7.  
  8. skb->skb_iif = 0
  9.  
  10. skb->ignore_df = 0
  11.  
  12. skb_dst_drop(skb); 
  13.  
  14. secpath_reset(skb); 
  15.  
  16. nf_reset(skb); 
  17.  
  18. nf_reset_trace(skb); 
  19.  
  20. if (!xnet) 
  21.  
  22. return; 
  23.  
  24. skb_orphan(skb); 
  25.  
  26. skb->mark = 0
  27.  

上面代碼是 centos 7 的 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 )進(jìn)行重新的初始化,也就是 skb->local_df 值仍舊為1,因此在該版本上不會出現(xiàn)該問題。

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

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

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

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

3. 解決方案

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

總結(jié)

Weave 的 odp 功能使用了內(nèi)核的特性,在使用 weave 的 fastdp 功能時遇到上面兩個問題,都是和內(nèi)核有著緊密聯(lián)系,通過對內(nèi)核層面的分析,可以定位到問題的根因。在后續(xù)遇到類似問題時,可以多從內(nèi)核的角度進(jìn)行考慮。

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

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

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

2017-06-23 11:20:00

DockerWeave內(nèi)核

2019-12-05 08:44:20

MybatisSQL場景

2015-12-02 15:35:08

Redis Clust遷移解決方案

2024-06-24 00:30:00

2021-08-31 07:57:21

輪詢鎖多線編程Java

2021-10-18 07:58:33

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

2010-12-24 12:49:39

2013-05-27 09:21:05

虛擬化IT企業(yè)應(yīng)用

2017-08-03 09:37:35

SparkStreamKafkaDirect

2016-12-30 11:10:32

Hadoop開發(fā)JVM

2009-10-27 15:35:08

2013-05-13 10:03:04

git

2009-01-20 14:51:08

視頻監(jiān)控以太網(wǎng)光纖

2009-03-05 09:12:29

IDC網(wǎng)絡(luò)管理

2011-03-07 15:36:10

2009-06-09 10:16:13

思科不連續(xù)網(wǎng)絡(luò)配置

2016-07-09 13:17:12

銳捷網(wǎng)絡(luò)智慧機(jī)場解決方案

2018-10-12 14:34:13

2011-10-14 10:37:47

虛擬機(jī) 負(fù)載

2010-10-20 16:01:29

網(wǎng)絡(luò)管理解決方案網(wǎng)絡(luò)管理
點贊
收藏

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

主站蜘蛛池模板: 欧美激情一区二区 | 黄色网址在线免费观看 | 欧美在线观看一区 | 男插女下体视频 | 亚洲视频在线看 | av影音| 日韩欧美三区 | 一级片网址 | 日韩精品一区二区三区在线观看 | 国产黄色麻豆视频 | 日本黄色高清视频 | 国产成视频在线观看 | 日韩二 | 91成人在线| 亚洲一区视频 | 99精品久久久| 亚洲欧美日韩网站 | 中文字幕一区二区三区四区 | 久久r精品| 国产精品欧美一区二区 | 日日操操操 | 国产高清一区二区 | 久久久久久国产 | 一呦二呦三呦国产精品 | 欧美在线一区二区三区 | 在线观看成人精品 | www.一区二区三区.com | 国产三区四区 | 色片在线观看 | 一级毛片视频 | 国产日韩久久久久69影院 | 精品国产一区二区三区久久久久久 | 亚洲高清在线 | 久久成人精品视频 | 一级a毛片| 91精品国产麻豆 | 精品中文字幕在线观看 | 日韩在线精品视频 | 欧美高清性xxxxhd | 免费在线视频精品 | 久草网在线视频 |