Docker系列(十三):Docker 跨主機容器間網絡通信(二)

上一篇記錄了使用Docker原生網絡進行跨主機容器間網絡通信的方法,本篇主要介紹如何使用第三方網絡項目進行跨主機容器間通信。

第三方網絡項目跨主機通信分爲隧道方案和路由方案,隧道方案主要介紹Flannel、Weave和OpenvSwitch,路由方案則介紹Calico。


Flannel網絡:

Flannel是CoreOS團隊針對Kubernetes設計的一個網絡規劃服務,簡單來說,它的功能是讓集羣中的不同節點主機創建的Docker容器都具有全集羣唯一的虛擬IP地址。

Flannel的設計目的就是爲集羣中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重複的”IP地址,並讓屬於不同節點上的容器能夠直接通過內網IP通信。

工作原理:

    Flannel的工作原理是每個主機配置一個ip段和子網個數。例如,可以配置一個覆蓋網絡使用 10.100.0.0/16段,每個主機/24個子網。因此主機a可以接受10.100.5.0/24,主機B可以接受10.100.18.0/24的包。flannel使用etcd來維護分配的子網到實際的ip地址之間的映射。對於數據路徑,flannel 使用udp來封裝ip數據報,轉發到遠程主機。選擇UDP作爲轉發協議是因爲他能穿透防火牆。例如,AWS Classic無法轉發IPoIP or GRE 網絡包,是因爲它的安全組僅僅支持TCP/UDP/ICMP。

    Flannel 使用etcd存儲配置數據和子網分配信息。flannel 啓動之後,後臺進程首先檢索配置和正在使用的子網列表,然後選擇一個可用的子網,然後嘗試去註冊它。etcd也存儲這個每個主機對應的ip。flannel 使用etcd的watch機制監視/atomic.io/network/subnets下面所有元素的變化信息,並且根據他來維護一個路由表。爲了提高性能,flannel優化了Universal TAP/TUN設備,對TUN和UDP之間的ip分片做了代理。

    7414164-03c820596a265a60.png

上圖是Flannel的GitHub頁面上的一張原理圖,結合上圖可以總結Flannel的數據傳輸過程如下:

        i. 數據從源容器中發出後,經由所在主機的docker0虛擬網卡轉發到flannel0虛擬網卡,這是個P2P的虛擬網卡,flanneld服務監聽在網卡的另外一端。
        ii. Flannel通過Etcd服務維護了一張節點間的路由表,在稍後的配置部分我們會介紹其中的內容。
        iii. 源主機的flanneld服務將原本的數據內容UDP封裝後根據自己的路由表投遞給目的節點的flanneld服務,數據到達以後被解包,然後直接進入目的節點的flannel0虛擬網卡,然後被轉發到目的主機的docker0虛擬網卡,最後就像本機容器通信一下的有docker0路由到達目標容器。

這樣整個數據包的傳遞就完成了,這裏需要解釋三個問題:

     1)UDP封裝是怎麼回事?

     在UDP的數據內容部分其實是另一個ICMP(也就是ping命令)的數據包。原始數據是在起始節點的Flannel服務上進行UDP封裝的,投遞到目的節點後就被另一端的Flannel服務還原成了原始的數據包,兩邊的Docker服務都感覺不到這個過程的存在。

     2)爲什麼每個節點上的Docker會使用不同的IP地址段?

     這個事情看起來很詭異,但真相十分簡單。其實只是單純的因爲Flannel通過Etcd分配了每個節點可用的IP地址段後,偷偷的修改了Docker的啓動參數。

     在運行了Flannel服務的節點上可以查看到Docker服務進程運行參數(ps aux|grep docker|grep "bip"),例如“--bip=182.48.25.1/24”這個參數,它限制了所在節點容器獲得的IP範圍。這個IP範圍是由Flannel自動分配的,由Flannel通過保存在Etcd服務中的記錄確保它們不會重複。

     3)爲什麼在發送節點上的數據會從docker0路由到flannel0虛擬網卡,在目的節點會從flannel0路由到docker0虛擬網卡?

     例如現在有一個數據包要從IP爲172.17.18.2的容器發到IP爲172.17.46.2的容器。根據數據發送節點的路由表,它只與172.17.0.0/16匹配這條記錄匹配,因此數據從docker0出來以後就被投遞到了flannel0。同理在目標節點,由於投遞的地址是一個容器,因此目的地址一定會落在docker0對於的172.17.46.0/24這個記錄上,自然的被投遞到了docker0網卡。

實現方式:

    環境準備:


