Consul 实现 Service Discovery 方案实践 (mesos集群)

Mesos集群中实现Consul服务发现方案

利用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集群

下载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

安装Dnsmasq

在每个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和Marathon到Consul

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

配置Docker让Consul作为所有Agent节点上容器的DNS Server

在每个mesos agent节点上配置docker

$ vim /etc/docker/daemon.json

{
    "dns": ["self_ip"],
    "dns-search": ["service.consul"]
}

$ systemctl daemon-reload
$ systemctl restart docker.service

这样每个容器都可以找到consul,解决了容器的服务发现功能。

在Marathon上运行Mesos-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

你可能感兴趣的:(mesos,marathon,zookeeper,consul,dnsmasq,Platform)