跨主机集群容器模式
在同一台主机上运行多个zookeeper容器可以实现集群方式,并且可以很方便的文件共享(数据卷)。
但是遇到跨主机访问就不会那么方便,容器的跨主机网络的访问官方没有提供现成的方案。
不过官方提供的高级网络配置中,可以利用其配置原理,自己搭建一个网桥,实现容器的互相访问,pipework就是这样实现了跨主机访问,有兴趣的话可以关注一下,这不是本文的重点。
本文将结合之前试验过的Open vSwitch
的网络虚拟交换机技术来实现跨主机访问,这里只是使用,详细信息请点这里。
配置Open vSwitch 环境
在配置zookeeper之前,需要配置OVS虚拟交换机,我们可以运行脚本OVSconf,就可以完成配置。需要注意的是,该脚本需要对网络的访问支持。运行完该脚本之后就可以使用Open vSwitch了(脚本之在CentOS7下配置,需要root权限,可能运行中会出现问题,这时请与我联系。)完成后,查看服务是否启动正确,
# systemctl status openvswitch -l
再查看接口状态:
# ovs-vsctl show
49947409-269d-44d3-a851-3927d89e1968
Bridge "ovs0"
Port "ovs0"
Interface "ovs0"
type: internal
Port "docker0"
Interface "docker0"
Port "eno16777736"
Interface "eno16777736"
ovs_version: "2.4.0"
我们看到,docker0已经成功添加到网桥ovs0上了。
配置zookeeper文件
本次试验主机操作系统为CentOS7的两台虚拟主机,主机的IP地址为:
Server1:192.168.4.121
Server2:192.168.4.123
创建容器:
Server1:
Docker deamon配置为:
# docker -d --fixed-cidr=172.17.0.0/24
运行容器并分别进入容器(需打开多个shell窗口):
# docker run -it --name=zk1 zookeeper
# docker run -it --name=zk2 zookeeper
Server2:
Docker deamon配置为:
# docker -d --fixed-cidr=172.17.1.0/24
运行容器并分别进入容器:
# docker run -it --name=zk3 zookeeper
进入容器后,可以使用ip addr命令查看docker0分配的ip:
zk1 172.17.0.1
zk2 172.17.0.1
zk3 172.17.0.1
故进入容器内部分别配置zoo.cfg,如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper/data
clientPort=2181
server.1=172.17.0.1:2888:3888
server.2=172.17.0.2:2888:3888
server.3=172.17.1.1:2888:3888
配置好之后,我们在容器内部运行:
zk1:
[root@e3c26bffd1d0 /]# mkdir /var/zookeeper/data
[root@e3c26bffd1d0 /]# vi /var/zookeeper/data/myid
[root@e3c26bffd1d0 /]# echo 1 > /var/zookeeper/data/myid
[root@e3c26bffd1d0 /]# /var/zookeeper/bin/zkServer.sh start-foreground
zk2
[root@b60565e62c2f /]# mkdir /var/zookeeper/data
[root@b60565e62c2f /]# vi /var/zookeeper/data/myid
[root@b60565e62c2f /]# echo 2 > /var/zookeeper/data/myid
[root@b60565e62c2f /]# /var/zookeeper/bin/zkServer.sh start-foreground
zk3
[root@1d8cb4d6663d /]# mkdir /var/zookeeper/data
[root@1d8cb4d6663d /]# vi /var/zookeeper/data/myid
[root@1d8cb4d6663d /]# echo 3 > /var/zookeeper/data/myid
[root@1d8cb4d6663d /]# /var/zookeeper/bin/zkServer.sh start-foreground
接下来我们就运行,进入容器,到zookeeper/bin目录下,zkServer.sh start(也可以start-foreground)。
测试
到主机上测试:
我们没有做端口映射,这样主机是访问不了容器的,我们可以利用ovs给容器添加一个192.168.4.0网段的ip:
# ovs-docker add-port ovs0 eth1 zk1 --ipaddress=192.168.4.125/24 --gateway=192.168.4.1
# telnet 192.168.4.125 2181
Trying 192.168.4.125...
Connected to 192.168.4.125.
Escape character is '^]'.
stat
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
/192.168.4.121:39150[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 4
Connection closed by foreign host.
可以看到跨主机的zookeeper配置已经完成,本文简单介绍了OVS的用法,更高级的网络配置请关注后续更新。