IP地址主機名Docker版本系統(內核版本)部署服務
節點1
192.168.49.41docker01.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) etcd+flannel
節點2192.168.49.42docker02.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) flannel

    準備條件:

    1. 禁用SELinux

    2. 關閉防火牆

    3. 打開ip轉發

    4. 配置yum源

    部署流程:

    1)安裝etcd服務

    在節點1上操作:

    安裝etcd服務

    [root@docker01 ~]# yum -y install etcd
    [root@docker01 ~]# vi /etc/etcd/etcd.conf

    修改後配置文件的內容

    [root@docker01 ~]# egrep -v "^(#|$)" /etc/etcd/etcd.conf
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379, http://0.0.0.0:4001"
    ETCD_NAME="default"
    ETCD_ADVERTISE_CLIENT_URLS="http://192.168.49.41:2379, http://192.168.49.41:4001"

    啓動etcd服務

    [root@docker01 ~]# systemctl start etcd
    [root@docker01 ~]# systemctl enable etcd

    測試etcd服務是否正常

    [root@docker01 ~]# etcdctl ls /
    [root@docker01 ~]# etcdctl -C http://192.168.49.41:2379 cluster-health
    member 8e9e05c52164694d is healthy: got healthy result from http://192.168.49.41:2379
    cluster is healthy
    [root@docker01 ~]# etcdctl -C http://192.168.49.41:4001 cluster-health
    member 8e9e05c52164694d is healthy: got healthy result from http://192.168.49.41:2379
    cluster is healthy

    2)部署flannel服務

    在節點1上:

    [root@docker01 ~]# yum -y install flannel
    [root@docker01 ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
    [root@docker01 ~]# vi /etc/sysconfig/flanneld

    編輯後的配置文件內容

    [root@docker01 ~]# egrep -v "^(#|$)" /etc/sysconfig/flanneld
    FLANNEL_ETCD_ENDPOINTS="http://192.168.49.41:2379"
    FLANNEL_ETCD_PREFIX="/atomic.io/network"

    3)在etcd中設置網段

    [root@docker01 ~]# etcdctl mk /atomic.io/network/config '{"Network":"10.0.0.0/16"}'
    {"Network":"10.0.0.0/16"}
    # 這裏的/atomic.io/network是根據flannel中的FLANNEL_ETCD_PREFIX的值來的,不能隨意修改

    4)啓動flannel服務 

    [root@docker01 ~]# systemctl start flanneld
    [root@docker01 ~]# systemctl enable flanneld.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
    Created symlink from /etc/systemd/system/docker.service.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.

    重啓docker服務(也可以重置docker daemon)

    [root@docker01 ~]# systemctl restart docker

    使用ifconfig查看網卡信息,會看到多出一個flannel0的網卡,切已經分配了etcd設置的網段(如果沒有,可以重啓主機)

    [root@docker01 ~]# ifconfig
    ......
    flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
            inet 10.0.94.0  netmask 255.255.0.0  destination 10.0.94.0
            inet6 fe80::f11e:cb84:d77f:2a75  prefixlen 64  scopeid 0x20<link>
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3  bytes 144 (144.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ......

    查看docker的進程,發現多了一些參數選項 

 [root@docker01 ~]# ps -ef|grep docker
    root       1275     1  0 12:52 ?        00:00:12 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2 --bip=10.0.94.1/24 --ip-masq=true --mtu=1472
    root       1280   1275  0 12:52 ?        00:00:05 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
    root       1454   1280  0 12:56 ?        00:00:00 /usr/bin/docker-containerd-shim-current 16f0b08aaf59e25c71ed728b6ea98764ea18827100d29f5bdfa99822c617b876 /var/run/docker/libcontainerd/16f0b08aaf59e25c71ed728b6ea98764ea18827100d29f5bdfa99822c617b876 /usr/libexec/dockerdocker-runc-current
    root       1497   1280  0 12:56 ?        00:00:00 /usr/bin/docker-containerd-shim-current 16f0b08aaf59e25c71ed728b6ea98764ea18827100d29f5bdfa99822c617b876 /var/run/docker/libcontainerd/16f0b08aaf59e25c71ed728b6ea98764ea18827100d29f5bdfa99822c617b876 /usr/libexec/dockerdocker-runc-current

    這些選項是由/run/flannel/docker這個文件引入的,另外在/run/flannel下還有一個子網環境變量的文件

    [root@docker01 ~]# cat /run/flannel/docker 
    DOCKER_OPT_BIP="--bip=10.0.94.1/24"
    DOCKER_OPT_IPMASQ="--ip-masq=true"
    DOCKER_OPT_MTU="--mtu=1472"
    DOCKER_NETWORK_OPTIONS=" --bip=10.0.94.1/24 --ip-masq=true --mtu=1472"
    [root@docker01 ~]# cat /run/flannel/subnet.env 
    FLANNEL_NETWORK=10.0.0.0/16
    FLANNEL_SUBNET=10.0.94.1/24
    FLANNEL_MTU=1472
    FLANNEL_IPMASQ=false

    使用etcdctl可以查看etcd維護的子網信息

    [root@docker01 ~]# etcdctl ls /atomic.io/network/subnets
    /atomic.io/network/subnets/10.0.94.0-24
    /atomic.io/network/subnets/10.0.18.0-24

    5)在節點2上部署並啓動flannel服務

    [root@docker02 ~]# yum -y install flannel 
    [root@docker02 ~]# vi /etc/sysconfig/flanneld 
    [root@docker02 ~]# egrep -v "^(#|$)" /etc/sysconfig/flanneld 
    FLANNEL_ETCD_ENDPOINTS="http://192.168.49.41:2379"
    FLANNEL_ETCD_PREFIX="/atomic.io/network"
    [root@docker02 ~]# systemctl start flanneld.service
    [root@docker02 ~]# systemctl enable flanneld.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
    Created symlink from /etc/systemd/system/docker.service.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.

    flannel同樣也在/run/flannel下生成了子網環境變量和docker配置項文件

    [root@docker02 ~]# cat /run/flannel/subnet.env 
    FLANNEL_NETWORK=10.0.0.0/16
    FLANNEL_SUBNET=10.0.18.1/24
    FLANNEL_MTU=1472
    FLANNEL_IPMASQ=false
    [root@docker02 ~]# cat /run/flannel/docker 
    DOCKER_OPT_BIP="--bip=10.0.18.1/24"
    DOCKER_OPT_IPMASQ="--ip-masq=true"
    DOCKER_OPT_MTU="--mtu=1472"
    DOCKER_NETWORK_OPTIONS=" --bip=10.0.18.1/24 --ip-masq=true --mtu=1472"

    6)在兩個節點上創建容器,進行測試   

    在節點1上創建一個名爲bbox01容器

    [root@docker01 ~]# docker run -itd --name bbox01 busybox:latest
    16f0b08aaf59e25c71ed728b6ea98764ea18827100d29f5bdfa99822c617b876

    在節點2上創建一個名爲bbox02容器

    [root@docker02 ~]# docker run -itd --name bbox02 busybox:latest
    089994999e8a267f822c3444b585da125b3e6031256b3d45e39d3f5030c7034b

    查看bbox01的ip地址

    [root@docker01 ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' bbox01
    10.0.94.2

    查看bbox02的ip地址

    [root@docker02 ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' bbox02
    10.0.18.2

    bbox01嘗試ping bbox02的地址

    [root@docker01 ~]# docker exec -it bbox01 ping 10.0.18.2 -c2 -w2
    PING 10.0.18.2 (10.0.18.2): 56 data bytes
    64 bytes from 10.0.18.2: seq=0 ttl=60 time=1.273 ms
    64 bytes from 10.0.18.2: seq=1 ttl=60 time=0.531 ms
    --- 10.0.18.2 ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max = 0.531/0.902/1.273 ms

    bbox02嘗試ping bbox01的

    [root@docker02 ~]# docker exec -it bbox02 ping 10.0.94.2 -c2 -w2
    PING 10.0.94.2 (10.0.94.2): 56 data bytes
    64 bytes from 10.0.94.2: seq=0 ttl=60 time=0.779 ms
    64 bytes from 10.0.94.2: seq=1 ttl=60 time=0.708 ms
    
    --- 10.0.94.2 ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max = 0.708/0.743/0.779 ms



Weave網絡:

Weave是由weaveworks公司開發的解決Docker跨主機網絡的解決方案,它能夠創建一個虛擬網絡,用於連接部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網絡交換機,那些使用網絡的應用程序不必去配置端口映射和鏈接等信息。

特性概述:

  • Weave在Docker主機之間實現Overlay網絡,使用業界標準VXLAN封裝,基於UDP傳輸,也可以加密傳輸。

  • Weave Net創建一個連接多個Docker主機的虛擬網絡,類似於一個以太網交換機,所有的容器都連接到這上面,互相通信。

  • Weave Net由多個peer組成,Weave路由器運行不同Docker主機上,是一個用戶空間的進程;每個peer都有一個名稱,重啓保持不變。它們通過TCP連接彼此,建立後交換拓補信息。

  • Weave Net可以在具有編號拓補的部分連接的網絡中路由數據包。

  • Weave Net中的"fast data path"使用Linux內核的OpenvSwitch datapath模塊。該模塊使Weave Net路由器能夠告知內核如何處理數據包。OpenvSwitch datapath和VXLAN功能在Linux內核版本3.12才支持,如果內核不支持,則Weave Net使用"user mode"數據包路徑。Weave Net會自動選擇兩臺主機之間最快的路徑傳輸數據,提供近原生吞吐量和延遲。

工作原理:

weave1.png

容器的網絡通訊都通過route服務和網橋轉發。

weave2.png

Weave network的組成:

  • 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連接構成,這些連接大部分都會加密。這些連接都是全雙工的,並且可以穿越防火牆。

使用前提:

確保Linux內核版本3.8+,Docker 1.10+

節點之間如果有防火牆時,必須彼此放行TCP 6783/6784端口,這是Weave控制和數據端口

主機名不能相同,通過主機名標識子網

安裝配置:

    環境準備:   


IP地址主機名Docker版本系統(內核版本)部署服務
節點1
192.168.49.41docker01.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+weave
節點2192.168.49.42docker02.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+weave

1)安裝weave

curl -L git.io/weave -o /usr/local/bin/weave
chmod +x /usr/local/bin/weave

2)啓動服務並與其他主機建立連接

節點1:

[root@docker01 ~]# weave launch 192.168.49.42

節點2:

[root@docker02 ~]# weave launch 192.168.49.41

3)使用weave網絡創建容器

方法1:

eval $(weave env)         # 先加載包含weave環境變量的docker主機選項
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

方法2:

docker run --net=weave [OPTIONS] IMAGE [COMMAND] [ARG...]   # 使用--net選項指定容器使用weave網絡

4)測試容器間通信

查看節點1上的容器b1的網絡信息:

[root@docker01 ~]# docker exec -it b1 /bin/sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1296 (1.2 KiB)  TX bytes:648 (648.0 B)
ethwe     Link encap:Ethernet  HWaddr 6A:D4:05:76:46:84  
          inet addr:10.32.0.1  Bcast:10.47.255.255  Mask:255.240.0.0
          inet6 addr: fe80::68d4:5ff:fe76:4684/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1248 (1.2 KiB)  TX bytes:300 (300.0 B)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

可以看到,容器有2張網卡,一個是docker0網絡eth0,一個是weave網絡ethwe。

再看一下節點2上的容器b2的網絡信息:

[root@docker02 ~]# docker exec -it b2 /bin/sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1296 (1.2 KiB)  TX bytes:648 (648.0 B)
ethwe     Link encap:Ethernet  HWaddr 8E:A4:F2:8E:45:07  
          inet addr:10.40.0.0  Bcast:10.47.255.255  Mask:255.240.0.0
          inet6 addr: fe80::8ca4:f2ff:fe8e:4507/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:948 (948.0 B)  TX bytes:300 (300.0 B)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

