【问题标题】:Running Chronos docker image in BRIDGE mode在 BRIDGE 模式下运行 Chronos docker 镜像
【发布时间】:2017-12-15 18:22:30
【问题描述】:

我一直在构建一个 POC mesos/marathon 系统,用于启动和控制 docker 映像。

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

我决定将 Chronos 添加到组合中,最初我将它作为服务在 vagrant VM 上运行,但后来选择切换到使用 mesosphere/chronos 在 docker 容器中运行它图片。

我发现当我为容器指定 HOST 网络模式时,我可以让容器镜像启动并成功运行,但是当我更改为 BRIDGE 模式时,我遇到了问题。

在BRIDGE模式下,chronos框架向mesos注册成功(我可以在mesos UI的frameworks页面上看到条目),但看起来框架本身并不知道注册成功。 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 的经验,那么我将不胜感激您在解决此问题时可能提供的任何帮助。

问候,

保罗·马特

【问题讨论】:

    标签: docker mesos marathon


    【解决方案1】:

    我设法找到了我的问题的答案(在示例框架 here 的帮助下),所以我想我应该发布一个解决方案来帮助其他人遇到同样的问题。

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

    Zookeeper 会报告主服务器在 127.0.1.1 上可用,这是启动 mesos-master 进程的主机 VM 的 IP 地址,但尽管可以从容器 ping 通此 IP 地址,但任何尝试连接到特定端口将被拒绝。

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

    完成此操作后,mesos 和 chronos 框架之间的通信开始完成,并且 chronos 中安排的任务成功运行。

    【讨论】:

      【解决方案2】:

      运行 Mesos 1.1.0 和 Chronos 3.0.1,通过显式设置 LIBPROCESS_ADVERTISE_IPLIBPROCESS_ADVERTISE_PORT 并将其第二个端口固定到 hostPort,我能够在 BRIDGE 模式下成功配置 Chronos理想但我能找到让它正确地向 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"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        相关资源
        最近更新 更多