python consul_Consul 使用手册

本文档详细介绍了如何使用Python与Consul进行交互,包括Consul的基础架构、服务发现、健康检查、Key/Value存储、多数据中心支持等功能。此外,还涵盖了安装、验证安装、运行Agent(Server和Client模式)以及相关命令的使用,如加入集群、查看成员等。
摘要由CSDN通过智能技术生成

使用consul

介绍

Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:

服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.

健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.

Key/Value存储 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.

多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.

Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施.

基础架构

Consul是一个分布式高可用的系统. 这节将包含一些基础,我们忽略掉一些细节这样你可以快速了解Consul是如何工作的.如果要了解更多细节,请参考深入的架构描述.

每个提供服务给Consul的阶段都运行了一个Consul agent . 发现服务或者设置和获取 key/value存储的数据不是必须运行agent.这个agent是负责对节点自身和节点上的服务进行健康检查的.

Agent与一个和多个Consul Server 进行交互.Consul Server 用于存放和复制数据.server自行选举一个领袖.虽然Consul可以运行在一台server , 但是建议使用3到5台来避免失败情况下数据的丢失.每个数据中心建议配置一个server集群.

你基础设施中需要发现其他服务的组件可以查询任何一个Consul 的server或者 agent.Agent会自动转发请求到server .

每个数据中运行了一个Consul server集群.当一个跨数据中心的服务发现和配置请求创建时.本地Consul Server转发请求到远程的数据中心并返回结果.

更多介绍查看官网点击前往

安装Consul

安装Consul,找到适合你系统的包下载他.Consul打包为一个’Zip’文件.前往下载

下载后解开压缩包.拷贝Consul到你的PATH路径中,在Unix系统中~/bin和/usr/local/bin是通常的安装目录.根据你是想为单个用户安装还是给整个系统安装来选择.在Windows系统中有可以安装到%PATH%的路径中.

验证安装

完成安装后,通过打开一个新终端窗口检查consul安装是否成功.通过执行 consul你应该看到类似下面的输出

[root@dhcp-10-201-102-248 ~]# consul

usage: consul [--version] [--help] []

Available commands are:

agent Runs a Consul agent

configtest Validate config file

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

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

version Prints the Consul version

watch Watch for changes in Consul

如果你得到一个consul not be found的错误,你的PATH可能没有正确设置.请返回检查你的consul的安装路径是否包含在PATH中.

运行Agent

完成Consul的安装后,必须运行agent. agent可以运行为server或client模式.每个数据中心至少必须拥有一台server . 建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失.

其他的agent运行为client模式.一个client是一个非常轻量级的进程.用于注册服务,运行健康检查和转发对server的查询.agent必须在集群中的每个主机上运行.

查看启动数据中心的细节请查看这里.

启动 Consul Serverconsul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

运行cosnul agent以server模式,

-server : 定义agent运行在server模式

-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用

-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0

-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

-ui-dir: 提供存放web ui资源的路径,该目录必须是可读的

-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。

-config-dir::配置文件目录,里面所有以.json结尾的文件都会被加载

-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0

[root@dhcp-10-201-102-198 consul]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

==> WARNING: Expect Mode enabled, expecting 3 servers

==> Starting Consul agent...

==> Starting Consul agent RPC...

==> Consul agent running!

Version: 'v0.7.4'

Node ID: '422ec677-74ef-8f29-2f22-01effeed6334'

Node name: 's1'

Datacenter: 'dc1'

Server: true (bootstrap: false)

Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)

Cluster Addr: 10.201.102.198 (LAN: 8301, WAN: 8302)

Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false

Atlas:

==> Log data will now stream in as it occurs:

2017/03/17 18:03:08 [INFO] raft: Restored from snapshot 139-352267-1489707086023

2017/03/17 18:03:08 [INFO] raft: Initial configuration (index=6982): [{Suffrage:Voter ID:10.201.102.199:8300 Address:10.201.102.199:8300} {Suffrage:Voter ID:10.201.102.200:8300 Address:10.201.102.200:8300} {Suffrage:Voter ID:10.201.102.198:8300 Address:10.201.102.198:8300}]

2017/03/17 18:03:08 [INFO] raft: Node at 10.201.102.198:8300 [Follower] entering Follower state (Leader: "")

2017/03/17 18:03:08 [INFO] serf: EventMemberJoin: s1 10.201.102.198

2017/03/17 18:03:08 [INFO] serf: Attempting re-join to previously known node: s2: 10.201.102.199:8301

2017/03/17 18:03:08 [INFO] consul: Adding LAN server s1 (Addr: tcp/10.201.102.198:8300) (DC: dc1)

2017/03/17 18:03:08 [INFO] consul: Raft data found, disabling bootstrap mode

