文章目录
  1. 1. 安装OVS
  2. 2. 配置OVS
  3. 3. 测试OVS连接

OVS(Open vSwitch)是一款优秀的虚拟交换机工具,广泛运用在虚拟机、容器等虚拟化领域。本文使用OVS来连接不同宿主机上的docker容器,原理上是使用OVS的gre隧道来完成连接,搭建环境与之前一篇文章《Docker容器间网络互联》相同。

安装OVS

先安装OVS,在Ubuntu上安装的命令是apt-get install openvswitch-switch openvswitch-controller,在Centos上安装比较麻烦,需要自行编译。先去这里找到需要OVS的release版下载,我用的是2.3.2版本。然后根据这里的安装指南进行安装。步骤如下,

先建立$HOME/rpmbuild/SOURCES目录,

1
2
mkdir -p $HOME/rpmbuild/SOURCES
cp openvswitch-2.3.2.tar.gz $HOME/rpmbuild/SOURCES

然后解包,再build rpm,

1
2
3
4
tar xzf openvswitch-2.3.2.tar.gz
cd openvswitch-2.3.2
sed 's/openvswitch-kmod, //g' rhel/openvswitch.spec > rhel/openvswitch-no-kmod.spec
rpmbuild -bb rhel/openvswitch.spec

注意,本文编译时使用了sed 's/openvswitch-kmod, //g' rhel/openvswitch.spec > rhel/openvswitch-no-kmod.spec取消了对openvswitch-kmod的依赖,否则在安装的时候会提示找不到这个包,这可能是redhat与centos的不同造成的。默认情况下,build过程中会进行check,因此整个过程较慢,如果想跳过check,可以使用--without check选项。编译完成之后会生成2个rpm安装包,在$HOME/rpmbuild/RPMS/x86_64目录下,其中,openvswitch-2.3.2-1.x86_64.rpm是我们所需的,用yum安装yum install openvswitch-2.3.2-1.x86_64.rpm即可。

安装完成之后,需要启动OVS服务service openvswitch start,启动的过程中可能会卡住,出现如下错误,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@Centos-L410 download]# service openvswitch status
ovsdb-server is not running
ovs-vswitchd is running with pid 10945
[root@Centos-L410 download]# systemctl -l status openvswitch.service
● openvswitch.service - LSB: Open vSwitch switch
Loaded: loaded (/etc/rc.d/init.d/openvswitch)
Active: activating (start) since 六 2016-01-16 11:20:38 CST; 2min 0s ago
Docs: man:systemd-sysv-generator(8)
Process: 10755 ExecStop=/etc/rc.d/init.d/openvswitch stop (code=exited, status=0/SUCCESS)
Control: 10908 (openvswitch)
Memory: 2.4M
CGroup: /system.slice/openvswitch.service
├─10908 /bin/sh /etc/rc.d/init.d/openvswitch start
├─10912 /bin/sh /usr/share/openvswitch/scripts/ovs-ctl start --system-id=random
├─10914 tee -a /var/log/openvswitch/ovs-ctl.log
├─10943 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
├─10944 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
└─10945 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
116 11:20:38 Centos-L410 systemd[1]: Starting LSB: Open vSwitch switch...
116 11:20:39 Centos-L410 openvswitch[10908]: /etc/openvswitch/conf.db does not exist ... (warning).
116 11:20:39 Centos-L410 openvswitch[10908]: install: cannot change owner and permissions of '/etc/openvswitch': No such file or directory
116 11:20:39 Centos-L410 ovsdb-tool[10938]: ovs|00001|lockfile|WARN|/etc/openvswitch/.conf.db.~lock~: failed to open lock file: No such file or directory
116 11:20:39 Centos-L410 openvswitch[10908]: Creating empty database /etc/openvswitch/conf.db ovsdb-tool: I/O error: /etc/openvswitch/conf.db: failed to lock lockfile (No such file or directory)
116 11:20:39 Centos-L410 openvswitch[10908]: [FAILED]

解决办法是1

1
2
3
4
yum install policycoreutils-python
mkdir -p /etc/openvswitch
semanage fcontext -a -t openvswitch_rw_t "/etc/openvswitch(/.*)?"
restorecon -Rv /etc/openvswitch

然后就可以正常启动了,

1
2
3
4
5
[root@Centos-L410 x86_64]# service openvswitch start
Starting openvswitch (via systemctl): [ OK ]
[root@Centos-L410 x86_64]# service openvswitch status
ovsdb-server is running with pid 11703
ovs-vswitchd is running with pid 11716

总之,还是Ubuntu方便......

配置OVS

默认情况,如果不做任何设置,两个宿主机上的容器是无法ping到对方的。下面使用OVS的gre隧道打通两个容器间的连接,先进行Ubuntu(192.168.2.201)上的配置,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
# root@Ubuntu-Asus [192.168.2.201] in /var/lib/docker [11:36:18]
$ ip link set docker0 down
## 删除docker0网桥
## 删除OVS的br0网桥
## 增加docker0网桥
## 给新增的docker0网桥分配ip地址
## 将docker0网桥启用
## 新增OVS的br0网桥
## 配置br0网桥的gre隧道,远端地址是192.168.2.202
## 将OVS网桥br0连接到网桥docker0上
## 重启docker后台进程
## 启用br0网桥

然后配置Centos(192.168.2.202),如下

两边的配置差不多,以Centos为例说明一下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## Centos7 192.168.2.202
## 关闭docker0网桥
[root@Centos-L410 download]# ip link set docker0 down
## 删除docker0网桥
[root@Centos-L410 download]# brctl delbr docker0
## 删除OVS的br0网桥
[root@Centos-L410 download]# ovs-vsctl del-br br0
## 增加docker0网桥
[root@Centos-L410 download]# brctl addbr docker0
## 给新增的docker0网桥分配ip地址
[root@Centos-L410 download]# ip a add 172.17.1.1/24 dev docker0
## 将docker0网桥启用
[root@Centos-L410 download]# ip link set docker0 up
## 新增OVS的br0网桥
[root@Centos-L410 download]# ovs-vsctl add-br br0
## 配置br0网桥的gre隧道,远端地址是192.168.2.201
[root@Centos-L410 download]# ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.2.201
## 将OVS网桥br0连接到网桥docker0上
[root@Centos-L410 download]# brctl addif docker0 br0
## 启用br0网桥
[root@Centos-L410 download]# ip link set br0 up
## 重启docker后台进程
[root@Centos-L410 download]# service docker restart
Redirecting to /bin/systemctl restart docker.service
## 清除所有iptables规则
[root@Centos-L410 download]# iptables -t nat -F;iptables -F
## 增加docker0的路由地址172.17.0.0/16
[root@Centos-L410 download]# ip route add 172.17.0.0/16 dev docker0

以上的配置,最重要的几个是,

  1. 设置gre隧道
  2. 连接br0到docker0
  3. 增加docker0的路由地址172.17.0.0/16

这几个配置表明了,OVS用一个更大的逻辑网络172.x.x.x/24将两个容器连接在一起,而实际网络是通过172.17.x.x/16来连接的,打通逻辑网络和实际网络的方法就是用gre。

测试OVS连接

配置完成之后,就可以互相ping通了,如下,

还可以用wireshark查看包,如下,

文章目录
  1. 1. 安装OVS
  2. 2. 配置OVS
  3. 3. 测试OVS连接

欢迎来到Valleylord的博客!

本博的文章尽量原创。