Docker網絡解決方案 - Weave部署記錄


 

前面說到了Flannel的部署,今天這里說下Docker跨主機容器間網絡通信的另一個工具Weave的使用。當容器分布在多個不同的主機上時,這些容器之間的相互通信變得復雜起來。容器在不同主機之間都使用的是自己的私有IP地址,不同主機的容器之間進行通訊需要將主機的端口映射到容器的端口上,而且IP地址需要使用主機的IP地址。Weave正是為了解決這個問題而出現的,它把不同主機上容器互相連接的網絡虛擬成一個類似於本地網絡的網絡。

如果了解SDN技術或者部署過OpenStack的網絡模塊(Neutron)的話,這里通過Weave構建的網絡與它們比較類似。它是在一個網絡的基礎上,構建了一層由軟件定義的網絡層,這個網絡看起來就像是一個本地的局域網,但是實際上它的底層通過另一個網絡進行通信。這個網絡可能會比實際物理局域網的可靠性要差一些,但是從可用性角度來看,它帶來了很大的便利性:可以在位於不同位置的節點之間通信,而好像它們在一個地方一樣。也可以把這種網絡想象成一個類似於VPN似的東西。

一.  weave介紹
Weave是由weaveworks公司開發的解決Docker跨主機網絡的解決方案,它能夠創建一個虛擬網絡,用於連接部署在多台主機上的Docker容器,這樣容器就像被接入了同一個網絡交換機,那些使用網絡的應用程序不必去配置端口映射和鏈接等信息。外部設備能夠訪問Weave網絡上的應用程序容器所提供的服務,同時已有的內部系統也能夠暴露到應用程序容器上。Weave能夠穿透防火牆並運行在部分連接的網絡上,另外,Weave的通信支持加密,所以用戶可以從一個不受信任的網絡連接到主機。

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網絡插件捆綁在一起的,這意味着你可以馬上就使用它,而且可以在網絡連接出現問題時依舊啟動和停止容器。

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實現原理
容器的網絡通訊都通過route服務和網橋轉發。Weave會在主機上創建一個網橋,每一個容器通過 veth pair 連接到該網橋上,同時網橋上有個 Weave router 的容器與之連接,該router會通過連接在網橋上的接口來抓取網絡包(該接口工作在Promiscuous模式)。

在每一個部署Docker的主機(可能是物理機也可能是虛擬機)上都部署有一個W(即Weave router),它本身也可以以一個容器的形式部署。Weave run的時候就可以給每個veth的容器端分配一個ip和相應的掩碼。veth的網橋這端就是Weave router容器,並在Weave launch的時候分配好ip和掩碼。

Weave網絡是由這些weave routers組成的對等端點(peer)構成,每個對等的一端都有自己的名字,其中包括一個可讀性好的名字用於表示狀態和日志的輸出,一個唯一標識符用於運行中相互區別,即使重啟Docker主機名字也保持不變,這些名字默認是mac地址。

每個部署了Weave router的主機都需要將TCP和UDP的6783端口的防火牆設置打開,保證Weave router之間控制面流量和數據面流量的通過。控制面由weave routers之間建立的TCP連接構成,通過它進行握手和拓撲關系信息的交換通信。 這個通信可以被配置為加密通信。而數據面由Weave routers之間建立的UDP連接構成,這些連接大部分都會加密。這些連接都是全雙工的,並且可以穿越防火牆。

四.  weave優劣勢
Weave優勢
->  支持主機間通信加密。
->  支持container動態加入或者剝離網絡。
->  支持跨主機多子網通信。

Weave劣勢
->  只能通過weave launch或者weave connect加入weave網絡。

五.  安裝weave
所有節點都需要安裝。Weave不需要集中式的 key-value 存儲,所以安裝和運行都很簡單。直接把Weave二進制文件下載到系統中就可以了.

[root@localhost ~]# curl -L git.io/weave -o /usr/local/bin/weave
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
  0     0    0   595    0     0    152      0 --:--:--  0:00:03 --:--:--  1081
100 52227  100 52227    0     0    252      0  0:03:27  0:03:27 --:--:--   362

[root@localhost ~]# chmod a+x /usr/local/bin/weave

測試是否安裝成功 (前提是要安裝並啟動了docker服務)
[root@localhost ~]# weave version                 
weave script 2.5.1
Unable to find image 'weaveworks/weaveexec:2.5.1' locally
Trying to pull repository docker.io/weaveworks/weaveexec ... 
2.5.1: Pulling from docker.io/weaveworks/weaveexec
a073c86ecf9e: Pull complete 
950f028f729b: Pull complete 
d1298aa928c2: Pull complete 
1d157c01c74e: Pull complete 
c458f7a37ca6: Pull complete 
49a09e96fcfc: Pull complete 
6d57eb599283: Pull complete 
259765bea433: Pull complete 
c11f30d06b58: Pull complete 
Digest: sha256:ad53aaabf648548ec26cceac3ab49394778322e1623f0d184a2b74ad06338087
Status: Downloaded newer image for docker.io/weaveworks/weaveexec:2.5.1
weave 2.5.1

[root@localhost ~]# weave version                 
weave script 2.5.1
weave 2.5.1

weave version 默認不會下載對應容器, 需要運行"weave launch" 來啟動相關服務
[root@localhost ~]# weave launch
............

[root@localhost ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker.io/weaveworks/weaveexec    2.5.1               4cccd7ef6421        2 months ago        166 MB
docker.io/weaveworks/weave        2.5.1               a57b99d67ee7        2 months ago        111 MB
docker.io/weaveworks/weavedb      latest              4ac51c93545a        5 months ago        698 B

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                              PORTS               NAMES
d4ac34859c88        weaveworks/weave:2.5.1        "/home/weave/weave..."   57 seconds ago      Up 56 seconds                                           weave

六.  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承載容器之間的數據包,並且可以完全自定義整個集群的網絡拓撲,但從性能和使用角度來看,還是有比較大的缺陷的:
->  weave自定義容器數據包的封包解包方式,不夠通用,傳輸效率比較低,性能上的損失也比較大。
->  集群配置比較負載,需要通過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.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.391 ms
64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.363 ms

[root@node-2 ~]# 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=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	


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM