如何配置 Marathon-lb 以对在 HOST 网络中启动的服务进行负载平衡?

How to config Marathon-lb to load balance a service launched in HOST network?

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

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

我想知道如何配置服务的 json 以便 marathon-lb 进行负载平衡并向外部公开端口 B。

我已经尝试过各种方案和配置,但 none 有效。我构造的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 响应是 "Empty reply from server"。但是,如果我 curl http://physicalNodeIP:portB 我可以连接到该服务的一个实例。

提前致谢。

您的 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。