利用consul可以在mesos集群中实现服务发现的方案。mesos是一个资源管理系统,可以部署应用,但是没有提供一个注册服务并提供服务发现的方案,所以本文利用consul实现mesos集群的服务发现实现。
Consul在mesos集群中充当的是一个primary DNS,给mesos集群的每个主机和上面运行的容器充当DNS server。
Consul有两种模式,server模式和client模式。可以在所有的mesos master 节点安装Consul的server模式(当然也可以不用安装在master节点,可以单独安装),但是必须在mesos agent 节点安装Consul的client模式,因为所有的应用容器都是运行在mesos agent节点上,为了让容器都能以Consul作为DNS server,所以必须在mesos agent节点上安装consul的client模式。
下载consul,https://www.consul.io/downloads.html
下载了consul_0.9.3_linux_amd64.zip, unzip到/usr/bin/consul
配置consul
在每个consul节点上配置:
$ mkdir -p /etc/consul.d/bootstrap
$ mkdir -p /etc/consul.d/server
$ mkdir -p /etc/consul.d/client
在其中一个mesos master节点上配置bootstrap配置,该节点就是consul集群中的bootstrap节点。
$ cat > /etc/consul.d/bootstrap/config.json <<EOF
{
"bootstrap": true,
"server": true,
"datacenter": "dc",
"data_dir": "/var/consul",
"log_level": "INFO",
"enable_syslog": true,
"disable_update_check": true,
"ui": true
}
EOF
在其他的mesos master 节点上配置server配置,这些节点就是consul集群中的server节点。
$ cat > /etc/consul.d/server/config.json <<EOF
{
"bootstrap": false,
"server": true,
"datacenter": "dc",
"data_dir": "/var/consul",
"log_level": "INFO",
"enable_syslog": true,
"disable_update_check": true,
"start_join": ["" , "" ],
"ui": true
}
EOF
注意: start_join: 记录了其他consul server节点的IP。
在所有的mesos agent 节点上配置client配置,这些节点也就是consul集群中的client节点
$ cat > /etc/consul.d/client/config.json <<EOF
{
"server": false,
"datacenter": "dc",
"data_dir": "/var/consul",
"log_level": "INFO",
"enable_syslog": true,
"disable_update_check": true,
"start_join": ["" , "" , "" ],
"ui": true
}
EOF
注意:start_join: 记录了所有的consul server的IP。
启动Consul集群
在consul bootstrap节点启动:
$ consul agent -config-dir /etc/consul.d/bootstrap/ -bind=<self_ip> -client=0.0.0.0 >> /var/log/consul.log 2>&1 &
在所有consul server节点启动:
$ consul agent -config-dir /etc/consul.d/server/ -bind=<self_ip> -client=0.0.0.0 >> /var/log/consul.log 2>&1 &
在所有consul client节点启动:
$ consul agent -config-dir /etc/consul.d/client/ -bind=<self_ip> -client=0.0.0.0 >> /var/log/consul.log 2>&1 &
注意: self_ip是本机的IP。
检查consul集群状态:
在consul集群中任意一个节点执行
$ consul members
在每个consul节点上安装Dnsmasq
Dnsmasq是一个轻量级的DNS forwarder. 集群中的所有节点的dns query都会通过Dnsmasq转发到dns server, 也就是Consul集群。
$ apt-get install dnsmasq
$ echo "server=/consul/127.0.0.1#8600" | sudo tee /etc/dnsmasq.d/10-consul
$ sudo /etc/init.d/dnsmasq restart
Zookeeper中记录了mesos master的信息,将zookeeper注册到consul,也就把mesos的信息也注册到consul中了。
注册zookeeper
$ cat >> /etc/consul.d/bootstrap/zookeeper.json <<EOF
{
"service": {
"name": "zookeeper",
"tags": ["zookeeper"],
"port": "2181"
}
}
EOF
注册marathon
$ cat >> /etc/consul.d/bootstrap/marathon.json <<EOF
{
"service": {
"name": "marathon",
"tags": ["marathon"],
"port": "8080",
"check": {
"script": "curl http://:8080 > /dev/null 2>&1" ,
"interval": "10s"
}
}
}
EOF
测试consul服务发现是否正常, 在任意一个consul节点上执行下面命令应该返回对应服务的详细信息,包括IP,Port:
$ nslookup consul.service.consul
$ nslookup marathon.service.consul
$ nslookup zookeeper.service.consul
在每个mesos agent节点上配置docker
$ vim /etc/docker/daemon.json
{
"dns": ["self_ip"],
"dns-search": ["service.consul"]
}
$ systemctl daemon-reload
$ systemctl restart docker.service
这样每个容器都可以找到consul,解决了容器的服务发现功能。
如何让Marathon运行的容器自动的注册并发现在consul上?Mesos-consul就是一个连接mesos和consul的实现容器服务发现的组件。mesos-consul自动的将Marathon的应用注册到consul上。
下载mesos-consul: https://hub.docker.com/r/ciscocloud/mesos-consul/
$ docker pull ciscocloud/mesos-consul
创建mesos-consul.json可以通过Marathon运行一个应用的形式把mesos-consul跑起来。
$ vi mesos-consul.json
{
"id": "/mesos-consul",
"cmd": null,
"cpus": 1,
"mem": 256,
"disk": 0,
"instances": 1,
"container": {
"type": "DOCKER",
"volumes": [],
"docker": {
"image": "ciscocloud/mesos-consul",
"network": "BRIDGE",
"portMappings": {
{
"containerPort": 0,
"hostPort": 0,
"servicePort": 10001,
"labels" {}
}
],
"privileged": false,
"parameters": [],
"forcePullImage": false
}
},
"portDefinitions": [
{
"port": 10001,
"protocol": "tcp",
"labels": {}
}
],
"args": [
"--zk=zk://zookeeper.service.consul:2181/mesos",
"--log-level=debug",
"--refresh=5s",
"--mesos-ip-order=host"
]
}
$ curl -X POST -d@mesos-consul.json -H "Content-Type: application/json"
启动了mesos-consul应用之后,就可以查询到注册到consul中的服务了。
curl http://consul.service.consul:8500/v1/catalog/services
curl http://consul.service.consul:8500/v1/catalog/service/marathon
curl http://consul.service.consul:8500/v1/catalog/service/zookeeper
curl http://consul.service.consul:8500/v1/catalog/service/mesos-consul