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网桥

[email protected]:~# 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个网络了。

查看网桥信息

[email protected]:~# 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

[email protected]:~# 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

[email protected]:~# 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

原文地址:https://www.cnblogs.com/xiao987334176/p/11405416.html

时间: 2024-11-03 05:28:23

Docker容器跨主机通信之:OVS+GRE的相关文章

Docker容器跨主机通信之:直接路由方式

概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要.再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题.本文就来尝试一下. 方案原理分析 由于使用容器的IP进行路由,就

Docker容器跨主机多网段通信解决方案

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,但是consul服务并不能实现多个网段跨主机进行通信,在这种情况之下,MacVlan的概念就应用而生了. Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从

Docker:macvlan实现容器跨主机通信 [十四]

一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface 可以配置自己的 IP. 3.macvlan 本质上是一种网卡虚拟化技术 二.跨主机通信 1.创建macvlan 1.主机luoahong [[email protected] ~]# docker network create --driver macvlan --subnet 10.0.0.0/2

docker之跨主机通信

本地workstations虚拟机server1和server2环境为centOS7.7,安装软件为docker-ce,docker版本为19.03.05docker安装就不介绍了,直接进主题.一.准备工作跨主机需要两个独立的网卡:server1和server2添加网卡 [[email protected] ~]# ip addr show 查看网卡是否添加成功 添加成功. macvlan本身是linxu kernel的模块,本质上是一种网卡虚拟化技术.其功能是允许在同一个物理网卡上虚拟出多个网

[Kubernetes][Kubernetes容器网络2]深入解析容器跨主机网络

目录 深入解析容器跨主机网络 Flannel Flannel UDP模式基本原理 UDP模式的缺陷 Flannel VXLAN 模式 深入解析容器跨主机网络 在Docker默认配置下,不同宿主机上的容器通过IP地址是无法相互通信的. 因此社区出现了很多用于解决容器跨主机通信问题的方案. Flannel Flannel 支持三种后端实现: VXLAN host-gw UDP 先以 UDP 模式为例 Flannel UDP模式基本原理 假设有两台宿主机: Node1: container-1,IP

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务. 下面我们讨论一下 overlay 网络的具体实现: docker 会为每个 overlay 网络创建一个独立的 network namespace,其中会有一个 linux brid

docker之docker容器flannel模式多网段跨主机通信

一.简介flannel是为实现多网段通信的第三方的解决方案, 是 CoreOS 开发的容器网络解决方案.flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器间无需 NAT 和 port mapping 就可以跨主机通信.每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet.为了在各个主机间共享信息

Docker跨主机通信:桥接方式和路由方式

1.直接路由 通过在主机中添加静态路由来实现跨主机通信.如果有两台主机host1和host2,两主机上的docker容器是两个独立的二层网络,将con1发往con2的数据流先转发到主机host2上,再由host2转发到其上的docker容器中,反之亦然. 由于使用容器的IP进行路由,就需要避免不同主机上的docker容器使用相同冲突的IP,所有应该为不同的主机分配不同的IP子网. #主机A上:192.168.187.143,主机B:192.168.187.144 #S1:添加网卡docker0,

Docker跨主机通信网络

Docker跨主机通信网络 跨主机网络方案包括: docker原生的 overlay 和 macvlan.第三方方案:常用的包括flannel.weave 和 calico. (1)准备 Overlay 网络实验环境 [[email protected] ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap [[email protected] ~]# netstat -