Consul Quick Start
[toc]
Consul介绍
使服务发现和配置变得简单(1.2版本后换了口号:网格服务变的更简单,Service Mesh Made Easy)。
consul
Consul是什么
Consul本身是由多个组件组成的,但我们可以把它看作一个整体。它是在你基础架构中负责服务发现和配置服务的工具,我们可以直接将其应用于基础设施中。Consul本身是使用go语言开发的,但提供了RESTful HTTP API(https://www.consul.io/api/index.html)和其它语言的SDK(https://www.consul.io/api/libraries-and-sdks.html ,包括Java、Python、Go、C#等)。
Consul特性
- 服务发现(Service Discovery):你可以将自己的服务(比如集群服务节点master-salve、mysql、api等)注册到Consul中,Consul客户端能够对外提供你所注册服务,通过使用DNS或HTTP能够很容易的获取你所注册的服务。
- 健康检查(Health Checking):Consul能够提供节点级别(自身节点)和服务级别的健康检查(health check),比如consul节点内存使用率超过90%、你所注册的webService服务状态码为200。这些信息可用来监控集群运行状况,也可以用来由服务发现组件将流量从不健康的服务中引走。
- KV存储(KV Store):Consul提供了强一致性的KV存储,你可以利用这个特性来完成许多服务,比如动态配置(dynamic configuration)、功能标记(feature flagging)、服务协调(coordination)、leader选举( leader election)等。
- 多数据中心(Multi Datacenter):Consul提供了多数据中心功能,你不需要担心为多数据中心在去构建多层的抽象,开箱即用。
Consul的设计对于DevOps社区和应用开发任务非常友善,consul的目标是成为现代弹性基础设施的完美选择。
Consul基础简介
Consul是一个分布式、高可用的系统。Consul集群中的每个节点都需要启动一个agent,这个agent不需要负责任务发现、getting/setting KV数据,这个agent只负责注册在该节点的服务和节点自身的health check(健康检查)。
agent运行模式有client和server模式,client模式是一个非常轻量级的进程,负责注册服务、健康检查、转发查询请求给server;server负责数据存储和备份,接收client的查询请求。每个数据中心都至少有一个server,官方建议三到五个server,以防止节点服务挂掉后导致数据丢失,server也会选举一个leader。
consul cluster
Consul部署
consul安装
Consul提供了所有平台的二进制安装包(https://www.consul.io/downloads.html,最新版本1.2.2),Consul的安装包为.zip结尾的压缩包,压缩包内只需要运行名为consul的二进制文件,其它文件都可以删除。解压缩后,设置consul的PATH路径。
输入consul,检验Consul是否安装成功:
#输入consul命令
consul
Usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
catalog Interact with the catalog
connect Interact with Consul Connect
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators.
intention Interact with Connect service intentions
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
kv Interact with the key-value store
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
operator Provides cluster-level tools for Consul operators
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
snapshot Saves, restores and inspects snapshots of Consul server state
validate Validate config files/directories
version Prints the Consul version
watch Watch for changes in Consul
启动agent服务
consul安装完成后,需要在集群中的每个节点运行一个代理(agent),agent可以为client模式或者server模式。
开发环境
使用./consul agent [options]来启动agent节点,consul提供了开发者模式./consul agent dev,该模式只适合做一些学习和测试,不适用于生产环境,因为他不会持久化任何状态。
./consul agent -dev
==> Starting Consul agent...
==> Consul agent running!
Version: 'v1.2.2'
Node ID: '00dace45-df79-06cf-c9a3-2a89c50d3454'
Node name: 'yangjianzhangdeMacBook-Pro.local'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
2018/08/08 21:18:59 [DEBUG] agent: Using random ID "00dace45-df79-06cf-c9a3-2a89c50d3454" as node ID
2018/08/08 21:18:59 [WARN] agent: Node name "yangjianzhangdeMacBook-Pro.local" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
2018/08/08 21:18:59 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:00dace45-df79-06cf-c9a3-2a89c50d3454 Address:127.0.0.1:8300}]
2018/08/08 21:18:59 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
2018/08/08 21:18:59 [INFO] serf: EventMemberJoin: yangjianzhangdeMacBook-Pro.local.dc1 127.0.0.1
2018/08/08 21:18:59 [INFO] serf: EventMemberJoin: yangjianzhangdeMacBook-Pro.local 127.0.0.1
2018/08/08 21:18:59 [INFO] consul: Adding LAN server yangjianzhangdeMacBook-Pro.local (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2018/08/08 21:18:59 [INFO] consul: Handled member-join event for server "yangjianzhangdeMacBook-Pro.local.dc1" in area "wan"
2018/08/08 21:18:59 [DEBUG] agent/proxy: managed Connect proxy manager started
2018/08/08 21:18:59 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
2018/08/08 21:18:59 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
2018/08/08 21:18:59 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp)
2018/08/08 21:18:59 [INFO] agent: started state syncer
2018/08/08 21:19:00 [WARN] raft: Heartbeat timeout from "" reached, starting election
2018/08/08 21:19:00 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
2018/08/08 21:19:00 [DEBUG] raft: Votes needed: 1
2018/08/08 21:19:00 [DEBUG] raft: Vote granted from 00dace45-df79-06cf-c9a3-2a89c50d3454 in term 2. Tally: 1
2018/08/08 21:19:00 [INFO] raft: Election won. Tally: 1
2018/08/08 21:19:00 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
2018/08/08 21:19:00 [INFO] consul: cluster leadership acquired
2018/08/08 21:19:00 [INFO] consul: New leader elected: yangjianzhangdeMacBook-Pro.local
2018/08/08 21:19:00 [INFO] connect: initialized CA with provider "consul"
2018/08/08 21:19:00 [DEBUG] consul: Skipping self join check for "yangjianzhangdeMacBook-Pro.local" since the cluster is too small
2018/08/08 21:19:00 [INFO] consul: member 'yangjianzhangdeMacBook-Pro.local' joined, marking health alive
2018/08/08 21:19:00 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
2018/08/08 21:19:00 [INFO] agent: Synced node info
2018/08/08 21:19:02 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
2018/08/08 21:19:02 [DEBUG] agent: Node info in sync
通过日志信息可以看到,该节点以server模式运行,并且该节点被选为leader。注意节点名称使用的是你主机名称,如果你的主机名称包含periods(句号),对于该节点的DNS查询将不能使用Consul。
集群生产环境
生成环境下我们可以指定三到五个server点,其他节点都为client模式节点。当我们启动一个agent后,是一个独立的集群,它并不知道集群中的其它成员。如果启动一个agent后想要加入集群,需要将该节点主动join到集群中。节点join到一个集群需要知道集群中任意一个成员member(无论client还是server),当加入后该agent通过gossip协议会自动广播通知集群中的其它成员。
启动server节点
启动参数
参数 | 说明 |
---|---|
-node | consul集群的每个节点都需要有一个唯一name,你可以通过-node来指定节点名称,默认为机器的主机名称(hostname) |
-bind-address | 我们也需要指定一个绑定地址,这个地址(本机地址)是consul用来监听的(确保consul集群节点状态),需要注意这个地址能够访问集群中的所有节点(用来通信)。默认你可以不指定,不指定的话Consul会尝试监听所有ipv4地址,但是如果发现多个私有IP,则启动直接失败。 |
-bootstrap-expect | 我们期望Consul启动的server节点数,只有当server个数满足后期望个数后,才会启动。 |
-enable-script-checks | 是否允许使用外部脚本作为健康检查。对于生成环境,应该结合ACL一起使用,以便控制注册脚本的权限。 |
-config-dir | 指定consul配置文件目录,该目录的所有文件会以字母序列顺序读取。可以在里面配置服务和健康检查。 |
-data-dir | 指定server数据存储目录。 |
启动命令:
./consul agent -server -bootstrap-expect=2 -node=consul-node01 -bind-address=192.168.0.1 -enable-script-checks=true -data-dir=/home/yangjianzhang/server/consul/data -config-dir=/home/yangjianzhang/server/consul/consul.d
启动client
client启动不用指定-client,因为除了server其它节点都是client。配置和server一样,只需修改节点名称和绑定地址。
./consul agent -node=consul-node01 -bind-address=192.168.0.3 -enable-script-checks=true -config-dir=/home/yangjianzhang/server/consul/consul.d -data-dir=/home/yangjianzhang/server/consul/data
添加集群节点
节点启动后并不能自动识别集群中其他节点,需要手动join:
./consul join 192.168.0.1
查看集群成员
你需要重新启动一个终端来查看集群成员,目前集群成员只有自身。
./consul members
Node Address Status Type Build Protocol DC Segment
yangjianzhangdeMacBook-Pro.local 127.0.0.1:8301 alive server 1.2.2 2 dc1 <all>
显示了我们的节点名称、地址、状态、在集群中的类型、所属数据中心和一些其它版本信息。更多详细信息使用–detailed信息。
注意:由于members命令基于 gossip protocol ,它是最终一致性的。也就说你使用memebers看到的可能与当前集群状态不是一样的,如果想要强一致性,可以使用HTTP API 来向consul server发起查询请求。
停止agent
你可以使用control+c来优雅的停止agent,你能够从日志看到节点离开信息,consul会通知集群其它成员节点该节点已经离开,这时候关于该节点的catalog不会移除。如果使用kill process,其它成员节点检测到该节点失败,节点的catalog不会被移除,consul将自动尝试重新连接该节点。
UI
consul提供了ui界面用于显示consul中的所有服务、节点、健康检查、kv存储等信息。通过-ui参数来启动ui服务,默认端口为8500。
consul ui