我设置了一个带vm机器的Mesos集群,机器A(主机+代理)和机器B(仅代理),我还在机器A上运行Marathon和Mesos-dns,两个代理都支持docker。
我通过Marathon使用docker启动Web应用程序,docker容器以桥接网络模式运行。
当我运行一个实例时,容器正常启动并且Mesos-dns使用docker service内部IP(例如,172.17.0.2)将其解析正确,但是因为我只运行一个实例并且mesos集群中有两个代理,所以只有一个代理获取容器,另一个没有任何东西,如果客户端访问没有运行的mesos代理,则出现错误。
这意味着,容器在机器B上运行,在我运行"卷曲http://test.marathon.mesos:5000/"在机器B上,我得到了正确的响应,但是当我在机器A上运行相同的命令时,出现了错误"卷曲:(7)无法连接到test.marathon.mesos端口5000:没有到主机的路由& #34;,mesos-dns解析域到docker内部ip 172.17.0.2,但是这个ip没有出现在机器A上,因为机器A上没有运行任何容器。
我也可以在同一个Agent节点上运行很多实例而没有任何问题,但据我所知,mesos集群和marathon正在代理节点上运行应用程序随机化,因此如果客户端访问代理,则可以访问负载均衡器后面的所有代理节点没有容器的节点通过负载均衡器,这对客户来说是个问题。
我的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集群来解析域名,有什么想法吗?
答案 0 :(得分:0)
带Docker的Mesos-DNS
如果你选择使用带有Docker的Mesos-DNS,以及0.25之后的Mesos版本,请注意有一些警告。默认情况下,Docker执行程序将Docker容器的IP发布到NetworkInfo字段中。不幸的是,除非您使用Docker运行某种SDN解决方案,桥接或主机网络,否则这可以证明容器无法访问。
Mesos-DNS在config.json.sample中附带的默认配置忽略了来源的
netinfo
。如果从配置中省略此字段,则默认选项包括netinfo
。如果您在使用Docker时遇到问题,请确保检查IPSources字段以省略netinfo。
IPSources
定义任务记录的IP源回退列表, 按优先顺序排序。 如果您使用Docker并启用netinfo
IPSource,则可能导致任务无法访问,因为在Mesos 0.25之后,Docker执行程序会在NetworkInfo中发布容器的内部IP。