上一篇記錄了使用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分片做了代理。
上圖是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.41 | docker01.contoso.com | 1.13.1 | CentOS 7(3.10.0-693.el7.x86_64) | etcd+flannel |
節點2 | 192.168.49.42 | docker02.contoso.com | 1.13.1 | CentOS 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"
[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會自動選擇兩臺主機之間最快的路徑傳輸數據,提供近原生吞吐量和延遲。
工作原理:
容器的網絡通訊都通過route服務和網橋轉發。
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.41 | docker01.contoso.com | 1.13.1 | CentOS 7(3.10.0-693.el7.x86_64) | docker+weave |
節點2 | 192.168.49.42 | docker02.contoso.com | 1.13.1 | CentOS 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的優缺點:
優點:
支持主機間通信加密。
支持container動態加入或者剝離網絡。
支持跨主機多子網通信。
缺點:
只能通過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隧道:
隧道技術:是一種通過使用互聯網的基礎設施在網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據可以是不同協議的數據幀或包。隧道協議將其它協議的數據幀或包重新封裝然互通過隧道發送。新的幀頭提供路由信息,以便通過互聯網傳遞被封裝的負載數據。
工作原理:
兩臺節點主機容器,Container通過OpenvSitch通信
Container eth0:veth它會將網絡橋接到docker0網絡。
Docker0:Docker網橋默認網絡。
br0:OVS網橋,它會將Docker0網橋加入到br0網絡,它會捕獲到Container eth0 發出的數據包。
gre0:OVS網絡捕獲數據包後通過gre協議將數據包封裝。
eth0:物理網卡,它會把gre數據包,轉發給節點2。
節點2的eth0接收數據包後->交給OVS進行街封裝->獲取獲取訪問地址->裝發到docker0->再交給容器的eth0。
安裝配置:
環境準備:
IP地址 | 主機名 | Docker版本 | 系統(內核版本) | 部署服務 | |
節點1 | 192.168.49.41 | docker01.contoso.com | 1.13.1 | CentOS 7(3.10.0-693.el7.x86_64) | docker+openvswitch |
節點2 | 192.168.49.42 | docker02.contoso.com | 1.13.1 | CentOS 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.41 | docker01.contoso.com | 1.13.1 | CentOS 7(3.10.0-693.el7.x86_64) | docker+etcd+calico |
節點2 | 192.168.49.42 | docker02.contoso.com | 1.13.1 | CentOS 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'