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
login Login to Consul using an auth method
logout Destroy a Consul token created with login
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
services Interact with services
snapshot Saves, restores and inspects snapshots of Consul server state
tls Builtin helpers for creating CAs and certificates
validate Validate config files/directories
version Prints the Consul version
watch Watch for changes in Consul
## 4 启动
完成Consul的安装后,必须运行agent. agent可以运行为server或client模式.每个数据中心至少必须拥有一台server . 建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失.
其他的agent运行为client模式.一个client是一个非常轻量级的进程.用于注册服务,运行健康检查和转发对server的查询.agent必须在集群中的每个主机上运行.
[root@controller ~]# consul agent -dev -config-dir /etc/consul.d
==> Starting Consul agent…
Version: ‘1.11.4’
Node ID: ‘76590d82-0f5e-b8be-1248-ec541e4ab541’
Node name: ‘controller’
Datacenter: ‘dc1’ (Segment: ‘’)
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
。。。。(省略)
## 5 集群成员
**新开一个终端窗口**运行consul members, 你可以看到Consul集群的成员.
[root@controller ~]# consul members
Node Address Status Type Build Protocol DC Partition Segment
controller 127.0.0.1:8301 alive server 1.11.4 2 dc1 default
这个输出显示我们自己的节点.运行的地址,健康状态,自己在集群中的角色,版本信息.添加-detailed选项可以查看到额外的信息.
## 6 停止Agent
Ctrl-C
在退出中,Consul提醒其他集群成员,这个节点离开了.如果你强行杀掉进程.集群的其他成员应该能检测到这个节点失效了.当一个成员离开,他的服务和检测也会从目录中移除.当一个成员失效了,他的健康状况被简单的标记为危险,但是不会从目录中移除.Consul会自动尝试对失效的节点进行重连.允许他从某些网络条件下恢复过来.离开的节点则不会再继续联系.
## 7 注册服务
### 7.1 定义一个服务
可以通过提供服务定义或者调用HTTP API来注册一个服务.服务定义文件是注册服务的最通用的方式.
首先,为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件.centos 路径为 /etc/consul.d
然后,将编写服务定义配置文件.假设有一个名叫web的服务运行在 80端口.另外,我们将给他设置一个标签.这样我们可以使用他作为额外的查询方式:
echo ‘{“service”: {“name”: “web”, “tags”: [“rails”], “port”: 80}}’
>/etc/consul.d/web.json
重启agent , 设置配置目录:
consul agent -dev -config-dir /etc/consul.d
==> Starting Consul agent…
…
[INFO] agent: Synced service ‘web’
…
此时输出了 “synced” 了 web这个服务.意思是这个agent从配置文件中载入了服务定义,并且成功注册到服务目录.
### 7.2 查询服务
可以通过DNS或者HTTP的API来查询服务.
#### DNS API
在DNS API中,服务的DNS名字是 NAME.service.consul. 虽然是可配置的,但默认的所有DNS名字会都在consul命名空间下.这个子域告诉Consul,我们在查询服务,NAME则是服务的名称.
上面注册的Web服务.它的域名是 web.service.consul :
dig @127.0.0.1 -p 8600 web.service.consul
#### HTTP API
curl http://localhost:8500/v1/catalog/service/web
[{“Node”:“hdp2”,“Address”:“10.0.0.52”,“ServiceID”:“web”,“ServiceName”:“web”,“ServiceTags”:[“rails”],“ServiceAddress”:“”,“ServicePort”:80,“ServiceEnableTagOverride”:false,“CreateIndex”:4,“ModifyIndex”:254}]
### 7.3 更新服务
服务定义可以通过配置文件并发送SIGHUP给agent来进行更新.这样你可以让你在不关闭服务或者保持服务请求可用的情况下进行更新.
## 8 建立集群
当一个agent启动时,他开始不知道其他节点的信息,他是一个成员的孤立集群.为了了解其他集群成员这个agent必须加入一个已经存在的集群.要加入一个已经存在的集群,只需要知道一个已经存在的集群成员.通过与这个成员的沟通来发现其他成员,Consul agent可以加入任何agent而不只是出于server模式的agent.
启动了另外的2台主机, 192.168.143.192 和192.168.143.194,**先安装consul**
每个集群中的节点都必须要一个唯一的名字.Consul默认会使用机器的hostname.我们可以使用-node手动覆盖他.也可以使用-bind指定一个绑定的地址让Consul在这个地址上进行监听,这个地址必须可以被其他集群成员访问到.绑定地址不是必须提供,Consul选择第一个私有IP进行监听,不过最好还是指定一个.生产环境的服务器通常有多个网络接口.所以指定一个不会让Consul绑错网络接口.
第一个节点将扮演集群的唯一server,我们使用-server指定他.
最后,加入 config-dir选项,指定服务和健康检查定义文件存放的路径.
#### 创建server
#创建文件夹
mkdir -p /consul/{config,data}
#配置10.10.20.200节点
consul agent -server -bootstrap-expect=2 -data-dir=/consul/data -node=192.168.143.203 -bind=10.10.20.200 -enable-script-checks=true -config-dir=/consul/config -client 0.0.0.0 -ui &
[1] 20336
#配置10.10.20.194节点
consul agent -server -bootstrap-expect=2 -data-dir=/consul/data -node=192.168.143.194 -bind=10.10.20.194 -enable-script-checks=true -config-dir=/consul/config -client 0.0.0.0 -ui &
[1] 208893
参数解释:
-node:节点的名称
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址
-server:表示这个节点是个Server
-bootstrap-expect:表示期望提供的Server节点数目。数目一达到,它就会被激活,然后就是leader了
-data-dir:Agent用于存储状态的数据目录,这是所有Agent所必需的
-datacenter:指明数据中心的名字,默认是"dc1"。同一数据中心中的节点应位于单个LAN上
-client:将Client接口(包括HTTP和DNS服务器)绑定到的地址
-ui:启动UI
#### 创建client
consul agent -data-dir=/consul/data -node=192.168.143.192 -bind=10.10.20.192 -enable-script-checks=true -config-dir=/consul/config -client 0.0.0.0 -ui &
[1] 160873
报错:
1. [ERROR] agent.anti\_entropy: failed to sync remote state: error=“No cluster leader”
**未加入集群,就没有leader ,正常现象**
2. [ERROR] tain an address: Failed to start TCP listener on “10.10.20.192” port 8301: listen tcp 10.10.20.192:8301: bind: cannot assign requested address"
**-bind=10.10.20.192**这里要写**内网IP**
3. [ERROR] agent.anti\_entropy: failed to sync remote state: error=“No known Consul servers”
**client未加入集群,正常现象**
#### 加入集群
重开一个终端
除了203以外的节点:
[root@stone ~]# consul join 10.10.20.200
Successfully joined cluster by contacting 1 nodes.
正确输出:
2022-04-15T11:39:27.230+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: 192.168.143.194 10.10.20.194
2022-04-15T11:39:27.230+0800 [INFO] agent.server: Adding LAN server: server=“192.168.143.194 (Addr: tcp/10.10.20.194:8300) (DC: dc1)”
2022-04-15T11:39:27.230+0800 [INFO] agent.server: member joined, marking health alive: member=192.168.143.194 partition=default
2022-04-15T11:39:27.231+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: 192.168.143.194.dc1 10.10.20.194
2022-04-15T11:39:27.231+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=192.168.143.194.dc1 area=wan
2022-04-15T11:39:36.037+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: 192.168.143.192 10.10.20.192
2022-04-15T11:39:36.037+0800 [INFO] agent.server: member joined, marking health alive: member=192.168.143.192 partition=default
验证:
root@controller ~]# consul members
Node Address Status Type Build Protocol DC Partition Segment
192.168.143.194 10.10.20.194:8301 alive server 1.11.4 2 dc1 default
192.168.143.203 10.10.20.200:8301 alive server 1.11.4 2 dc1 default
192.168.143.192 10.10.20.192:8301 alive client 1.11.4 2 dc1 default
## 9 访问ui
![在这里插入图片描述](https://img-blog.csdnimg.cn/d77131325dfd4e48a306b75c09d736ae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LCi6LCi5aSn5a625oiR54ix5bCP6LCi,size_20,color_FFFFFF,t_70,g_se,x_16)
## 10 健康检查
### 10.1 定义检查
一个检查可以通过检查定义或HTTP API请求来注册.
使用和检查定义来注册检查.和服务类似,因为这是建立检查最常用的方式.
在194节点的配置目录建立两个定义文件:
echo ‘{“check”:{“name”:“ping”,“script”:“ping -c1 baidu.com >/dev/null”, “interval”:“30s”}}’ >/etc/consul.d/ping.json
echo ‘{“service”:{“name”:“web”, “tags”:[“rails”], “port”:80, “check”:{“script”:“curl localhost >/dev/null 2>&1”, “interval”:“10s”}}}’ >/etc/consul.d/web.json
第一个定义增加了一个主机级别的检查,名字为 “ping” . 这个检查每30秒执行一次,执行 ping -c1 163.com. 在基于脚本的健康检查中,脚本运行在与Consul进程一样的用户下.如果这个命令以非0值退出的话这个节点就会被标记为不健康.这是所有基于脚本的健康检查的约定.
第二个命令定义了名为web的服务,添加了一个检查.每十分钟通过curl发送一个请求,确定web服务器可以访问.和主机级别的检查一样.如果脚本以非0值退出则标记为不健康.
现在重启第二个agent或者发送SIGHUP信号
consul reload
![在这里插入图片描述](https://img-blog.csdnimg.cn/00983f11e7684d01a2ca62a30b5e9408.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LCi6LCi5aSn5a625oiR54ix5bCP6LCi,size_15,color_FFFFFF,t_70,g_se,x_16)