如何配置Marathon-lb来负载均衡在HOST网络中启动的服务?

时间:2017-01-11 14:16:45

标签: docker marathon dcos

我有一个由DC / OS管理的集群和一个我希望通过Marathon部署的dockerized服务。我已经有一个marathon-lb用于服务发现和其他现有服务的负载平衡。所有这些服务都使用BRIDGE网络部署。

新服务公开了多个端口。端口A用于服务实例之间的通信,端口B用于接受来自世界的请求。我想使用HOST(而不是BRIGE)网络来部署服务。

我想知道如何配置服务的json,以便marathon-lb负载平衡并暴露外部端口B.

我已经尝试了各种场景和配置,但没有一个工作。我构建的json如下所示。

{
  "id": "/cassandra-seed",   
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "cassandra:2.2.3",
      "network": "HOST",
      "requirePorts": true,
      "privileged": true,
      "forcePullImage": false     
    }
  },
  "constraints": [["hostname","UNIQUE"]],
  "labels": {
    "HAPROXY_GROUP": "external"
  },
  "portDefinitions": [
    { "port": portA,"protocol": "tcp"},
    { "port": portB,"protocol": "tcp"}
  ]
}

Marathon documentation中声明,通过在portDefitions中明确定义端口B并将requirePorts设置为true,服务端口等于主机端口。此外,我部署了新版本的marathon-lb,其中端口B是其portDefinitions部分(违反10000-10100默认范围)。

因此,我假设通过在服务json中提供HAPROXY_GROUP标签,marathon-lb将根据需要公开端口B.但是,情况似乎并非如此。如果我部署服务并且curl http://marathon-lb.marathon.mesos:portB响应是"来自服务器"的空回复。但是,如果我curl http://physicalNodeIP:portB我可以连接到服务的实例。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

看起来您在应用定义的错误部分中有requirePorts。它应该在顶层,如下所示:

{
  "id": "/cassandra-seed",   
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "cassandra:2.2.3",
      "network": "HOST",
      "privileged": true,
      "forcePullImage": false     
    }
  },
  "constraints": [["hostname","UNIQUE"]],
  "labels": {
    "HAPROXY_GROUP": "external"
  },
  "requirePorts": true,
  "portDefinitions": [
    { "port": portA,"protocol": "tcp"},
    { "port": portB,"protocol": "tcp"}
  ]
}

作为旁注,你应该考虑使用Cassandra框架,而不是在Marathon上运行Cassandra。