Consul Quick Start

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容