用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.gz
cd 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上的容器:

用openvswitch配置跨节点的docker网络环境的更多相关文章
- 删除修改docker网络环境
安装工具包 yum install bridge-utils -y 设置docker0 ip网段 ip link set docker0 down brctl delbr docker0 brctl ...
- docker 网络和/etc/docker/daemon.json文件详情
/etc/docker/daemon.json(没有就创建) [root@master ~]# /etc/docker/deamon.json { "registry-mirrors&quo ...
- Docker容器跨主机通信--overlay网络
一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...
- docker网络配置方法总结
docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...
- openvswitch以及docker网络
修改docker0的IP,教程写的是/etc/default/docker文件,但是那是过时的配置,真正的配置是在/etc/docker/daemon.json,格式是json的: { "r ...
- docker——网络配置
一.网络启动与配置参数 Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行数据转发.同时,Docker随 ...
- Docker 网络模式和跨主机通信
Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交 ...
- 使用pipework将Docker容器配置到本地网络环境中
使用pipework将Docker容器配置到本地网络环境中 需求 在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求.要实现这个需求,我们只要将Docker容器和主 ...
- docker网络配置
Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用--net去指定,其他三种模式需 ...
随机推荐
- web api 初体验之 GET和POST传参
上一篇我们讲到了web api跨域的问题 它几乎是每一个用web api的人都需要去解决的问题,不然都没法测试.接下来会遇到的问题就是传参了.还是用js前台调用服务的方式. GET 方式 get方式传 ...
- 记录DIV中滚动位置刷新页面位置保持不变
一.js部分: <script type="text/javascript"> $(document).ready(function () { ...
- 10 条有趣的 Linux 命令
在终端工作是一件很有趣的事情.今天,我们将会列举一些有趣得为你带来欢笑的Linux命令. 1. rev 创建一个文件,在文件里面输入几个单词,rev命令会将你写的东西反转输出到控制台. # rev & ...
- XenServer安全重启xapi的方法
XenServer安全重启xapi的方法 2012-11-29 12:58:07| 分类: 虚拟化-XenServer|字号 订阅 平常我们很常用到重启xapi命令,在这介绍下xapi: XAPI( ...
- 一个Java内存可见性问题的分析
如果熟悉Java并发编程的话,应该知道在多线程共享变量的情况下,存在“内存可见性问题”: 在一个线程中对某个变量进行赋值,然后在另外一个线程中读取该变量的值,读取到的可能仍然是以前的值: 这里并非说的 ...
- 1.Counting DNA Nucleotides
Problem A string is simply an ordered collection of symbols selected from some alphabet and formed i ...
- python 使用总结
本人原来是编写java的,后来转到编写ios之后,最后又来编写python了.相对于其他的一些开发人员来说,我精通的语言还是比较杂的. 这里将几个语言进行类比,比较一些个人的看法的东西. 首先obje ...
- js MATH
MATH Math 对象用于执行数学任务. 无需创建它,通过把 Math 作为对象使用就可以调用其所有属性和方法. Math 对象属性 var a=Math.E; //输出2.718281828459 ...
- 转:仿QQ长按弹出功能菜单
android app普遍常用的弹出上下文菜单是列表式的.QQ列表,在上方弹出冒泡效果菜单,如图 这里讲解一下如何写出这个效果: 图片资源:两张图片,可以拼接成如上效果. 首先,我们需要写布局文件: ...
- swift开源项目精选
Swift 开源项目精选-v1.0 2016-03-07 22:11 542人阅读 评论(0) 收藏 举报 分类: iOS(55) Swift(4) 目录(?)[+] 转自 http: ...