2017/03/17 18:03:08 [INFO] serf: EventMemberJoin: s2 10.201.102.199

2017/03/17 18:03:08 [INFO] serf: EventMemberJoin: s3 10.201.102.200

2017/03/17 18:03:08 [INFO] serf: Re-joined to previously known node: s2: 10.201.102.199:8301

2017/03/17 18:03:08 [INFO] consul: Adding LAN server s2 (Addr: tcp/10.201.102.199:8300) (DC: dc1)

2017/03/17 18:03:08 [INFO] consul: Adding LAN server s3 (Addr: tcp/10.201.102.200:8300) (DC: dc1)

2017/03/17 18:03:08 [INFO] serf: EventMemberJoin: s1.dc1 10.201.102.198

2017/03/17 18:03:08 [INFO] consul: Adding WAN server s1.dc1 (Addr: tcp/10.201.102.198:8300) (DC: dc1)

2017/03/17 18:03:08 [WARN] serf: Failed to re-join any previously known node

2017/03/17 18:03:14 [INFO] agent: Synced service 'consul'

2017/03/17 18:03:14 [INFO] agent: Deregistered service 'consul01'

2017/03/17 18:03:14 [INFO] agent: Deregistered service 'consul02'

2017/03/17 18:03:14 [INFO] agent: Deregistered service 'consul03'查看集群成员

新开一个终端窗口运行consul members, 你可以看到Consul集群的成员.

[root@dhcp-10-201-102-198 ~]# consul members

Node Address Status Type Build Protocol DC

s1 10.201.102.198:8301 alive server 0.7.4 2 dc1

s2 10.201.102.199:8301 alive server 0.7.4 2 dc1

s3 10.201.102.200:8301 alive server 0.7.4 2 dc1

启动 Consul Clientconsul agent -data-dir /tmp/consul -node=c1 -bind=10.201.102.248 -config-dir=/etc/consul.d/ -join 10.201.102.198

运行cosnul agent以client模式,-join 加入到已有的集群中去。

[root@dhcp-10-201-102-248 ~]# consul agent -data-dir /tmp/consul -node=c1 -bind=10.201.102.248 -config-dir=/etc/consul.d/ -join 10.201.102.198

==> Starting Consul agent...

==> Starting Consul agent RPC...

==> Joining cluster...

Join completed. Synced with 1 initial agents

==> Consul agent running!

Version: 'v0.7.4'

Node ID: '564dc0c7-7f4f-7402-a301-cebe7f024294'

Node name: 'c1'

Datacenter: 'dc1'

Server: false (bootstrap: false)

Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)

Cluster Addr: 10.201.102.248 (LAN: 8301, WAN: 8302)

Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false

Atlas:

==> Log data will now stream in as it occurs:

2017/03/17 15:35:16 [INFO] serf: EventMemberJoin: c1 10.201.102.248

2017/03/17 15:35:16 [INFO] agent: (LAN) joining: [10.201.102.198]

2017/03/17 15:35:16 [INFO] serf: EventMemberJoin: s2 10.201.102.199

2017/03/17 15:35:16 [INFO] serf: EventMemberJoin: s3 10.201.102.200

2017/03/17 15:35:16 [INFO] serf: EventMemberJoin: s1 10.201.102.198

2017/03/17 15:35:16 [INFO] agent: (LAN) joined: 1 Err:

2017/03/17 15:35:16 [INFO] consul: adding server s2 (Addr: tcp/10.201.102.199:8300) (DC: dc1)

2017/03/17 15:35:16 [INFO] consul: adding server s3 (Addr: tcp/10.201.102.200:8300) (DC: dc1)

2017/03/17 15:35:16 [INFO] consul: adding server s1 (Addr: tcp/10.201.102.198:8300) (DC: dc1)

2017/03/17 15:35:16 [INFO] agent: Synced node info查看集群成员

新开一个终端窗口运行consul members, 你可以看到Consul集群的成员.

[root@dhcp-10-201-102-248 ~]# consul members

Node Address Status Type Build Protocol DC

c1 10.201.102.248:8301 alive client 0.7.4 2 dc1

s1 10.201.102.198:8301 alive server 0.7.4 2 dc1

s2 10.201.102.199:8301 alive server 0.7.4 2 dc1

s3 10.201.102.200:8301 alive server 0.7.4 2 dc1加入集群

[root@dhcp-10-201-102-248 ~]# consul join 10.201.102.198

Node Address Status Type Build Protocol DC

c1 10.201.102.248:8301 alive client 0.7.4 2 dc1

s1 10.201.102.198:8301 alive server 0.7.4 2 dc1

s2 10.201.102.199:8301 alive server 0.7.4 2 dc1

s3 10.201.102.200:8301 alive server 0.7.4 2 dc1

