consul集群搭建以及ACL配置

因为时间匆忙,要是有什么地方没有写对的,请大佬指正,谢谢。文章有点水,大佬勿喷
这篇博客不回去深度的讲解consul中的一些知识,主要分享的我在使用的时候的一些操做和碰见的问题以及解决办法。固然有些东西官方文档上面也是有的html

学习一种工具最好的方式仍是去看官方文档,这是血与泪的经验教训。node

1.consul集群的搭建

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,再也不须要依赖其余工具(好比ZooKeeper等)。固然与consul相似的工具还有不少几个:ZooKeeper, etcdjson

这里在讲解以前,咱们须要知道的一些基本的东西,这里引用别人的文章
@clientbootstrap

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,全部注册到当前节点的服务会被转发到SERVER,自己是不持久化这些信息。服务器

@servercurl

SERVER表示consul的server模式,代表这个consul是个server,这种模式下,功能和CLIENT都同样,惟一不一样的是,它会把全部的信息持久化的本地,这样遇到故障,信息是能够被保留的。ide

@server-leader工具

中间那个SERVER下面有LEADER的字眼,代表这个SERVER是它们的老大,它和其它SERVER不同的一点是,它须要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。学习

@raftui

server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。

@服务发现协议

consul采用http和dns协议,etcd只支持http

@服务注册

consul支持两种方式实现服务注册,一种是经过consul的服务注册http API,由服务本身调用API实现注册,另外一种方式是经过json个是的配置文件实现注册,将须要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。

@服务发现

consul支持两种方式实现服务发现,一种是经过http API来查询有哪些服务,另一种是经过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式能够经过check的方式检查服务。

@服务间的通讯协议

Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通讯的,WAN pool是多个数据中心通讯的,LAN pool有多个,WAN pool只有一个。

简单来讲就是:client至关于咱们平时说的LB,负责将请求转发到Server,Server中有一个leader,负责Server集群的同步和监测,这个server-leader在不指定的状况下回随机推举出一个,固然也能够手动指定。这个在ACL配置的时候须要保证Server-leader是同一个。

2.集群搭建

首先咱们从https://releases.hashicorp.co...,这里咱们最好选择下载0.9.1或者更高的版本,由于他们能支持API操做。
咱们如今有3台服务器,内网IP是 192.168.0.3 192.168.0.4 192.168.0.6
个人计划是指定Server为:192.168.0.4 192.168.0.3
指定Clinet: 192.168.0.6

如今完成以后,将文件解压,会看获得一个可执行文件consul,
clipboard.png

移动到/user/local/bin下面(固然也能够不用,主要是为了方便操做嘛)。

咱们也能够经过配置配置文件实现consul的启动,[详情请看][4]

192.168.0.3: consul agent -server -bootstrap-expect=2 -data-dir=/data/consul -node=node0 -bind=192.168.0.3 -dc=dc1 -config-dir=/data/consul.d

192.168.0.4: consul agent -server -bootstrap-expect=2 -data-dir=/data/consul -node=node1 -bind=192.168.0.4 -dc=dc1 -config-dir=/data/consul.d

192.168.0.6: consul agent -data-dir=/data/consul -node=node3 -bind=192.168.0.6 -client=192.168.0.6 -dc=dc1 -ui -config-dir=/data/consul.d

consul必须启动agent才能使用,有两种启动模式server和client,还有一个官方自带的ui。server用与持久化服务信息,集群官方建议3或5个节点。client只用与于server交互。ui能够查看集群状况的。

这里解释一下这里个参数
-server 表示当前使用的server模式
-node:指定当前节点在集群中的名称
-config-dir:指定配置文件,定义服务的,默认全部一.json结尾的文件都会读
-datacenter: 数据中心没名称,不设置的话默认为dc
-client : 客户端模式
ui 使用consul自带的ui界面
-data-dir consul存储数据的目录

-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,能够本身选举为raft leader。
-bootstrap-expect:在一个datacenter中指望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用

这两个参数十分重要, 二选一,若是两个参数不使用的话,会出现就算你使用join将agent加入了集群仍然会报 2018/10/14 15:40:00 [ERR] agent: failed to sync remote state: No cluster leader

当输入以后,三台服务器上的consul启动,可是目前这还不是一个集群,而且你会看到consul会输出大量爆错

192.168.0.3:

clipboard.png

192.168.0.4:

clipboard.png

192.168.0.6:

clipboard.png

报错提示显而易见,3,4中的报错表示没有leader,6中没有server

虽然咱们开启的consul,可是咱们并无把这里个服务加入集群里面,,这个时候咱们使用-join参数,将启动的服务加入到集群之中

