Docker容器跨主機通信之:OVS+GRE

一、概述

由於docker自身還未支持跨主機容器通信,需要藉助docker網絡開源解決方案

OVS

OpenVSwich即開放式虛擬交換機實現,簡稱OVS,OVS在雲計算領域應用廣泛,值得我們去學習使用。

OpenVSwich

OpenVSwich是一種開源軟件,通過軟件的方式實現二層交換機功能,專門管理多租賃雲計算網絡環境,提供虛擬網絡中的訪問策略、網絡隔離、流量監控等。

既然是虛擬交換機,自然與傳統的物理交換機有着相同的特性,操作中可以按照理解物理交換機的方式去操作,有助於對虛擬交換機的認識。

GRE隧道

GRE即通用路由協議封裝,隧道技術是一種封裝技術,將網絡層協議(如IP)的數據報文進行封裝,使這些封裝的數據報文能夠在另一個網絡層協議中傳輸。可以看作是一個虛擬點到點連接,所以建立隧道時,要配置好隧道源地址和目的地址。

二、基於OVS+GRE的大二層通信

實驗環境

操作系統

主機

主機ip

容器網段

ubuntu-16.04.4-server-amd64

主機1

172.31.15.168

172.17.43.1/24

ubuntu-16.04.4-server-amd64

主機2

172.31.4.143

172.17.42.1/24

示意圖

修改Docker0的網絡地址

編輯主機1上的 /etc/docker/daemon.json 文件,添加內容:

{ "bip": "172.17.43.1/24" }

編輯主機2上的 /etc/docker/daemon.json 文件,添加內容:

{ "bip":"172.17.42.1/24" }

重啟docker服務

主機1和主機2上均執行如下命令重啟docker服務以使修改後的docker0網段生效

systemctl restart docker

創建ovs bridge

主機1和主機2 操作:

安裝 openvswitch

apt install -y openvswitch-switch

創建bro網橋

ovs-vsctl add-br br0

查看bro網橋

root@ubuntu:~# ifconfig br0  br0       Link encap:以太網  硬件地址 1e:cc:2c:52:13:42              BROADCAST MULTICAST  MTU:1500  躍點數:1            接收數據包:0 錯誤:0 丟棄:0 過載:0 幀數:0            發送數據包:0 錯誤:0 丟棄:0 過載:0 載波:0            碰撞:0 發送隊列長度:1             接收位元組:0 (0.0 B)  發送位元組:0 (0.0 B)

設置gre端口

將gre0接口加入到網橋obr0, 遠程IP寫對端IP(創建一個GRE隧道並添加到網橋中)

主機1 執行:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.4.143

注意:172.31.4.143 是主機2的ip地址。

主機2 執行:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.15.168

注意:172.31.15.168 是主機1的ip地址。

主機1和主機2 操作:

# 將br0網橋加入docker0網橋  brctl addif docker0 br0  # 啟動br0網橋  ip link set dev br0 up  # 啟動docker0網橋  ip link set dev docker0 up  # 添加路由條目  ip route add 172.17.0.0/16 dev docker0

注意:由於主機1和主機2的網絡掩碼為24,因此16位就可以包含這2個網絡了。

查看網橋信息

root@ubuntu:~# brctl show  bridge name    bridge id        STP enabled    interfaces  docker0        8000.0242f148614e    no        br0

啟動容器測試

主機1和主機2 操作:

docker run -itd --name test busybox /bin/sh

查看容器信息

主機1 執行:

docker inspect test

輸出:

...            "Gateway": "172.17.43.1",            "GlobalIPv6Address": "",            "GlobalIPv6PrefixLen": 0,            "IPAddress": "172.17.43.2",  ...

ping 主機2的docker ip

root@ubuntu:~# ping 172.17.42.2 -c 2PING 172.17.42.2 (172.17.42.2) 56(84) bytes of data.64 bytes from 172.17.42.2: icmp_seq=1 ttl=63 time=0.505 ms64 bytes from 172.17.42.2: icmp_seq=2 ttl=63 time=0.858 ms--- 172.17.42.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000ms  rtt min/avg/max/mdev = 0.505/0.681/0.858/0.178 ms

主機2 執行:

ping 主機1的docker ip

root@ubuntu:~# ping 172.17.43.2 -c 2PING 172.17.43.2 (172.17.43.2) 56(84) bytes of data.64 bytes from 172.17.43.2: icmp_seq=1 ttl=63 time=1.90 ms64 bytes from 172.17.43.2: icmp_seq=2 ttl=63 time=0.641 ms--- 172.17.43.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1002ms  rtt min/avg/max/mdev = 0.641/1.274/1.907/0.633 ms

本文參考鏈接:

https://blog.csdn.net/xialingming/article/details/83093031