同樣的,節點2上的容器也有2張網卡,一個位於docker0網絡的eth0, 和一個位於weave網絡的ethwe。

再看一下主機的網橋信息:

[root@docker01 ~]# brctl show 
bridge namebridge idSTP enabledinterfaces
docker08000.0242788135fenovethc74508a
weave8000.2e3a3605d0bbnovethwe-bridge
                        vethwepl2156
[root@docker02 ~]# brctl show
bridge namebridge idSTP enabledinterfaces
docker08000.02422905102bnoveth1f6eb6a
weave8000.fae2402f1d08        novethwe-bridge
                        vethwepl2152

此時,查看主機上的容器,發現有3個weave容器:

[root@docker01 ~]# docker ps -a 
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
fc2fede65833        busybox:latest               "/w/w sh"                34 minutes ago      Up 34 minutes                           b1
7c29cbb81199        weaveworks/weave:2.5.1       "/home/weave/weave..."   About an hour ago   Up About an hour                        weave
ff25d3699d63        weaveworks/weaveexec:2.5.1   "data-only"              About an hour ago   Created                                 weavevolumes-2.5.1
dedabd37643b        weaveworks/weavedb:latest    "data-only"              About an hour ago   Created                                 weavedb
[root@docker02 ~]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
ca8f506edc57        busybox:latest               "/w/w sh"                35 minutes ago      Up 35 minutes                           b2
75ea2c72d6f5        weaveworks/weave:2.5.1       "/home/weave/weave..."   41 minutes ago      Up 41 minutes                           weave
7373f675ebc8        weaveworks/weaveexec:2.5.1   "data-only"              41 minutes ago      Created                                 weavevolumes-2.5.1
18196d0b0e19        weaveworks/weavedb:latest    "data-only"              41 minutes ago      Created                                 weavedb

我們嘗試在容器內進行測試:

在節點1上:

[root@docker01 ~]# docker exec -it b1 ping 10.40.0.0 -c2 -w2
PING 10.40.0.0 (10.40.0.0): 56 data bytes
64 bytes from 10.40.0.0: seq=0 ttl=64 time=1.148 ms
64 bytes from 10.40.0.0: seq=1 ttl=64 time=2.577 ms
--- 10.40.0.0 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.148/1.862/2.577 ms
[root@docker01 ~]# docker exec -it b1 ping b2 -c2 -w2
PING b2 (10.40.0.0): 56 data bytes
64 bytes from 10.40.0.0: seq=0 ttl=64 time=0.502 ms
64 bytes from 10.40.0.0: seq=1 ttl=64 time=0.434 ms
--- b2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.434/0.468/0.502 ms

節點1上的容器b1嘗試ping節點2上的容器b2:不僅可以ping通,且可以使用容器名ping通。

[root@docker01 ~]# docker exec -it b1 ping 192.168.49.41 -c2 -w2
PING 192.168.49.41 (192.168.49.41): 56 data bytes
64 bytes from 192.168.49.41: seq=0 ttl=64 time=0.051 ms
64 bytes from 192.168.49.41: seq=1 ttl=64 time=0.188 ms
--- 192.168.49.41 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.051/0.119/0.188 ms

節點1上的容器b1嘗試ping節點1的ip地址,也可以ping通。

[root@docker01 ~]# docker exec -it b1 ping 192.168.49.42 -c2 -w2
PING 192.168.49.42 (192.168.49.42): 56 data bytes
64 bytes from 192.168.49.42: seq=0 ttl=63 time=0.291 ms
64 bytes from 192.168.49.42: seq=1 ttl=63 time=0.315 ms
--- 192.168.49.42 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.291/0.303/0.315 ms

節點1上的容器b1嘗試ping節點2主機的IP地址:發現也可以ping通。

在節點2上:

[root@docker02 ~]# docker exec -it b2 ping 10.32.0.1 -c2 -w2
PING 10.32.0.1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.618 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.476 ms
--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.476/0.547/0.618 ms
[root@docker02 ~]# docker exec -it b2 ping b1 -c2 -w2
PING b1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.468 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.487 ms
--- b1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.468/0.477/0.487 ms

節點2上的容器b2嘗試ping節點1上的容器b1:結果不僅可以ping通,也可以使用容器名ping通。

[root@docker02 ~]# docker exec -it b2 ping 192.168.49.41 -c2 -w2
PING 192.168.49.41 (192.168.49.41): 56 data bytes
64 bytes from 192.168.49.41: seq=0 ttl=63 time=0.398 ms
64 bytes from 192.168.49.41: seq=1 ttl=63 time=0.461 ms
--- 192.168.49.41 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.398/0.429/0.461 ms

節點2上的容器b2嘗試ping節點1的ip地址:也可以ping通。