192.168.0.3:  consul join 192.168.0.4

192.168.0.3: consul join 192.168.0.6

clipboard.png

这时候在192.168.0.3:

clipboard.png

192.168.0.4:
clipboard.png

192.168.0.6:

clipboard.png

没有出现报错,并选出了leader node0也就是192.168.0.3所在的server

这里须要说明的是 -bootstrap-expect参数,当加入的server数量达到了-bootstrap-expect所设置的数量,才会发生选举,推选出leader

这个时候咱们的consul服务就已经搭建完成了,咱们UI访问client:192.168.0.6

clipboard.png

2.ACL的开启和配置

ACL的开启和配置仍是建议去看官网,不推荐直接去看别人的其余的博客,这是血与泪的教训,固然,在看完官网的以后,能够是看看这篇

这里为了简单起见,我使用一个server:192.168.0.3和一个client:192.168.0.6,配置方法请看上面,注意-bootstrap着快参数的配置

首先咱们须要知道几个概念,就是他的哪几个token

clipboard.png

简单来讲,就是
alc_master_token > acl_token, acl_master_token有最高权限。acl_token是默认的权限,用于当一些没有带token的请求想要请求consul获取数据的时候所给的权限
acl_agent_master_token > acl_agent_token 这个是用于Client域Server交互的时候一些令牌

首先咱们在server上配置的 config_dir所配置的文件夹下面添加 acl.json文件

{
      "acl_datacenter": "dc1", //须要acl配置的数据中心
      "acl_master_token": "b1gs3113cr3t",  //这个是随机生成的
      "acl_default_policy": "deny",  //默认策略全部的都禁止
      "acl_down_policy": "extend-cache"
     }
     
 从新启动server

这时候咱们会看到:

server上:

clipboard.png
client上:

clipboard.png

Ui界面:
clipboard.png
说明当前ACl配置以及成功了

咱们查当作员:

由于如今访问都须要使用token 因此请求应该是

clipboard.png

如今咱们来处理Cline和Server中的报错,经过配置acl_agent_master_token 随便在server或者Client其中一台机器上请求,
这里Name,Rules中你能够更具你的须要进行配置。

curl \
    --request PUT \
    --header "X-Consul-Token: b1gs3113cr3t" \
    --data \
'{
  "Name": "Agent Token",
  "Type": "client",
  "Rules": "node \"\" { policy = \"write\" } service \"\" { policy = \"read\" }"
}' http://127.0.0.1:8500/v1/acl/create

会生成一个Token

clipboard.png

将这个token手动配置到CLient和Server上(固然也可使用Api
Client:

{
"acl_agent_token": "4ac10325-551b-5465-05e0-e0a48a04971a",
  "acl_datacenter": "dc1",
  "acl_down_policy": "extend-cache"

}

Server:

{
          "acl_datacenter": "dc1",
          "acl_master_token": "b1gs3113cr3t",
          "acl_default_policy": "deny",
          "acl_down_policy": "extend-cache",
 "acl_agent_token": "4ac10325-551b-5465-05e0-e0a48a04971a"
 }

而后重启Server和Client,重启Client以后记得要从新吧Client加入到集群中哦。

要是有报错的话。。。。。。。。。重装系统能解决你百分之80的问题。

要是没有报错的话,好了到如今咱们的ACL已经配置成功了,并且咱们如今也有了一个Token,那就是 "acl_master_token": "b1gs3113cr3t",咱们把这个Token加入到UI的
clipboard.png

clipboard.png

完成。

接着咱们能够更具咱们的需求进行配置了,方法很简单,1是经过API,二是经过UI界面
clipboard.png

3.多台Server配置ACL

方式1:

每台新接入的Server配置.json配置文件
{
"acl_agent_token": "4ac10325-551b-5465-05e0-e0a48a04971a",
  "acl_datacenter": "dc1",
  "acl_down_policy": "extend-cache"

}

这种配置形式要求咱们必须每次选举都出来的Leader都是相同的,而且配置文件中带有acl_master_token的

方式2:

每台新接入的Server配置.json配置文件
{

          "acl_datacenter": "dc1",
          "acl_master_token": "b1gs3113cr3t",
          "acl_default_policy": "deny",
          "acl_down_policy": "extend-cache",
 "acl_agent_token": "4ac10325-551b-5465-05e0-e0a48a04971a"

}

这种形式就没必要考虑要定死每次选举出来的leader了

这个其实我不是很肯定那种必定正确,可是这两种配置方式都是OK的

相关文章
相关标签/搜索