【发布时间】:2017-07-26 05:06:37
【问题描述】:
我设置了一个带有 vm 机器的 Mesos 集群,机器 A(master + agent)和机器 B(仅代理),我还在机器 A 上运行 Marathon 和 Mesos-dns,两个代理都支持 docker。
我通过 Marathon 使用 docker 启动了一个 Web 应用程序,docker 容器以桥接网络模式运行。
当我运行一个实例时,容器正常启动并且Mesos-dns使用docker服务内部IP(例如172.17.0.2)正确解析它,但是因为我只运行一个实例并且mesos集群中有两个代理,所以只有一个代理得到容器,另一个什么都没有,如果客户端访问没有运行的mesos代理,就会出现错误。
这意味着,容器在机器 B 上运行,不在机器 A 上运行,我的 docker 应用程序名为 test,并使用端口 5000 进行侦听,一旦我在机器 B 上运行“curl http://test.marathon.mesos:5000/”,我得到了正确的响应,但是当我在机器 A 上运行相同的命令时,出现错误“curl: (7) Failed to connect to test.marathon.mesos port 5000: No route to host”,mesos-dns 将域解析为 docker internal ip 172.17.0.2,但是这个ip没有出现在机器A上,因为机器A上没有运行任何容器。
我也可以在同一个代理节点上运行多个实例而没有任何问题,但据我所知,mesos 集群和马拉松在代理节点上随机运行应用程序,因此如果客户端访问代理,则可以访问负载均衡器后面的所有代理节点通过负载均衡器没有容器的节点,这对客户端来说是个问题。
我的 mesos-dns 配置文件如下:
{
"zk":"zk://10.11.54.103:2181,10.11.54.103:2182,10.11.54.103:2183/mesos",
"masters": ["10.11.54.103:5050"],
"refreshSeconds": 60,
"ttl": 60,
"domain": "mesos",
"port": 53,
"resolvers": ["10.11.255.1","10.11.255.2","4.2.2.2"],
"timeout": 5,
"httpon": true,
"dnson": true,
"httpport": 8123,
"externalon": true,
"listener": "10.11.54.103",
"SOAMname": "ns1.mesos",
"SOARname": "root.ns1.mesos",
"SOARefresh": 60,
"SOARetry": 600,
"SOAExpire": 86400,
"SOAMinttl": 60,
"IPSources": ["netinfo", "mesos", "host"]
}
我希望 Mesos-dns 可以跨整个 mesos 集群解析域,有什么想法吗?
【问题讨论】: