假设你已经按照之前的Consul安装方法部署了一套具备环境,具体方法可以参考:http://xiaoquqi.github.io/blog/2015/12/07/consul-installation/
这篇文章里主要介绍Consul的使用场景,服务和健康检查。
Service
服务注册有点像OpenStack Keystone的Endpoints,可以通过API方式查询到所有服务的端点信息。
在Agent的节点上添加一个service,之后重启服务。
1
2
| $ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
>/etc/consul.d/web.json
|
重新加载新的服务并不需要杀死进程重启服务,只需要给进程直接发送一个SIGHUP。
1
| $ kill -HUP $(ps -ef | grep agent | grep -v grep | awk '{print $2}')
|
从输出的日志上都可以看到加载了新的服务web。
1
2
3
4
| ==> Caught signal: hangup
==> Reloading configuration...
==> WARNING: Expect Mode enabled, expecting 3 servers
2015/12/24 12:01:11 [INFO] agent: Synced service 'web'
|
我们在任意节点上利用REST API查看服务。
1
| $ curl http://localhost:8500/v1/catalog/service/web
|
1
| [{"Node":"server1.consul.com","Address":"200.21.1.101","ServiceID":"web","ServiceName":"web","ServiceTags":["rails"],"ServiceAddress":"","ServicePort":80}]
|
Health Check
健康检查的方法主要是通过运行一小段脚本的方式,根据运行的结果判断检查对象的健康状况。所以可以通过任意语言定义这个脚本,脚本运行将通过和consul执行的相同用户执行。
每30秒ping google.com
1
2
3
| $ echo '{"check": {"name": "ping",
"script": "ping -c1 google.com >/dev/null", "interval": "30s"}}' \
> /etc/consul.d/ping.json
|
为刚才的服务添加健康检查
1
2
3
| $ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
"check": {"script": "curl localhost >/dev/null 2>&1", "interval": "10s"}}}' \
> /etc/consul.d/web.json
|
1
| $ kill -HUP $(ps -ef | grep agent | grep -v grep | awk '{print $2}')
|
从输出的日志上都可以看到加载了新的服务web。
1
2
3
4
5
| ==> Caught signal: hangup
==> Reloading configuration...
==> WARNING: Expect Mode enabled, expecting 3 servers
2015/12/24 12:43:56 [INFO] agent: Synced service 'web'
2015/12/24 12:43:56 [INFO] agent: Synced check 'ping'
|
经过一段时间后出现了critical和warning日志
1
2
| 2015/12/24 12:43:58 [WARN] agent: Check 'service:web' is now critical
2015/12/24 12:44:08 [WARN] agent: Check 'ping' is now warning
|
Health check的状态包含了很多种,有any, unkown, passing, warning, critical。any包含了所有状态。
1
| $ curl http://localhost:8500/v1/health/state/critical
|
1
| [{"Node":"server1.consul.com","CheckID":"service:web","Name":"Service 'web' check","Status":"critical","Notes":"","Output":"","ServiceID":"web","ServiceName":"web"}]
|
参考文档