我正在组建一个POC mesos / marathon系统,用于启动和控制泊坞窗图像。
我有一个在VirtualBox中运行的Vagrant虚拟机,我在其上运行docker,marathon,zookeeper,mesos-master和mesos-slave进程,一切都按预期工作。
我决定将Chronos添加到混合中,最初我开始在流浪的VM上作为服务运行,但后来选择使用 mesosphere / chronos 切换到在docker容器中运行它图像。
我发现当我为容器指定HOST网络模式时,我可以让容器映像启动并成功运行,但是当我更改为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
这意味着某种配置/通信问题,但我无法确切地解决问题的根源。我不确定是否有任何方法可以确认来自mesos的确认是否回到chronos或检查组件之间通信通道的状态。
我已经做了很多搜索,我可以找到遇到同样问题的人发帖,但我还没有找到需要做些什么来纠正它的详细解释。
例如,我发现following post提到了一个已解决的问题,这意味着用户在桥接模式下成功运行了他们的chronos容器,但他们对解决方案的描述含糊不清。还有this post但建议的更改确实解决了我所看到的问题。
最后ILM的某个人post听到的确是我的问题,解决方案似乎涉及修复Mesos引入两个新的环境变量LIBPROCESS_ADVERTISE_IP和LIBPROCESS_ADVERTISE_PORT(在LIBPROCESS_IP和LIBPROCESS_PORT之上) )但是我找不到应该为这些变量分配什么值的合理解释,所以还没有确定变更是否能解决我遇到的问题。
可能值得一提的是,我还在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的任何经验,那么我感谢您在解决此问题时可能提供的任何帮助。
此致
保罗·马特尔答案 0 :(得分:2)
我设法解决了我的问题(在示例框架here的帮助下),所以我想我应该发布一个解决方案来帮助其他人遇到同样的问题。
chronos服务(以及示例框架)被配置为在与主机(vagrant)VM上的docker0接口相关联的IP上与zookeeper通信(在本例中为172.17.42.1)。
Zookeeper会报告master在127.0.1.1上可用,这是mesos-master进程启动的主机VM的IP地址,但是虽然可以从容器中ping到任何尝试连接到特定IP地址的IP地址港口将被拒绝。
解决方案是使用 - advertise_ip 参数启动mesos-master并指定docker0接口的IP。这意味着虽然服务在主机上启动,但它似乎已经在docker0 ionterface上启动了。
完成此操作后,mesos和chronos框架之间的通信开始完成,并且在chronos中安排的任务成功运行。
答案 1 :(得分:0)
运行Mesos 1.1.0和Chronos 3.0.1,我能够通过明确设置BRIDGE
,LIBPROCESS_ADVERTISE_IP
并将其第二个端口固定到{{}}来成功配置Chronos LIBPROCESS_ADVERTISE_PORT
模式{1}}这不是理想的,但我能找到的唯一方法就是让它正确地将其端口宣传给Mesos:
hostPort