[root@docker02 ~]# docker exec -it b2 ping 192.168.49.42 -c2 -w2
PING 192.168.49.42 (192.168.49.42): 56 data bytes
64 bytes from 192.168.49.42: seq=0 ttl=64 time=0.048 ms
64 bytes from 192.168.49.42: seq=1 ttl=64 time=0.050 ms
--- 192.168.49.42 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.049/0.050 ms

節點2上的容器b2嘗試ping節點2的ip地址:也可以ping的通。

以上證明,跨主機容器間通信沒有問題,且不同主機上的容器也能和多個主機進行通信,那主機是否能跟容器的weave網絡通信呢?

我們到節點1上嘗試ping容器b1的weave網絡地址:

[root@docker01 ~]# ping 10.32.0.1 -c2 -w2
PING 10.32.0.1 (10.32.0.1) 56(84) bytes of data.
--- 10.32.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1000ms

發現此時是無法ping通的,我們再查看一下主機的路由表:

[root@docker01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.49.2    0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.49.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

這裏我們添加一條到weave網絡的路由:

[root@docker01 ~]# route add -net 10.32.0.0/24 gw 172.17.0.1

再次嘗試去ping容器的weave網絡:

[root@docker01 ~]# ping 10.32.0.1 -c2 -w2
PING 10.32.0.1 (10.32.0.1) 56(84) bytes of data.
64 bytes from 10.32.0.1: icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=64 time=0.037 ms
--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.037/0.051/0.065/0.014 ms

已經可以ping通了,同樣的方法也適用於節點2,這裏就不再演示了。

weave的優缺點:

優點:

  1. 支持主機間通信加密。

  2. 支持container動態加入或者剝離網絡。

  3. 支持跨主機多子網通信。

缺點:

  1. 只能通過weave launch或者weave connect加入weave網絡。

weave的其他功能:

  • IP地址管理(IPAM):Weave自動爲容器分配唯一的IP地址,可以通過weave ps查看

  • 命名和發現:命名的容器自動會註冊到Weave DNS中,並可以通過容器名稱訪問

  • 負載均衡:允許註冊多個相同名稱的容器,Weave DNS隨機爲每個請求返回地址,提供基本的負載均衡功能

  • 手動指定IP地址:docker run -it -e WEAVE_CIDR=10.0.0.1/24 busybox

  • 動態拓補:可以在不停止或重新配置剩餘Docker主機的情況下添加主機到Weave網絡中或從Weave網絡中刪除

  • 容錯:weave peer不斷交換拓補信息,監視和建立與其他peer的網絡連接。如果有主機或網絡出現故障,Weave會繞過這個主機,保證兩邊容器可以繼續通信,當恢復時,恢復完全連接。



OpenvSwitch網絡:

Open vSwitch是一個高質量的,多層虛擬交換機,使用開源Apache2.0許可協議,主要實現代碼爲可移植的C代碼。它的目的是讓大規模網絡自動化可以通過變成擴展,同事仍然支持標準的管理接口和協議(例如NetFlow,sFlow,SPAN.RSPAN,CLI,LACP,802.1ag)

OpenvSwitch概念:開放虛擬交換標準,是一種基於開源Apache2.0許可證的多層軟件交換機,專門管理多租賃雲計算網絡環境,支持KVM、Xen等虛擬化技術。

功能支持:

1、支持標準802.1Q VLAN模塊的Trunk和access端口模式

2、QoS(Quality of Service)配置及管理

3、支持OpenFlow協議

4、支持GRE、VXLAN、STT和LISP隧道

5、具有C和Python接口配置數據庫

6、支持內核態和用戶態的轉發引擎設置

7、支持流量控制及監控

主要組成部分:

ovs-vswitchd:一個實現交換機的守護程序

ovsdb-server:一個輕量級數據庫,ovs-vswitchd查詢以獲取其配置

ovs-dpctl:用於配置交換機的內核模塊工具

ovs-vsctl:用於查看和更新ovs-vswitchd的配置工具

ovs-appctl:一個向運行OVS守護程序發送命令的工具

還提供了openflow的工具:

ovs-ofctl:用於查看和控制OpenFlow交換機和控制器

ovs-pki:用於創建和管理公鑰

ovs-tcpundump:解析openflow消息

GRE隧道:

        隧道技術:是一種通過使用互聯網的基礎設施在網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據可以是不同協議的數據幀或包。隧道協議將其它協議的數據幀或包重新封裝然互通過隧道發送。新的幀頭提供路由信息,以便通過互聯網傳遞被封裝的負載數據。

工作原理:

ovs2.png

兩臺節點主機容器,Container通過OpenvSitch通信

  1. Container eth0:veth它會將網絡橋接到docker0網絡。

  2. Docker0:Docker網橋默認網絡。

  3. br0:OVS網橋,它會將Docker0網橋加入到br0網絡,它會捕獲到Container eth0 發出的數據包。

  4. gre0:OVS網絡捕獲數據包後通過gre協議將數據包封裝。

  5. eth0:物理網卡,它會把gre數據包,轉發給節點2。

  6. 節點2的eth0接收數據包後->交給OVS進行街封裝->獲取獲取訪問地址->裝發到docker0->再交給容器的eth0。

安裝配置:

        環境準備:


IP地址主機名Docker版本系統(內核版本)部署服務
節點1
192.168.49.41docker01.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+openvswitch
節點2192.168.49.42docker02.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+openvswitch

以下操作如不指明則均在兩個節點上執行

1)安裝openvswitch

