Mesos-DNS 是Mesos提供的服务发现的组件,本文介绍如何使用Mesos-DNS实现服务发现功能。
mesos-dns可以安装到mesos集群内的任意一个主机,也可以单独安装在额外一台主机,但是要和mesos集群在同一网段。
下载mesos-dns: https://github.com/mesosphere/mesos-dns/releases
mkdir /usr/local/mesos-dns
mv mesos-dns-v0.6.0-linux-amd64 /usr/local/mesos-dns/mesos-dns
chmod +x /usr/local/mesos-dns/mesos-dns
利用marathon运行mesos-dns可以实现failover, 如果mesos-dns挂掉,可以立马被Marathon拉起来。所以为了让marathon把mesos-dns管理起来,本文建议把mesos-dns安装到mesos agent节点上。
要用Marathon启动mesos-dns只需要配置以下mesos-dns的json文件。
cat > /usr/local/mesos-dns/config.json <<EOF
{
"zk": "zk://<zookeeper_ip>:2181/mesos",
"refershSeconds": 10,
"ttl": 10,
"domain": "mesos",
"port": 53,
"resolvers": ["<self_ip>"],
"timeout": 5,
"dnson": true,
"httpon": true,
"httpport": 8123,
"email": "root.mesos-dns.mesos",
"IPSources": ["host", "docker", "mesos", "netinfo"]
}
EOF
注: self_ip是本机的IP
IPSources: 从左至右优先级从高到低
host: Mesos agent主机的IP
mesos: Mesos 运行容器的IP, (deprecated)
docker: docker 容器的IP, (deprecated)
创建一个mesos-dns.json用来在Marathon上创建app
cat > /usr/local/mesos-dns/mesos-dns.json <<EOF
{
"cmd": "sudo /usr/local/mesos-dns -config=/usr/local/mesos-dns/config.json",
"cpus": 1,
"mem": 512,
"id": "mesos-dns",
"instances": 1,
"constraints": [{"hostname", "CLUSTER", "<mesos-agent-hostname>"}]
}
EOF
注:
mesos-agent-hostname是这个mesos-agent主机的主机名。 也就是/etc/hostname里记录的名称。
启动mesos-dns:
curl -X POST -H "Content-Type: application/json" http://<marathon-ip>:8080/v2/apps -d@mesos-dns.json
在每台mesos agent主机上设置mesos-dns主机为Primary DNS server.
vi /etc/resolv.conf
<mesos-dns-ip>
把mesos-dns主机的IP添加到每个mesos agent节点的/etc/resolv.conf中。
这样就在mesos集群中建立了服务发现的组件。在集群中任意一台主机或容器都可以实现服务发现功能。通过访问服务名称就可以获得IP,port等信息。
可以在Marathon上运行一个nginx容器,然后再执行下面的命令可以查询到这个nginx容器对应的主机IP和Port。
curl http://mesos-dns.marathon.mesos/8123/v1/services/_nginx._tcp.marathon.mesos