上一篇記錄了使用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 | 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會自動選擇兩台主機之間最快的路徑傳輸資料,提供近原生吞吐量和延遲。
容器的網絡通訊都通過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控制和資料端口
主機名不能相同,通過主機名辨別子網
安裝配置:
環境準備:
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。
環境準備:
docker+openvswitch | |||||
以下操作如不指明則均在兩個節點上執行
1)安裝openvswitch
yum -y install openvswitch
2)建立網橋并激活
ovs-vsctl add-br br0
ip link set dev br0 up
3)将gre虛拟接口加入網橋br0,并設定接口類型和對端IP位址
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.49.42
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)檢視網橋資訊
[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"
[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服務
[root@docker01 ~]# egrep -v "^(#|$)" /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="--bip=172.17.1.1/24"
[root@docker01 ~]# systemctl restart docker
[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)建立容器,驗證是否可以互相通信
[root@docker01 ~]# docker run -itd --name bbox01 busybox:latest
b9f7e64c89465949db741a6fa104095e9d4b70157c79943d6abd3d33bf8ba72a
[root@docker01 ~]# docker inspect bbox01 --format='{{.NetworkSettings.IPAddress}}'
172.17.1.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的規則達到比較複雜的隔離邏輯。
docker+etcd+calico | |||||
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服務
[root@docker01 ~]# export ETCD_ENDPOINTS=http://192.168.49.41:2379
[root@docker01 ~]# ./calicoctl node run --name 192.168.49.41
[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服務節點狀态:
[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.
[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)
檢視新的位址池資訊:
[root@docker01 ~]# ./calicoctl get ipPool
CIDR
10.10.0.0/16
fd80:24e2:f998:72d6::/64
[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)建立容器,測試是否能互相通信
[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
[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'