yum -y install openvswitch

2)創建網橋並激活

ovs-vsctl add-br br0
ip link set dev br0 up

3)將gre虛擬接口加入網橋br0,並設置接口類型和對端IP地址

節點1:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.49.42

節點2:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.49.41

4)添加docker0網橋到OVS網橋br0

brctl addif docker0 br0

5)查看網橋信息

節點1:

[root@docker01 ~]# brctl show
bridge name   bridge id            STP enabled    interfaces
docker0       000.0242f970866b     no             br0
[root@docker01 ~]# ovs-vsctl show
b1bd6c23-a478-4ff0-b8cf-75925281e029
    Bridge "br0"
        Port "gre0"
            Interface "gre0"
                type: gre
                options: {remote_ip="192.168.49.42"}
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "2.0.0"

節點2:

[root@docker02 ~]# brctl show
bridge name    bridge id           STP enabled        interfaces
docker0        8000.0242d467fd96          no         br0
[root@docker02 ~]# ovs-vsctl show
780ffc9d-e7b6-4c77-965b-321fe37c4b30
    Bridge "br0"
        Port "gre0"
            Interface "gre0"
                type: gre
                options: {remote_ip="192.168.49.41"}
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "2.0.0"

6)修改docker網絡設置並重啓docker服務

節點1:

[root@docker01 ~]# egrep -v "^(#|$)" /etc/sysconfig/docker-network 
DOCKER_NETWORK_OPTIONS="--bip=172.17.1.1/24"
[root@docker01 ~]# systemctl restart docker

節點2:

[root@docker02 ~]# egrep -v "^(#|$)" /etc/sysconfig/docker-network 
DOCKER_NETWORK_OPTIONS="--bip=172.17.2.1/24"
[root@docker02 ~]# systemctl restart docker

7)添加靜態路由

ip route add 172.17.0.0/26 dev docker0
route add -net 172.17.0.0/16 dev docker0

8)創建容器,驗證是否可以互相通信

節點1:

[root@docker01 ~]# docker run -itd --name bbox01 busybox:latest
b9f7e64c89465949db741a6fa104095e9d4b70157c79943d6abd3d33bf8ba72a
[root@docker01 ~]# docker inspect bbox01 --format='{{.NetworkSettings.IPAddress}}'
172.17.1.2

節點2:

[root@docker02 ~]# docker run -itd --name bbox02 busybox:latest
6c64ec8804a53c14553f5bf0303e50392724fab4c650274981d126e2cd008203
[root@docker02 ~]# docker inspect bbox02 --format='{{.NetworkSettings.IPAddress}}'
172.17.2.2

節點1上的容器ping節點2上的容器:

[root@docker01 ~]# docker exec -it bbox01 ping 172.17.2.2 -c2 -w2
PING 172.17.2.2 (172.17.2.2): 56 data bytes
64 bytes from 172.17.2.2: seq=0 ttl=63 time=1.896 ms
64 bytes from 172.17.2.2: seq=1 ttl=63 time=0.458 ms
--- 172.17.2.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.458/1.177/1.896 ms

節點2上的容器ping節點1上的容器:

[root@docker02 ~]# docker exec -it bbox02 ping 172.17.1.2 -c2 -w2
PING 172.17.1.2 (172.17.1.2): 56 data bytes
64 bytes from 172.17.1.2: seq=0 ttl=63 time=1.197 ms
64 bytes from 172.17.1.2: seq=1 ttl=63 time=0.528 ms
--- 172.17.1.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.528/0.862/1.197 ms

節點1上的容器ping節點1和節點2的ip地址:

[root@docker01 ~]# docker exec -it bbox01 ping 192.168.49.41 -c2 -w2
PING 192.168.49.41 (192.168.49.41): 56 data bytes
64 bytes from 192.168.49.41: seq=0 ttl=64 time=0.101 ms
64 bytes from 192.168.49.41: seq=1 ttl=64 time=0.048 ms
--- 192.168.49.41 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.074/0.101 ms

[root@docker01 ~]# docker exec -it bbox01 ping 192.168.49.42 -c2 -w2
PING 192.168.49.42 (192.168.49.42): 56 data bytes
64 bytes from 192.168.49.42: seq=0 ttl=63 time=0.422 ms
64 bytes from 192.168.49.42: seq=1 ttl=63 time=0.430 ms
--- 192.168.49.42 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.422/0.426/0.430 ms

節點2上的容器ping節點1和節點2的ip地址:

[root@docker02 ~]# docker exec -it bbox02 ping 192.168.49.41 -c2 -w2
PING 192.168.49.41 (192.168.49.41): 56 data bytes
64 bytes from 192.168.49.41: seq=0 ttl=63 time=0.577 ms
64 bytes from 192.168.49.41: seq=1 ttl=63 time=0.549 ms
--- 192.168.49.41 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.549/0.563/0.577 ms

[root@docker02 ~]# docker exec -it bbox02 ping 192.168.49.42 -c2 -w2
PING 192.168.49.42 (192.168.49.42): 56 data bytes
64 bytes from 192.168.49.42: seq=0 ttl=64 time=0.054 ms
64 bytes from 192.168.49.42: seq=1 ttl=64 time=0.044 ms
--- 192.168.49.42 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.044/0.049/0.054 ms

