用openvswitch配置跨节点的docker网络环境

在一篇随笔中,我们已经尝试了在不依赖工具的情况下设置docker的ip,连我都想吐槽,MD单机都这么麻烦,在多机的环境中岂不是要了我的小命!

本文就是为了多机环境中各个节点的容器通信而做的,网络拓朴如下,这里用到了openvswitch工具。

openvswitch为我们建立一个扩展到三层网络的网桥,我们知道vlan是不能跨子网的,openvswitch利用了隧道技术,将二层的报文用三层的协议(udp/sdn)重新封装,从而实现二层网络在三层中进行扩展:如下图:

openvswitch是一个比较直观的解决方案,它暴露了足够多的细节给我们,生产环境中定位问题也是比较方便的。

openvswitch的安装

首先在centos7上安装openvswitch(很可惜yum源中并没有编译好的rpm,但debian是有的),我们编译的时候生成rpm而不是利用make install的方式,因为openvswitch的启动是比较麻烦的(可以读一下INSTALL.md),生成rpm然后安装rpm的方式在系统中添加了启动和停止服务,使用起来很方便。

下面是安装过程,基本是INSTALL.md的翻译,但INSTALL.md写得有点冗长,有细节问题会对我们的编译过程造成一些干扰。

1、下载openvswitch的源码,下载release版本的openvswitch源码可以减少很多麻烦。

wget http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz

2、建立rpmbuild结构(这里其实只需要建立$HOME/rpmbuild/SOURCES目录即可,其它的目录可以在rpmbuild执行过程生成的)

cp openvswitch-2.5.0.tar.gz $HOME/rpmbuild/SOURCES

3、安装编译所需要的依赖包:

   yum install gcc make python-devel openssl-devel kernel-devel graphviz        kernel-debug-devel autoconf automake rpm-build redhat-rpm-config        libtool

4、检查内核开发kernel-devel源码的位置是否正确:

ls /lib/modules/$(uname -r) -ln

从上图可以看出,build是一个无效的称号链接,删除这个链接,重新链接到正确目录:

rm /lib/modules/$(uname -r)/build
ln -s /usr/src/kernels/3.10.0-327.13.1.el7.x86_64 /lib/modules/$(uname -r)/build

5、在任意目录下解压开源码,进入源码目录:

tar -zxvf openvswitch-2.5.0.tar.gzcd openvswitch-2.3.2

6、执行rpmbuild生成rpm安装包:

rpmbuild -bb --without check rhel/openvswitch.spec

--without check表明不运行测试。

另外我们可以不需要编译内核模块,这样子,报文会发到用户空间由程序去处理,这样子效率会有所下降,但对内核动手毕竟是一件比较危险又麻烦的事。SO。。。

7、最后安装我生成的rpm包:

yum localinstall $HOME/rpmbuild/RPMS/openvswitch-2.5.0-1.x86_64.rpm

建立vxlan拓朴

下面利用openvswitch建立我们所需要的vxlan网络拓朴:

1、在192.168.1.102执行:

# 有错误则停止执行
set -e
# 创建一个openvswitch bridge
ovs-vsctl add-br ovs-br0
# 添加一个到192.168.1.108的接口
ovs-vsctl add-port ovs-br0 vxlan-port-to-192.168.1.108 -- set  interface vxlan-port-to-192.168.1.108 type=vxlan option:remote_ip="192.168.1.108"

# 创建一对虚拟网卡veth
ip link add vethx type veth peer name vethContainer

# sleep 3 seconds to wait for the completion of previous work.
sleep 3

# 将vethx接入到ovs-br0中
ovs-vsctl add-port ovs-br0 vethx
ifconfig vethx up

# 启动docker容器,使用--net=none策略
export containerID=$(docker run -tid --net=none ubuntu:latest /bin/bash)
export pid=$(docker inspect -f "{{.State.Pid}}" ${containerID})

echo containerID=${containerID}
echo pid=${pid}

# 如果net namespace目录没有创建则新建一个
if [ ! -d "/var/run/netns" ]; then
  mkdir -p /var/run/netns
fi

# 将docker容器使用的net namespace 打回原形
ln -s /proc/${pid}/ns/net /var/run/netns/${pid}
ip netns list

# 将vethContainer加入到容器的net namespace中
ip link set vethContainer netns ${pid}

# 配置vethContainer接口
ip netns exec ${pid} ifconfig vethContainer 192.168.100.100/24 up
ip netns exec ${pid} ifconfig -a

2、同样在192.168.1.108上执行:

# 有错误则停止执行
set -e
# 创建一个openvswitch bridge
ovs-vsctl add-br ovs-br0
# 添加一个到192.168.1.102的接口
ovs-vsctl add-port ovs-br0 vxlan-port-to-192.168.1.102 -- set  interface vxlan-port-to-192.168.1.102 type=vxlan option:remote_ip="192.168.1.102"

