我有一个由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
我可以连接到服务的实例。
提前谢谢。
答案 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。