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.4 M
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
├─10914 tee -a /var /log /openvswitch/ovs-ctl.log
├─10943 ovs-vswitchd unix:/var /run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info
├─10944 ovs-vswitchd unix:/var /run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info
└─10945 ovs-vswitchd unix:/var /run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info
1 月 16 11 :20 :38 Centos-L410 systemd[1 ]: Starting LSB: Open vSwitch switch...
1 月 16 11 :20 :39 Centos-L410 openvswitch[10908 ]: /etc/openvswitch/conf.db does not exist ... (warning).
1 月 16 11 :20 :39 Centos-L410 openvswitch[10908 ]: install : cannot change owner and permissions of '/etc/openvswitch' : No such file or directory
1 月 16 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
1 月 16 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)
1 月 16 11 :20 :39 Centos-L410 openvswitch[10908 ]: [FAILED]
解决办法是,
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
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
[root@Centos -L410 download]
Redirecting to /bin/systemctl restart docker.service
[root@Centos -L410 download]
[root@Centos -L410 download]
以上的配置,最重要的几个是,
设置gre隧道
连接br0到docker0
增加docker0的路由地址172.17.0.0/16
这几个配置表明了,OVS用一个更大的逻辑网络172.x.x.x/24
将两个容器连接在一起,而实际网络是通过172.17.x.x/16
来连接的,打通逻辑网络和实际网络的方法就是用gre。
测试OVS连接
配置完成之后,就可以互相ping通了,如下,
还可以用wireshark查看包,如下,