# 创建一对虚拟网卡veth
ip link add vethx type veth peer name vethContainer

# sleep 3 seconds to wait for the completion of previous work.
sleep 3

# 将vethx接入到ovs-br0中
ovs-vsctl add-port ovs-br0 vethx
ifconfig vethx up

# 启动docker容器,使用--net=none策略
export containerID=$(docker run -tid --net=none ubuntu:latest /bin/bash)
export pid=$(docker inspect -f "{{.State.Pid}}" ${containerID})

echo containerID=${containerID}
echo pid=${pid}

# 如果net namespace目录没有创建则新建一个
if [ ! -d "/var/run/netns" ]; then
  mkdir -p /var/run/netns
fi

# 将docker容器使用的net namespace 打回原形
ln -s /proc/${pid}/ns/net /var/run/netns/${pid}
ip netns list

# 将vethContainer加入到容器的net namespace中
ip link set vethContainer netns ${pid}

# 配置vethContainer接口
ip netns exec ${pid} ifconfig vethContainer 192.168.100.101/24 up
ip netns exec ${pid} ifconfig -a

测试:

192.168.1.102上的容器:

192.168.1.108上的容器:

时间: 2024-08-08 13:57:04

用openvswitch配置跨节点的docker网络环境的相关文章

实现跨主机的docker网络环境和网络控制节点

1. 安装3台centos7 Linux虚机, 公网分别是:114.112.62.75,114.112.62.76,114.112.62.77 私网分别是:192.168.1.4,  192.168.1.5,  192.168.1.6 2. 在3台机器上安装openvswitch 2.5. 根据openvswitch文档build RPM包,然后在每台机器上yum localinstall rpm 3. 在3台机器上安装docker,yum install docker. 4. 在3台机器上yu

(八)Docker网络跨主机通讯vxlan和vlan

基于OpenvSwitch实现跨主机通信: 环境描述: 计算机名称 IP Docker01 eth0:192.168.124.150/24 eth1:172.16.100.20/24 docker0:172.17.0.1/24(默认) Docker02 eth0:192.168.124.15124 eth1:172.16.100.30/24 docker0:172.17.0.1/24(默认) dockerothsrv eth0:192.168.124.152/24 eth1:172.16.100

docker网络配置方法总结

docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥,它可以使容器和主机相互通信,容器与容器间通信.问题是,如何让位于不同主机上的docker容器可以通信.如何有效配置docker网络目前来说还是一个较复杂的工作,因而也涌现了很多的开源项目来解决这个问题,如flannel.Kubernetes.weave.

利用OpenVSwitch构建多主机Docker网络

[编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目). 在多台主机上运行却是另

ovs+docker网络配置

此文主要以<实战Docker到Kubernetes技术系列视频教程>为基础,记录ovs+docker网络的配置实验过程. 本人对网络不甚了解.只是纯粹按照课程要求,配置成功.具体的原理请自行深入学习. 网络架构图 实验目的 这里有三个不同网络,主机网络192.168.18网段,两台host上的docker0的网络也是不同子网.需要实现两台不同主机的docker0可以实现通信.即在18.131机器上,可以ping通 172.17.43.1:18.128机器可以ping通172.17.42.1.

Docker网络配置、Docker部署分布式项目

目标 1.Docker网络配置 2.Docker部署SpringCloud项目 Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用--net去指定,其他三种模式需要在创建容器时使用--net去指定 1.bridge模式(默认模式) docker run时使用--net=bridge,这种模式会为每个容器分配一个独立的Network Namespace, 同一个宿主机上的所有容器会

Docker 网络之pipework 工具(2)将Docker容器配置到本地网络环境中

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求.这个需求其实很容易实现,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了.下面我们来操作一下,我主机A地址为192.168.1.107/24,网关为192.168.1.1,需要给Docker容器的地址配置为192.168.1.150/24.在主机A上做如下操作:安装pipework下载地址:wgethttps://github.com/jpetazz

docker(3):配置rancher网络环境,下载启动tomcat容器

1,关于rancher 上次搭建好了rancher的环境但是网络啥的没有配置好. 没有成功创建容器.这次搞定了,原来是网络的问题. 之前virtualbox安装的coreos没有配置ip,造成网络访问不到. agent没有注册成功,没有主机环境,创建不了docker应用 . 2,配置网络 如果没有配置virtualbox的网络环境的时候,网络是nat的环境,这个时候只要将主见设置成 10.0.2.15 即可. 这个是virtualbox分配的nat的ip,但是这个网络是不能和外接通讯的. 只能使

八、Docker 网络配置

Dokcer 通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理.当 Docker daemon 启动时需要做以下操作: 1)如果 docker0 不存在则创建 2)搜索一个与当前路由不冲突的 ip 段 3)在确定的范围中选择 ip 4)绑定 ip 到 docker0 8.1 Docker 四种网络模式 使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下 4 种网络模式: host模式,