停止Agent

你可以使用Ctrl-C 优雅的关闭Agent. 中断Agent之后你可以看到他离开了集群并关闭.

在退出中,Consul提醒其他集群成员,这个节点离开了.如果你强行杀掉进程.集群的其他成员应该能检测到这个节点失效了.当一个成员离开,他的服务和检测也会从目录中移除.当一个成员失效了,他的健康状况被简单的标记为危险,但是不会从目录中移除.Consul会自动尝试对失效的节点进行重连.允许他从某些网络条件下恢复过来.离开的节点则不会再继续联系.

此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免引起潜在的可用性故障影响达成一致性协议.

查看这里了解添加和移除server.

更新服务

服务定义可以通过配置文件并发送SIGHUP给agent来进行更新.这样你可以让你在不关闭服务或者保持服务请求可用的情况下进行更新.

consul reload

另外 HTTP API可以用来动态的添加,移除和修改服务.

注册服务

搭建好conusl集群后,用户或者程序就能到consul中去查询或者注册服务。可以通过提供服务定义文件或者调用HTTP API来注册一个服务.

首先,为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件.在Unix系统中通常类似 /etc/consul.d (.d 后缀意思是这个路径包含了一组配置文件).

mkdir /etc/consul.d

然后,我们将编写服务定义配置文件.假设我们有一个名叫web的服务运行在 80端口.另外,我们将给他设置一个标签.这样我们可以使用他作为额外的查询方式:

echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' >/etc/consul.d/web.json

现在重启agent , 设置配置目录:

$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

...

[INFO] agent: Synced service 'web'

...-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在

你可能注意到了输出了 “synced” 了 web这个服务.意思是这个agent从配置文件中载入了服务定义,并且成功注册到服务目录.

如果你想注册多个服务,你应该在Consul配置目录创建多个服务定义文件.

HTTP API注册服务,curl命令或者postman 以PUT方式请求consul HTTP API更多细节点击查看

curl -X PUT -d '{"Datacenter": "dc1", "Node": "c2", "Address": "10.155.0.106", "Service": {"Service": "MAC", "tags": ["lianglian", "Mac"], "Port": 22}}' http://127.0.0.1:8500/v1/catalog/register

查询服务

一旦agent启动并且服务同步了.我们可以通过DNS或者HTTP的API来查询服务.

DNS API

让我们首先使用DNS API来查询.在DNS API中,服务的DNS名字是 NAME.service.consul. 虽然是可配置的,但默认的所有DNS名字会都在consul命名空间下.这个子域告诉Consul,我们在查询服务,NAME则是服务的名称.

对于我们上面注册的Web服务.它的域名是 web.service.consul :

[root@dhcp-10-201-102-198 ~]# dig @127.0.0.1 -p 8600 web.service.consul

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> @127.0.0.1 -p 8600 web.service.consul

; (1 server found)

;; global options: +cmd

;; Got answer:

;; ->>HEADER<

;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; WARNING: recursion requested but not available

;; QUESTION SECTION:

;web.service.consul. IN A

;; ANSWER SECTION:

web.service.consul. 0 IN A 10.201.102.198

;; Query time: 0 msec

;; SERVER: 127.0.0.1#8600(127.0.0.1)

;; WHEN: Tue Mar 28 16:10:24 2017

;; MSG SIZE rcvd: 52

[root@dhcp-10-201-102-198 ~]#

如你所见,一个A记录返回了一个可用的服务所在的节点的IP地址.A`记录只能设置为IP地址. 有也可用使用 DNS API 来接收包含 地址和端口的 SRV记录:

[root@dhcp-10-201-102-198 ~]# dig @127.0.0.1 -p 8600 web.service.consul SRV

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> @127.0.0.1 -p 8600 web.service.consul SRV

; (1 server found)

;; global options: +cmd

;; Got answer:

;; ->>HEADER<

;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; WARNING: recursion requested but not available

;; QUESTION SECTION:

;web.service.consul. IN SRV

;; ANSWER SECTION:

web.service.consul. 0 IN SRV 1 1 80 s1.node.dc1.consul.

;; ADDITIONAL SECTION:

s1.node.dc1.consul. 0 IN A 10.201.102.198

;; Query time: 0 msec

;; SERVER: 127.0.0.1#8600(127.0.0.1)

;; WHEN: Tue Mar 28 16:10:56 2017

;; MSG SIZE rcvd: 84

[root@dhcp-10-201-102-198 ~]#

SRV记录告诉我们 web 这个服务运行于节点dhcp-10-201-102-198 的80端口. DNS额外返回了节点的A记录.

最后,我们也可以用 DNS API 通过标签来过滤服务.基于标签的服务查询格式为TAG.NAME.service.consul. 在下面的例子中,我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值