跨主机集群容器模式

在同一台主机上运行多个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的用法,更高级的网络配置请关注后续更新。