前面說到了Flannel的部署,今天這裡說下Docker跨主機容器間網路通訊的另一個工具Weave的使用。當容器分佈在多個不同的主機上時,這些容器之間的相互通訊變得複雜起來。容器在不同主機之間都使用的是自己的私有IP地址,不同主機的容器之間進行通訊需要將主機的埠對映到容器的埠上,而且IP地址需要使用主機的IP地址。Weave正是為了解決這個問題而出現的,它把不同主機上容器互相連線的網路虛擬成一個類似於本地網路的網路。
如果瞭解SDN技術或者部署過OpenStack的網路模組(Neutron)的話,這裡通過Weave構建的網路與它們比較類似。它是在一個網路的基礎上,構建了一層由軟體定義的網路層,這個網路看起來就像是一個本地的區域網,但是實際上它的底層通過另一個網路進行通訊。這個網路可能會比實際物理區域網的可靠性要差一些,但是從可用性角度來看,它帶來了很大的便利性:可以在位於不同位置的節點之間通訊,而好像它們在一個地方一樣。也可以把這種網路想象成一個類似於VPN似的東西。
Weave介紹
Weave是Github上一個比較熱門的Docker容器網路方案,具有非常良好的易用性且功能強大。Weave 的框架它包含了兩大主要元件: 1)Weave:使用者態的shell指令碼,用於安裝Weave,將container連線到Weave虛擬網路。併為它們分配IP。 2)Weaver:執行於container內,每個Weave網路內的主機都要執行,是一個Go語言實現的虛擬網路路由器。不同主機之間的網路通訊依賴於Weaver路由。 Weave通過建立虛擬網路使Docker容器能夠跨主機通訊並能夠自動相互發現。 通過weave網路,由多個容器構成的基於微服務架構的應用可以執行在任何地方:主機,多主機,雲上或者資料中心。 應用程式使用網路就好像容器是插在同一個網路交換機上一樣,不需要配置埠對映,連線等。 在weave網路中,使用應用容器提供的服務可以暴露給外部,而不用管它們執行在何處。類似地,現存的內部系統也可以接受來自於應用容器的請求,而不管容器執行於何處。 一個Weave網路由一系列的'peers'構成----這些weave路由器存在於不同的主機上。每個peer都由一個名字,這個名字在重啟之後保持不變.這個名字便於使用者理解和區分日誌資訊。 每個peer在每次執行時都會有一個不同的唯一識別符號(UID).對於路由器而言,這些識別符號不是透明的,儘管名字預設是路由器的MAC地址。 Weave路由器之間建立起TCP連線,通過這個連線進行心跳握手和拓撲資訊交換,這些連線可以通過配置進行加密。 peers之間還會建立UDP連線,也可以進行加密,這些UDP連線用於網路包的封裝,這些連線是雙工的而且可以穿越防火牆。 Weave網路在主機上建立一個網橋,每個容器通過veth pari連線到網橋上,容器由使用者或者weave網路的IPADM分配IP地址。
選擇Weave的原因?
1)無憂的配置 Weave網路能夠簡化容器網路的配置。因為weave網路中的容器使用標準的埠提供服務(如,MySQL預設使用3306),管理微服務是十分直接簡單的。 每個容器都可以通過域名來與另外的容器通訊,也可以直接通訊而無需使用NAT,也不需要使用埠對映或者複雜的linking. 部署weave容器網路的最大的好處是無需修改你的應用程式碼。
2)服務發現 Weave網路通過在每個節點上啟動一個"微型的DNS"服務來實現服務發現。你只需要給你的容器起個名字就可以使用服務發現了,還可以在多個同名的容器上提供負載均衡的功能。 3)不需要額外的叢集儲存 所有其它的Docker網路外掛,包括Docker自帶的"overlay"驅動,在你真正能使用它們之間,都需要安裝額外的叢集儲存----一個像Consul或者Zookeepr那樣的中心資料庫. 除了安裝,維護和管理困難外,甚至Docker主機需要始終與叢集儲存保持連線,如果你斷開了與其的連線,儘管很短暫,你也不能夠啟動和停止任何容器了。 Weave網路是與Docker網路外掛捆綁在一起的,這意味著你可以馬上就使用它,而且可以在網路連線出現問題時依舊啟動和停止容器。 關於更多Weave Docker外掛的介紹,請檢視 Weave Network Plugin如何工作. 4)在部分連線情況下進行操作 Weave網路能夠在節點間轉發流量,它甚至能夠在網狀網路部分連線的情況下工作。這意味著你可以在混合了傳統系統和容器化的應用的環境中使用Weave網路來保持通訊。 5)Weave網路很快 Weave網路自動在兩個節點之間選擇最快的路徑,提供接近本地網路的吞吐量和延遲,而且這不需要你的干預。 關於Fast Datapath如何工作請參考 How Fast Datapath Works . 6)組播支援 Weave網路完全支援組播地址和路徑。資料可以被髮送給一個組播地址,資料的副本可以被自動地廣播。 7)NAT 轉換 使用Weave網路,部署你的應用---無論是點對點的檔案共享,基於ip的voice或者其它應用,你都可以充分利用內建的NAT轉換。通過Weave網路,你的app將會是可移值的,容器化的, 加上它對網路標準化的處理,將又會使你少關心一件事。 8)與任何框架整合: Kubernetes, Mesos, Amazon ECS, … 如果你想為所有的框架使用一個工具,Weave網路是一個好的選擇。比如: 除了作為Docker外掛使用,你還可以將其作為一個Kubernetes外掛plugin.你還可以在 Amazon ECS ,Mesos和 Marathon中使用它.
weave網路通訊模型
weave通過在docker叢集的每個主機上啟動虛擬的路由器,將主機作為路由器,形成互聯互通的網路拓撲,在此基礎上,實現容器的跨主機通訊。其主機網路拓撲參見下圖:
如上圖所示,在每一個部署Docker的主機(可能是物理機也可能是虛擬機器)上都部署有一個W(即weave router,它本身也可以以一個容器的形式部署)。 weave網路是由這些weave routers組成的對等端點(peer)構成,並且可以通過weave命令列定製網路拓撲。 每個部署了weave router的主機之間都會建立TCP和UDP兩個連線,保證weave router之間控制面流量和資料面流量的通過。控制面由weave routers之間建立的TCP連線構成,通過它進行握手和拓撲關係資訊的交換通訊。控制面的通訊可以被配置為加密通訊。而資料面由weave routers之間建立的UDP連線構成,這些連線大部分都會加密。這些連線都是全雙工的,並且可以穿越防火牆。 當容器通過weave進行跨主機通訊時,其網路通訊模型可以參考下圖:
從上面的網路模型圖中可以看出,對每一個weave網路中的容器,weave都會建立一個網橋,並且在網橋和每個容器之間建立一個veth pair,一端作為容器網路卡加入到容器的網路名稱空間中,併為容器網路卡配置ip和相應的掩碼,一端連線在網橋上,最終通過宿主機上weave router將流量轉發到對端主機上。 其基本過程如下: 1)容器流量通過veth pair到達宿主機上weave router網橋上。 2)weave router在混雜模式下使用pcap在網橋上截獲網路資料包,並排除由核心直接通過網橋轉發的資料流量,例如本子網內部、本地容器之間的資料以及宿主機和本地容 器之間的流量。捕獲的包通過UDP轉發到所其他主機的weave router端。 3)在接收端,weave router通過pcap將包注入到網橋上的介面,通過網橋的上的veth pair,將流量分發到容器的網路卡上。 weave預設基於UDP承載容器之間的資料包,並且可以完全自定義整個叢集的網路拓撲,但從效能和使用角度來看,還是有比較大的缺陷的: 1)weave自定義容器資料包的封包解包方式,不夠通用,傳輸效率比較低,效能上的損失也比較大。 2)叢集配置比較負載,需要通過weave命令列來手工構建網路拓撲,在大規模叢集的情況下,加重了管理員的負擔。
Weave的安裝與啟動
1)直接從github下載二進位制檔案安裝。weave下載地址:https://pan.baidu.com/s/15SYNmN2Sf0j9f0z0lHM4og 提取密碼:fkst [root@localhost ~]# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave [root@localhost ~]# chmod a+x /usr/local/bin/weave 2)啟動weave路由器,這個路由器其實也是以容器的形式執行的。(前提是已經啟動了docker服務程式) [root@localhost ~]# weave launch Unable to find image 'weaveworks/weaveexec:latest' locally Trying to pull repository docker.io/weaveworks/weaveexec ... latest: Pulling from docker.io/weaveworks/weaveexec 79650cf9cc01: Pull complete a0a33a8311d7: Pull complete e95af5f75fa8: Pull complete 7119d296ce72: Pull complete 7f0698aa2117: Pull complete db711cb12a2b: Pull complete ....... 3)檢視映象,可以發現上面下載的weave路由容器映象 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/weaveworks/weaveexec latest e4870c565dfa 11 hours ago 107.7 MB docker.io/weaveworks/weave latest 70bd2bf0b0eb 11 hours ago 58.22 MB docker.io/weaveworks/weavedb latest 9a4a497119c4 3 months ago 252 B docker.io/centos latest 67591570dd29 5 months ago 191.8 MB 4)此時會發現有兩個網橋,一個是Docker預設生成的,另一個是Weave生成的。 [root@localhost ~]# brctl show #yum安裝bridge-utils工具後,就會出現brctl命令 bridge name bridge id STP enabled interfaces docker0 8000.0242376456d7 no weave 8000.32298bba31f1 no vethwe-bridge 檢視執行的容器,發現weave路由容器已經自動執行 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5aacecbe40e weaveworks/weave:latest "/home/weave/weaver -" 6 minutes ago Up 6 minutes weave weave關閉 [root@localhost ~]# weave stop 或者直接關閉weave容器 [root@localhost ~]# docker stop weave [root@localhost ~]# docker rm weave weave命令幫助 [root@localhost ~]#weave --help Usage: weave --help | help setup version weave launch [--password <pass>] [--trusted-subnets <cidr>,...] [--host <ip_address>] [--name <mac>] [--nickname <nickname>] [--no-restart] [--resume] [--no-discovery] [--no-dns] [--ipalloc-init <mode>] [--ipalloc-range <cidr> [--ipalloc-default-subnet <cidr>]] [--plugin=false] [--proxy=false] [-H <endpoint>] [--without-dns] [--no-multicast-route] [--no-rewrite-hosts] [--no-default-ipalloc] [--hostname-from-label <labelkey>] [--hostname-match <regexp>] [--hostname-replacement <replacement>] [--rewrite-inspect] [--log-level=debug|info|warning|error] <peer> ... weave prime weave env [--restore] config dns-args weave connect [--replace] [<peer> ...] forget <peer> ... weave attach [--without-dns] [--rewrite-hosts] [--no-multicast-route] [<addr> ...] <container_id> detach [<addr> ...] <container_id> weave expose [<addr> ...] [-h <fqdn>] hide [<addr> ...] weave dns-add [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-remove [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-lookup <unqualified_name> weave status [targets | connections | peers | dns | ipam] report [-f <format>] ps [<container_id> ...] weave stop weave reset [--force] rmpeer <peer_id> ... where <peer> = <ip_address_or_fqdn>[:<port>] <cidr> = <ip_address>/<routing_prefix_length> <addr> = [ip:]<cidr> | net:<cidr> | net:default <endpoint> = [tcp://][<ip_address>]:<port> | [unix://]/path/to/socket <peer_id> = <nickname> | <weave internal peer ID> <mode> = consensus[=<count>] | seed=<mac>,... | observer 接下來就可以執行應用容器,使用weave提供的網路功能了。
Weave的應用示例
1)機器環境準備: node-1 103.10.86.238 node-2 103.10.86.239 node-1宿主機上的應用容器my-test1: 192.168.0.2/24 node-2宿主機上的應用容器my-test2: 192.168.0.3/24 兩臺機上均安裝Docker及Weave,並均啟動好Weave路由容器(安裝及啟動操作如上)。最好關閉兩臺機器的防火牆!(如果開啟防火牆,需要開放6783埠) 2)在兩臺機上均啟動一個應用容器,有以下兩種方式: 第一種方式:可以直接使用weave run命令; [root@node-1 ~]# weave run 192.168.0.2/24 -itd docker.io/centos /bin/bash The 'weave run' command has been removed as of Weave Net version 2.0 Please see release notes for further information 由上可知,weave在2.0版本之後就沒有“weave run”這個命令了,所以還是使用下面的第二種方式 第二種方式:先使用docker run啟動好容器,然後使用weave attach命令給容器繫結IP地址 在node-1機器上啟動第一個容器my-test1,容器ip繫結為192.168.0.2 [root@node-1 ~]# docker run -itd --name=my-test1 docker.io/centos /bin/bash 06d70049141048798519bfa1292ed81068fc28f1e142a51d22afd8f3fc6d0239 [root@node-1 ~]# weave attach 192.168.0.2/24 my-test1 #使用容器名稱或容器id都可以;即給my-test1容器繫結ip為192.168.0.2 192.168.0.2 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ifconfig #執行安裝yum install -y net-tools,就會出現ifconfig命令 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 5559 bytes 11893401 (11.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5287 bytes 410268 (400.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.2 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::88b0:ddff:fea2:58c5 prefixlen 64 scopeid 0x20<link> ether 8a:b0:dd:a2:58:c5 txqueuelen 0 (Ethernet) RX packets 97 bytes 7234 (7.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 4316 (4.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 21 bytes 2352 (2.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 2352 (2.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 在node-2機器上啟動容器my-test2,容器ip繫結為192.168.0.3 [root@node-2 ~]# docker run -itd --name=my-test2 docker.io/centos /bin/bash 8f2ecc2449a0be1f1be2825cb211f275f9adb2109249ab0ff1ced6bbb92dd733 [root@node-2 ~]# weave attach 192.168.0.3/24 my-test2 //weave detach 192.168.0.3/24 my-test2表示刪除這個繫結 192.168.0.3 [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ifconfig //或者ip addr命令檢視 ...... ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.3 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::3064:8fff:fe3c:909a prefixlen 64 scopeid 0x20<link> ether 32:64:8f:3c:90:9a txqueuelen 0 (Ethernet) RX packets 63 bytes 4734 (4.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34 bytes 2580 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 溫馨提示: 上面在docker run啟動容器時,可以新增--net=none引數,這個表示容器啟動後不使用預設的虛擬網路卡docker0自動分配的ip,而是使用weave繫結的ip; 當然也可以選擇不新增這個引數去啟動容器,這樣,容器啟動後就會有兩個網路卡,即兩個ip: 一個是docker0自動分配的ip,這個適用於同主機內的容器間通訊,即同主機的容器使用docker0分配的ip可以相互通訊;另一個就是weave網橋繫結的ip。 3)容器互聯 預設情況下,上面在node-1和node-2兩臺宿主機上建立的2個容器間都是相互ping不通的。需要使用weave connect命令在兩臺weave的路由器之間建立連線。 [root@node-1 ~]# weave connect 103.10.86.239 //連線的是對方宿主機的ip,注意"weave forget ip" z則表示斷開這個連線 然後就會發現,此時位於兩臺不同主機上的相同子網段內的容器之間可以相互ping通了 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=3.27 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.657 ms ..... [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.453 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.320 ms ..... 再在node-1上啟動容器my-test3,繫結ip為192.168.0.8,在node-2上啟動容器my-test4,繫結ip為192.168.0.10,會發現這四個在同一個子網內的容器都是可以相互ping通的! 因此:只有兩個能通訊的宿主機做了weave connect操作,則在他們倆上建立並weave attach繫結同網段的容器都是可以相互之間通訊的! -------------------------------------------------------------------------------------------------------- 再接著啟動與上面不在同一個子網內的容器 node-1上啟動容器my-test4,繫結ip為192.168.10.10,node-2上啟動容器my-test5,繫結ip為192.168.10.20 [root@node-1 ~]# docker run -itd --name=my-test5 docker.io/centos /bin/bash 2896b6cad7afcd57d8b9091a020f1837992bade2567752614caf3cb645b6d315 [root@node-1 ~]# weave attach 192.168.10.10/24 my-test5 192.168.10.10 [root@node-1 ~]# docker exec -ti my-test5 /bin/bash [root@2896b6cad7af /]# [root@node-2 ~]# docker run -itd --name=my-test6 docker.io/centos /bin/bash b4627f0a6e657f5dc719c917349ad832e15f360f75d5743b489f8e7e18b7dc2e [root@node-2 ~]# weave attach 192.168.10.20/24 my-test6 192.168.10.20 [root@node-2 ~]# docker exec -ti my-test6 /bin/bash [root@b4627f0a6e65 /]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.417 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.324 ms ...... 會發現在跨主機情況下,相同子網內的容器是可以相互通訊的;但是處於不同子網的兩個容器是不能互聯的,儘管這兩個容器在同一個主機下也是不能通訊的! 這樣的好處就是:使用不同子網進行容器間的網路隔離了。 -------------------------------------------------------------------------------------------------------- 注意一個細節,在使用weave的時候: 1)如果使用Docker的原生網路,在容器內部是可以訪問宿主機以及外部網路的。也就是說在啟動容器的時候,使用了虛擬網路卡docker0分配ip, 這種情況下,登陸容器後是可以ping通宿主機ip,並且可以對外聯網的! 這個時候,在宿主機上是可以ping通docker0網橋的ip,但是ping不通weave網橋的ip。這個時候可以使用 "weave expose 192.168.0.1/24"命令來給weave網橋新增IP,以實現容器與宿主機網路連通。如下: 預設在node-1和node-2宿主機上是ping不通my-test1容器的weave網橋ip的 [root@node-1 ~]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... [root@node-2 ~]# ping 192.168.0.3 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... 在node-1和node-2兩臺機器上都新增weave網橋的ip [root@node-1 ~]# weave expose 192.168.0.1/24 //注意這裡的192.168.0.1/24是上面my-test1、my-test2、my-test3、my-test4容器的weave網橋的閘道器地址 [root@node-2 ~]# weave expose 192.168.0.1/24 //weave hide 192.168.0.1/24表示覆蓋/刪除這個設定 然後再在兩臺宿主機上ping上面同網段內的容器,發現都可以ping通了 [root@node-1 ~]# ping 192.168.0.10 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.363 ms [root@node-2 ~]# ping 192.168.0.8 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.363 ms 然後再給另一網段的容器的weave網橋新增ip(可以在宿主機上對不同網段的容器的weave網橋新增ip) [root@node-1 ~]# weave expose 192.168.10.1/24 [root@node-2 ~]# weave expose 192.168.10.1/24 [root@node-1 ~]# ping 192.168.10.20 PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=2.50 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.318 ms [root@node-2 ~]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.335 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.310 ms 2)如果不適用Docker的原生網路,即在容器啟動的時候,新增--net=none,這樣容器啟動後,就不會使用docker0網路卡分配ip。 這種情況下,登陸容器後發現不能訪問宿主機以及外部網路的,而在宿主機上也不能ping通容器ip。 這個時候新增對應容器網段的weave網橋ip,這樣可以實現容器與宿主機網路連通。但是,此時在容器內部依然不能訪問外部網路。 所以說,可以同時使用Docker的原生網路和weave網路來實現容器互聯及容器訪問外網和埠對映。 使用外部網路及埠對映的時候就使用docker0網橋,需要容器互聯的時候就使用weave網橋。每個容器分配兩個網路卡。
weave的其他特性
1)應用隔離: 不同子網容器之間預設隔離的,即便它們位於同一臺物理機上也相互不通(使用-icc=false關閉容器互通);不同物理機之間的容器預設也是隔離的 2)安全性: 可以通過weave launch -password wEaVe設定一個密碼用於weave peers之間加密通訊 3)檢視weave路由狀態:weave ps [root@node-1 ~]# weave ps weave:expose 06:9d:3b:91:3d:f3 192.168.0.1/24 192.168.10.1/24 2896b6cad7af 56:46:8c:14:42:e6 192.168.10.10/24 c9aa381c1203 4a:0d:16:4d:bb:c2 192.168.0.8/24 00efd39d3a7d 8a:b0:dd:a2:58:c5 192.168.0.2/24 [root@node-2 ~]# weave ps weave:expose 26:b8:82:03:ff:24 192.168.0.1/24 192.168.10.1/24 b4627f0a6e65 22:10:c4:b8:87:b3 192.168.10.20/24 61722c59e3a0 d2:d5:34:1e:86:df 192.168.0.10/24 e0ed62d30226 32:64:8f:3c:90:9a 192.168.0.3/24 4)效率 weave 路由通過pcap捕獲包這種方式來完成封裝和解封裝這個過程,效率應該是有問題的。 這個過程中需要將資料包從核心態拷貝到使用者態,然後按照自定義的格式完成封裝和解封裝。 -------------------------------------------------------------------------------------------------- 在已經關閉了weave(weave stop)後,發現weave網橋資訊還在: [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no weave 8000.22a85b2682a1 no vethwe-bridge [root@node-2 ~]# ifconfig ........ weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::20a8:5bff:fe26:82a1 prefixlen 64 scopeid 0x20<link> ether 22:a8:5b:26:82:a1 txqueuelen 0 (Ethernet) RX packets 57 bytes 3248 (3.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 1460 (1.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 刪除weave網橋資訊(其他ifconfig命令查出的網路裝置刪除的方法類似): [root@node-2 ~]# ip link set dev weave down [root@node-2 ~]# brctl delbr weave [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no