嘗試在主機上ping不同主機上的容器網絡:

[root@docker02 ~]# ping 172.17.1.2 -c2 -w2
PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data.
64 bytes from 172.17.1.2: icmp_seq=1 ttl=63 time=2.10 ms
64 bytes from 172.17.1.2: icmp_seq=2 ttl=63 time=0.596 ms
--- 172.17.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.596/1.351/2.107/0.756 ms
[root@docker02 ~]# ping 172.17.2.2 -c2 -w2
PING 172.17.2.2 (172.17.2.2) 56(84) bytes of data.
64 bytes from 172.17.2.2: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 172.17.2.2: icmp_seq=2 ttl=64 time=0.049 ms
--- 172.17.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.032/0.040/0.049/0.010 ms
[root@docker01 ~]# ping 172.17.1.2 -c2 -w2
PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data.
64 bytes from 172.17.1.2: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.17.1.2: icmp_seq=2 ttl=64 time=0.032 ms
--- 172.17.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.039/0.047/0.009 ms
[root@docker01 ~]# ping 172.17.2.2 -c2 -w2
PING 172.17.2.2 (172.17.2.2) 56(84) bytes of data.
64 bytes from 172.17.2.2: icmp_seq=1 ttl=63 time=1.13 ms
64 bytes from 172.17.2.2: icmp_seq=2 ttl=63 time=0.595 ms
--- 172.17.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.595/0.866/1.137/0.271 ms



calico方案:

Calico 是一個純3層協議,支持VM、Docker、Rocket、OpenStack、Kubernetes、或者直接在物理機上使用。官網上給出可以支持上萬個主機、上百萬的工作負載(container),由於它是純三層協議,使用BGP協議(基於IP),更易於調試,支持IPv6,支持靈活的安全策略。

工作原理:

Calico把每個操作系統的協議棧認爲是一個路由器,然後把所有的容器認爲是連在這個路由器上的網絡終端,在路由器之間跑標準的路由協議——BGP的協議,然後讓它們自己去學習這個網絡拓撲該如何轉發。所以Calico方案其實是一個純三層的方案,也就是說讓每臺機器的協議棧的三層去確保兩個容器,跨主機容器之間的三層連通性。

對於控制平面,它每個節點上會運行兩個主要的程序,一個是Felix,它會監聽ECTD中心的存儲,從它獲取事件,比如說用戶在這臺機器上加了一個IP,或者是分配了一個容器等。接着會在這臺機器上創建出一個容器,並將其網卡、IP、MAC都設置好,然後在內核的路由表裏面寫一條,註明這個IP應該到這張網卡。綠色部分是一個標準的路由程序,它會從內核裏面獲取哪一些IP的路由發生了變化,然後通過標準BGP的路由協議擴散到整個其他的宿主機上,讓外界都知道這個IP在這裏,你們路由的時候得到這裏來。

由於Calico是一種純三層的實現,因此可以避免與二層方案相關的數據包封裝的操作,中間沒有任何的NAT,沒有任何的overlay,所以它的轉發效率可能是所有方案中最高的,因爲它的包直接走原生TCP/IP的協議棧,它的隔離也因爲這個棧而變得好做。因爲TCP/IP的協議棧提供了一整套的防火牆的規則,所以它可以通過IPTABLES的規則達到比較複雜的隔離邏輯。

安裝配置:

        環境準備:


IP地址主機名Docker版本系統(內核版本)部署服務
節點1
192.168.49.41docker01.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+etcd+calico
節點2192.168.49.42docker02.contoso.com1.13.1CentOS 7(3.10.0-693.el7.x86_64) docker+calico

1)在節點1上安裝etcd並啓動服務

wget https://github.com/etcd-io/etcd/releases/download/v3.3.12/etcd-v3.3.12-linux-amd64.tar.gz 
tar -zxf etcd-v3.3.12-linux-amd64.tar.gz
cd etcd-v3.3.12-linux-amd64
nohup ./etcd --name kube -listen-client-urls http://0.0.0.0:2379 -advertise-client-urls http://192.168.49.41:2379 > /var/log/etcd.log &

2)分別在兩個節點添加docker網絡配置cluster-store選項並重啓docker服務

vi /etc/sysconfig/docker
OPTIONS="--cluster-store etcd://192.168.49.41:2379" 
systemctl restart docker

3)分別在兩個節點安裝calico服務

wget https://github.com/projectcalico/calico-containers/releases/download/v1.0.0-beta/calicoctl 
chmod +x calicoctl

4)分別在兩個節點啓動calico服務

節點1:

[root@docker01 ~]# export ETCD_ENDPOINTS=http://192.168.49.41:2379
[root@docker01 ~]# ./calicoctl node run --name 192.168.49.41

節點2:

[root@docker02 ~]# export ETCD_ENDPOINTS=http://192.168.49.41:2379
[root@docker02 ~]# ./calicoctl node run --name 192.168.49.42

命令實際使用 calico/node 鏡像啓動了一個容器,執行輸出內容如下:

