概述
consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
client
CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
server
SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
server-leader
中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
raft
server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。
服务发现协议
consul采用http和dns协议,etcd只支持http
服务注册
consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。服务发现
consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。
服务间的通信协议
Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossippool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个
安装consul-server集群
下载镜像
docker pull docker.io/consul:latest
创建consul配置:
vim /opt/platform/consul/config/server.json
{ "datacenter": "xxx-consul", "data_dir": "/consul/data", "server": true, "ui": true, "bind_addr": "172.29.150.25", "client_addr": "0.0.0.0", "bootstrap_expect": 3, "retry_join": ["172.29.150.25","172.29.150.26","172.29.150.27"], "retry_interval": "10s", "rejoin_after_leave": true, "skip_leave_on_interrupt": true }
配置说明:
1. datacenter:数据中心名称(库名)
2. data_dir:数据存储目录
3. server:运行在server模式
4. ui:使用UI界面
5. bind_addr:内部集群通信绑定的地址。默认是宿主机ip,如果有多块网卡,需要指定,
否则启动报错
6. client_addr:客户端接口绑定的地址,默认是‘0.0.0.0’;
7. bootstrap_expect:集群预期的server个数,这里我们有3台server,设置为3;不能和bootstrap参数一同使用。这里需要说明下:bootstrap_expect指定的个数代表了server加入到集群之后,集群中的机器必须=>3的情况才开始选举server-leader,而如果配置bootstrap的节点,则启动的时候默认自己为leader。
8. retry_join:重新加入集群
9. retry_interval:重试时间
10. rejoin_after_leave:在离开集群之后才重试加入
11. skip_leave_on_interrupt :在启动后,是否ctrl+C优雅退出,我们是容器模式,所以不用管,直接true就好了。
额外配置说明(可有可无)
1. start_join:这个参数是在启动的时候选择加入到哪个集群,但是官方推荐retry_join取代他,因为效果更好。
2. enable_syslog:启用则consul的日志会写进系统的syslog里,但是如果是在windows上配置改参数就会报错。
3. enable_script_checks:是否启用监控检测脚本,这里没有对consul集群做监控,略。
默认端口说明
1. 8300:consul agent服务relplaction、rpc(client-server)
2. 8301:lan gossip
3. 8302:wan gossip
4. 8500:http api及UI端口
5. 8600:DNS服务端口
启动consul-server
docker run -d --net=host --name consul -v /opt/platform/consul/config:/consul/config -v /opt/platform/consul/data:/consul/data consul agent
web访问
浏览器访问http://172.16.150.25:8500/ui
只要是server端开启了UI,任何一个server都能访问web界面
安装consul-client
创建calico配置文件:
mkdir -p /opt/platform/consul/config/ /opt/platform/consul/data vim /opt/platform/consul/config/client.json { "datacenter": "xxx-test-consul", "data_dir": "/consul/data", "server": false, "ui": false, "bind_addr": "172.16.5.45", "client_addr": "0.0.0.0", "bootstrap_expect": 0, "retry_join": ["172.16.150.25","172.16.150.26","172.16.150.27"], "retry_interval": "10s", "rejoin_after_leave": true, "skip_leave_on_interrupt": true }
这里client不需要开启UI及server,所以均为false,以及bootstrap_expect设为0不参与leader节点竞争。
启动consul-client
docker run -d --net=host --name consul -v /opt/platform/consul/config:/consul/config -v /opt/platform/consul/data:/consul/data consul agent
查看节点身份
docker exec consul consul info
问题解决:
通过浏览器访问http://172.29.150.202:8500/ui 发现某个node下已经删除的容器IP还存在,需要找到对应的node删除/opt/platform/consul/data下所有数据, 重启consul-client