在BRIDGE模式下运行Chronos泊坞窗图像

时间:2015-10-09 10:43:49

标签: docker mesos marathon

我正在组建一个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的任何经验,那么我感谢您在解决此问题时可能提供的任何帮助。

此致

保罗·马特尔

2 个答案:

答案 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,我能够通过明确设置BRIDGELIBPROCESS_ADVERTISE_IP并将其第二个端口固定到{{}}来成功配置Chronos LIBPROCESS_ADVERTISE_PORT模式{1}}这不是理想的,但我能找到的唯一方法就是让它正确地将其端口宣传给Mesos:

hostPort