Running command to load modules: modprobe -a xt_set ip6_tables
Enabling IPv4 forwarding
Enabling IPv6 forwarding
Increasing contrack limit
Running the following command:
docker run -d --net=host --privileged --name=calico-node -e HOSTNAME=192.168.49.41 -e IP6= -e AS= -e NO_DEFAULT_POOLS= -e ETCD_AUTHORITY= -e CALICO_LIBNETWORK_ENABLED=true -e IP= -e CALICO_NETWORKING_BACKEND=bird -e ETCD_ENDPOINTS=http://192.168.49.41:2379 -e ETCD_SCHEME= -v /var/log/calico:/var/log/calico -v /var/run/calico:/var/run/calico -v /lib/modules:/lib/modules -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock calico/node:v1.0.0-beta

上面的命令需要較長的時間執行,等待執行完畢後,可以查看calicoctl服務節點狀態:

節點1:

[root@docker01 ~]# ./calicoctl get node
NAME            
192.168.49.41   
192.168.49.42   
[root@docker01 ~]# ./calicoctl node status
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.49.42 | node-to-node mesh | up    | 11:29:54 | Established |
+---------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.

節點2:

[root@docker02 ~]# ./calicoctl get node
NAME            
192.168.49.41   
192.168.49.42   
[root@docker02 ~]# ./calicoctl node status
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.49.41 | node-to-node mesh | up    | 11:29:53 | Established |
+---------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.

5)配置網絡的ip地址池

默認地址池如下:

[root@docker01 ~]# ./calicoctl get ipPool
CIDR                       
192.168.0.0/16             
fd80:24e2:f998:72d6::/64

使用yml配置文件創建新的地址池(這一步只需在其中一個節點上執行即可):

[root@docker01 ~]# vim calico.yml 
[root@docker01 ~]# cat calico.yml 
- apiVersion: v1
  kind: ipPool
  metadata:
    cidr: 10.10.0.0/16
  spec:
    ipip:
      enabled: true
    nat-outgoing: true
[root@docker01 ~]# ./calicoctl create -f calico.yml 
Successfully created 1 'ipPool' resource(s)
[root@docker01 ~]# ./calicoctl delete ipPool 192.168.0.0/16
Successfully deleted 1 'ipPool' resource(s)

查看新的地址池信息:

節點1:

[root@docker01 ~]# ./calicoctl get ipPool
CIDR                       
10.10.0.0/16               
fd80:24e2:f998:72d6::/64

節點2:

[root@docker02 ~]# ./calicoctl get ipPool
CIDR                       
10.10.0.0/16               
fd80:24e2:f998:72d6::/64

6)創建使用calico驅動的docker網絡

注意:只需要在其中一個節點上執行創建命令即可。

[root@docker01 ~]# docker network create --driver calico --ipam-driver calico-ipam calico-net1
4b0c9c48eb67eb6e230047cd0dba15c2baccce1ca71797ed8657fa8e5f1e27dc
[root@docker01 ~]# docker network create --driver calico --ipam-driver calico-ipam calico-net2
59919b1146e41be92825ffa2eb0a5321d1832405d251e5ac1ab3601a32577562

到另一個節點上查看:

[root@docker02 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0aa898bff668        bridge              bridge              local
4b0c9c48eb67        calico-net1         calico              global
59919b1146e4        calico-net2         calico              global
43fd42bc0f76        host                host                local
364fc46102ac        none                null                local

7)創建容器,測試是否能互相通信

節點1:

[root@docker01 ~]# docker run -itd --net calico-net1 --name node1-box1 busybox
e1247a2cc11aea3f406539bf4844c8457ba54ecfacec8e1bb5faae6ee974a11c
[root@docker01 ~]# docker run -itd --net calico-net2 --name node1-box2 busybox
57216461e843230ee127d6fd4866336564c43eeb1192c671ecb92bc728e26b7d
[root@docker01 ~]# docker run -itd --net calico-net1 --name node1-box3 busybox
6c61ae89d83436379936ce5aa015bf21f731e14d83e5ba2eda44b21ea426062d

節點2:

[root@docker02 ~]# docker run -itd --net calico-net1 --name node2-box1 busybox
51e7cf1b48a4ae4ac3317328df2d0e4269caec337bd6da279d6bf5e6ab9fca7e
[root@docker02 ~]# docker run -itd --net calico-net2 --name node2-box2 busybox
25806aee00b4186b4ce8cf67f61e3b1a5230a962974e4e391b024953dc042263

同主機同一網絡通信:

[root@docker01 ~]# docker exec -it node1-box1 ping node1-box3 -c2 -w2
PING node1-box3 (10.10.175.2): 56 data bytes
64 bytes from 10.10.175.2: seq=0 ttl=63 time=0.098 ms
64 bytes from 10.10.175.2: seq=1 ttl=63 time=0.124 ms
--- node1-box3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.098/0.111/0.124 ms

同主機不同網絡通信:

[root@docker01 ~]# docker exec -it node1-box1 ping node1-box2 -c2 -w2
ping: bad address 'node1-box2'

跨主機同一網絡通信:

[root@docker01 ~]# docker exec -it node1-box1 ping node2-box1 -c2 -w2
PING node2-box1 (10.10.179.128): 56 data bytes
64 bytes from 10.10.179.128: seq=0 ttl=62 time=0.551 ms
64 bytes from 10.10.179.128: seq=1 ttl=62 time=0.315 ms
--- node2-box1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.315/0.433/0.551 ms

跨主機不同網絡通信:

[root@docker01 ~]# docker exec -it node1-box1 ping node2-box2 -c2 -w2
ping: bad address 'node2-box2'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章