在BRIDGE模式下运行Chronos docker镜像

我一直在组build一个POC mesos / marathon系统,用来启动和控制docker图像。

我有一个在VirtualBox上运行的Vagrant虚拟机,在该虚拟机上运行docker,marathon,zookeeper,mesos-master和mesos-slave进程,一切按预期运行。

我决定添加Chronos,最初我开始在stream浪VM上作为服务运行,但之后select使用mesosphere / chronos映像切换到Docker容器中运行它。

我发现,当我为容器指定HOSTnetworking模式时,我可以获得容器映像启动和成功运行,但是当我更改为BRIDGE模式时,则遇到问题。

在BRIDGE模式下,chronos框架成功注册了mesos(我可以在mesos UI的框架页面上看到这个条目),但是看起来框架本身并不知道注册是成功的。 mesos主日志如果充满消息,如:

strong textI1009 09:47:35.876454 3131 master.cpp:2094] Received SUBSCRIBE call for framework 'chronos-2.4.0' at scheduler-16d21dac-b6d6-49f9-90a3-bf1ba76b4b0d@172.17.0.59:37318 I1009 09:47:35.876832 3131 master.cpp:2164] Subscribing framework chronos-2.4.0 with checkpointing enabled and capabilities [ ] I1009 09:47:35.876924 3131 master.cpp:2174] Framework 20151009-094632-16842879-5050-3113-0001 (chronos-2.4.0) at scheduler-16d21dac-b6d6-49f9-90a3-bf1ba76b4b0d@172.17.0.59:37318 already subscribed, resending acknowledgement 

这意味着某种configuration/通信问题,但我还没有能够确切地解决问题的根源。 我不确定是否有任何方法来确认从mesos的确认是否回到计时器或检查组件之间的通信渠道的状态。

我做了很多search,我可以find遇到同样问题的人的post,但我还没有find详细的解释,需要做什么来纠正它。

例如,我发现下面的post提到了一个已经解决的问题,这意味着用户成功地以桥接模式运行了他们的chronos容器,但是他们的parsing描述是模糊的。 也有这个职位,但改变build议确实解决了我看到的问题。

最后,ILM的一个人发了一个post ,声音听起来像是我的问题,解决scheme似乎涉及修复Mesos,以引入两个新的环境variablesLIBPROCESS_ADVERTISE_IP和LIBPROCESS_ADVERTISE_PORT(位于LIBPROCESS_IP和LIBPROCESS_PORT之上),但找不到一个体面的解释是什么值应该被分配给这些variables,所以还没有弄清楚这个变化是否能够解决我所遇到的问题。

可能值得一提的是,我也在chronos-scheduler组织上发布了一些问题,但是我还没有对这些问题做出任何回应。

如果有任何帮助,我运行的软件版本如下(卷装载允许我提供其他参数值[例如master,zk_hosts]作为文件,而不必改变JSON):

 Vagrant: 1.7.4 VirtualBox: 5.0.2 Docker: 1.8.1 Marathon: 0.10.1 Mesos: 0.24.1 Zookeeper: 3.4.5 

我用来启动chronos容器的JSON如下所示:

 { "id": "chronos", "cpus": 1, "mem": 1024, "instances": 1, "container": { "type": "DOCKER", "docker": { "image": "mesosphere/chronos", "network": "BRIDGE", "portMappings": [ { "containerPort": 4400, "hostPort": 0, "servicePort": 4400, "protocol": "tcp" } ] }, "volumes": [ { "containerPath": "/etc/chronos/conf", "hostPath": "/vagrant/vagrantShared/chronos", "mode": "RO" } ] }, "cmd": "/usr/bin/chronos --http_port 4400", "ports": [ 4400 ] } 

如果任何人有任何使用Chronos的经验,在这样的configuration中,我将不胜感激任何帮助,你可以提供解决这个问题。

问候,

保罗Mateer

我设法找出了我的问题的答案(从这里的示例框架的一些帮助),所以我想我应该发布一个解决scheme,以帮助其他人遇到同样的问题。

chronos服务(以及示例框架)被configuration为与主机(vagrant)VM上的docker0接口(本例中为172.17.42.1)相关的IP上的zookeeper进行通信。

Zookeeper会报告主机在127.0.1.1上可用,这是主机进程启动的主机虚拟机的IP地址,但是尽pipe这个IP地址可以从容器中ping通,但是任何尝试连接到特定端口的尝试都是拒绝了。

解决方法是使用–advertise_ip参数启动mesos-master并指定docker0接口的IP。 这意味着,虽然服务在主机上启动,但它看起来好像已经在docker0 ionterface上启动了。

一旦完成了mesos和chronos框架之间的通信,chronos中计划的任务就会成功运行。

运行Mesos 1.1.0和Chronos 3.0.1,我能够通过显式设置LIBPROCESS_ADVERTISE_IPLIBPROCESS_ADVERTISE_PORT并将其第二个端口固定到一个不理想的LIBPROCESS_ADVERTISE_PORT端口来成功configurationChronos,这是我能find的唯一方法正确地将其端口广告给Mesos:

 { "id": "/core/chronos", "cmd": "LIBPROCESS_ADVERTISE_IP=$(getent hosts $HOST | awk '{ print $1 }') LIBPROCESS_ADVERTISE_PORT=$PORT1 /chronos/bin/start.sh --hostname $HOST --zk_hosts master-1:2181,master-2:2181,master-3:2181 --master zk://master-1:2181,master-2:2181,master-3:2181/mesos --http_credentials ${CHRONOS_USER}:${CHRONOS_PASS}", "cpus": 0.1, "mem": 1024, "disk": 100, "instances": 1, "container": { "type": "DOCKER", "volumes": [], "docker": { "image": "mesosphere/chronos:v3.0.1", "network": "BRIDGE", "portMappings": [ { "containerPort": 9900, "hostPort": 0, "servicePort": 0, "protocol": "tcp", "labels": {} }, { "containerPort": 9901, "hostPort": 9901, "servicePort": 0, "protocol": "tcp", "labels": {} } ], "privileged": true, "parameters": [], "forcePullImage": true } }, "env": { "CHRONOS_USER": "admin", "CHRONOS_PASS": "XXX", "PORT1": "9901", "PORT0": "9900" } }