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 2
PING 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 ms
64 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 2
PING 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 ms
64 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

 


免責聲明!

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



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