微服务注册中心Consul部署

目录

  • 部署节点
  • 部署设计
  • 依赖
  • 安装与运行
  • 维护

1. 部署节点

主机名  | 应用IP 
---|---|---
registry01-consul | 192.168.0.11 
registry02-consul | 192.168.0.12 
registry03-consul | 192.168.0.13 

2. 部署设计

2.1 高可用

Consul集群的访问链条如下:

application->local consul client->consul server

consul server采用三节点集群部署方式,角色为Leader, Follower, Follower。允许1个consul server出现故障。

在需要访问consul服务的服务器上安装consul client,应用访问访问位于本地服务器的consul client,即127.0.0.1。

consul client负责与consul server之间的通信。

2.2 各节点角色及部署软件列表

节点 IP 软件 角色
registry01-consul 192.168.0.11 consul_1.7.2 server
registry02-consul 192.168.0.12 consul_1.7.2 server
registry03-consul 192.168.0.13 consul_1.7.2 server

2.3 端口设计

用途 详细说明 默认端口
DNS服务 解析DNS请求 8600(tcp/udp)
HTTP API 响应HTTP接口请求 8500(tcp)
HTTPs API 默认关闭。响应HTTP接口请求 8501(tcp)
gRPC API 默认关闭。xDS API to Envoy proxies 8502(tcp)
LAN Serf 处理LAN gossip报文 8301(tcp/udp)
Wan Serf 处理WAN gossip报文 8302(tcp/udp)
RPC 响应来自其他agent的RPC请求 8300(tcp)
Sidecar 包含该值, sidecar proxy 自动分配的最小端口 21000(tcp)
Sidecar 包含该值, sidecar proxy 自动分配的最大端口 21255(tcp)

3 软件准备

3.1 consul

consul官网

https://www.consul.io/downloads

4. 优化系统参数

使用root用户

4.1 修改limit

在/etc/security/limits.d/目录下,新建102-consuluserres.conf资源限制配置文件,填入以下内容:

consuluser       soft    nproc     102400
consuluser       soft    nofile     1024000
consuluser       hard    nofile     1024000
consuluser soft memlock unlimited 
consuluser hard memlock unlimited 

最终效果:

[consuluser@registry01-consul software]$ cat /etc/security/limits.d/102-consuluserres.conf 
consuluser       soft    nproc     102400
consuluser       soft    nofile     1024000
consuluser       hard    nofile     1024000
consuluser soft memlock unlimited 
consuluser hard memlock unlimited 

4.2 修改系统内核参数

该步暂且不做,待运行后再根据实际情况调整。

4.3 增加本地/etc/hosts

为避免DNS故障,在本地/etc/hosts中添加Consul集群内所有节点的主机名。

192.168.0.11  registry01-consul
192.168.0.12  registry03-consul
192.168.0.13  registry03-consul

5. 依赖

consul是个静态编译的,谁都不依赖。ldd查看结果:

[consuluser@registry02-consul consul]$ ldd consul 
    不是动态可执行文件

6. consul server部署步骤

以下在3个节点操作。

6.1 创建运行用户和组consuluser以及必要目录

使用root用户

为每台服务器创建consuluser账号(含用户和组)

groupadd -g 500 consuluser && useradd -g 500 -u 500 consuluser && passwd consuluser

创建consuluser家目录下的基本目录

mkdir /opt/consuluser/{application,run,etc,software}

创建consuluser数据目录

mkdir /data/consuluser -p && chown -R consuluser:consuluser /data/consuluser

使用consuluser用户

创建consul程序、数据、运行和日志相关的目录

mkdir -p $HOME/{application,etc,run}/consul
mkdir /{data,logs}/consuluser/consul

6.2 下载consul软件包

wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip -O $HOME/software/consul_1.7.2_linux_amd64.zip

unzip $HOME/software/consul_1.7.2_linux_amd64.zip -d $HOME/application/consul/

6.3 设置环境变量

编辑$HOME/.bash_profile,增加以下内容:

CONSUL_HOME=/opt/consuluser/application/consul
PATH=$CONSUL_HOME:$PATH
export PATH

可以使用无交互命令直接追加。

cat<<EOF>>$HOME/.bash_profile

####consul config#####

CONSUL_HOME=$HOME/application/consul
PATH=$CONSUL_HOME:$PATH

export PATH
EOF

完成.bash_profile内容追加后,执行以下命令来使环境变量生效。

source $HOME/.bash_profile

6.4 准备配置文件

6.4.1 配置加载说明

consul提供了命令行启动参数、环境变量、配置文件3种配置手段来配置参数,配置的加载顺序依次为命令行启动参数、环境变量、配置文件。

大多数配置参数都可以通过这3种手段进行配置。有2个关键参数只能在命令行启动参数中配置:进程ID和配置文件路径。

本文主要采用配置文件方式进行参数配置。

在命令行启动参数中指定配置文件或目录位置,使配置文件生效。

如果使用配置目录,配置文件需要以.hcl或者.json为后缀命名才能被加载,加载顺序遵循配置文件名称在字母表中的顺序,譬如aaa.json要早于bbb.json加载。本文选用json格式。

除了设置agent,配置文件也可以提供check和service定义。本文的consul,不在配置文件中定义check和service,交由程序和UI去控制。

在consul配置文件的组织上,可以使用1个配置文件,也可以使用多个配置文件。本文的consul是按照功能进行了文件拆分,对应关系为:

consul进程,consul.json
consul日志,log.json
consul服务,server.json
consul网络,network.json
consul访问控制,acl.json

consul配置文件在$HOME/etc/consul中,新建consul.json, log.json, server.json, network.json, acl.json 5个配置文件,内容见以下章节。

6.4.2 consul.json
{
  "datacenter": "china-center",
  "data_dir": "/data/consuluser/consul",
  "encrypt": "xxxxxxxxxxxxxxxxxxx==",
  "node_name": "registry01-consul"
}

部署Consul集群时,本文件中node_name参数需要修改为各节点自己的节点名称。

配置项解释

datacenter: agent所属的数据中心名称。默认为dc1。属于同一个datacenter的agent应该在同一局域网LAN内。

data_dir: consul数据目录,consul进程的所有数据存放在此参数指定的目录中。该目录要设置为600权限。

encrypt: Consul集群内gossip通信使用的secret key, 32字节的 Base64 编码字符串。只有该字段相同的consul节点,才可以加入consul集群。同一集群内的consul节点该值必须一样,才能通信。这个值只需要节点第一次初始化启动的时候需要,会自动保存到data目录,下次启动时agent会自动加载。

node_name: 集群中节点名称,集群内唯一,默认为主机名hostname。

6.4.3 log.json
{
  "log_file": "/logs/consuluser/consul/",
  "log_level": "info",
  "log_rotate_duration": "24h",
  "log_rotate_max_files": 33,
  "log_json": false
}

配置项解释

log_file, 日志路径,如果不提供文件名,默认为consul-{timestamp}.log。

log_level, 日志级别,默认为"info"。可选值为 "trace", "debug", "info", "warn", and "err"。

log_rotate_duration,日志滚动周期。默认值为24h,表示24小时。

log_rotate_max_files, 日志数量,默认为0,即不删除。可以设置为30,保留30天日志。本文设置为33.

log_json,日志是否输出为json格式。

6.4.4 server.json
{
  "server": true,
  "ui": true,
  "bootstrap_expect": 3,
  "retry_join": [
    "registry01-consul",
    "registry02-consul",
    "registry03-consul"
  ],
  "performance": {
    "raft_multiplier": 1
  }
}

配置项解释

server,指定agent以server模式运行。

bootstrap_expect(-bootstrap-expect), 同一datacenter内期望的server节点数量。满足该参数指定数量的server可用后,集群开始启动bootstrap。

ui(-ui),是否启用web界面。默认为否。

retry_join(-retry-join),加入某节点。如果加入失败,会继续重试。一旦加入成功,就不会再次尝试。

6.4.5 network.json

大多数情况下,只需要指定以下两个参数。

{
  "bind_addr": "192.168.0.11",
  "client_addr": "0.0.0.0"
}

部署Consul集群时,本文件中bind_addr参数需要修改为各节点本身的IP。

配置项解释

bind_addr(-bind), 集群内部通信地址,该IP必须与其他节点互通可达。默认为0.0.0.0,即在所有网络接口上bind,但是如果是多个IP地址,Consul会在启动时报错退出。在本文环境中,必须指定为bond1应用网卡IP。

client_addr (-client), 面向客户端的本地网络接口的IP,默认是127.0.0.1,即只允许本地client访问,设置为0.0.0.0即可。

6.4.6 acl.json
{
  "acl":{
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "tokens": {
       "agent": "12345678-1234-1234-1234-123456781234"
    }
  }
}

配置项解释

enabled,是否启用ACL。

default_policy, 默认ACL策略,可选值为"allow"和"deny",默认为"allow"。

enable_token_persistence, 可选值为true和false, 默认为true。设置为true,表示使用API设置了agent的token,该token会自动保存到磁盘,下次agent重启会重载该token。反之,不保存。

tokens,agent所使用的token。

6.5 firewalld/iptables防火墙规则

修改/etc/firewalld目录下的文件,加入防火墙规则。

6.5.1 IP地址列表定义文件

/etc/firewalld/ipsets/consul_nodes.xml

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
  <entry>192.168.0.11</entry>
  <entry>192.168.0.12</entry>
  <entry>192.168.0.13</entry>
</ipset>
6.5.2 Service服务定义文件

/etc/firewalld/services/consul.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
<short>consul</short>
<description>consul</description>
<port protocol="tcp" port="8500"/>
<port protocol="tcp" port="8600"/>
</service>
6.5.3 安全策略文件

/etc/firewalld/zones/public.xml

<service name="consul"/>
<rule family="ipv4">
    <source ipset="consul_nodes"/>
    <accept/>
</rule>
6.5.4 重载firewalld

重新加载配置文件。

systemctl restart firewalld

systemctl reload firewalld

6.6 加入systemd/init系统服务

systemd启动文件consul.service内容:

[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/opt/consuluser/etc/consul/consul.json

[Service]
User=consuluser
Group=consuluser
ExecStart=/opt/consuluser/application/consul/consul agent -config-dir=/opt/consuluser/etc/consul/ -pid-file=/opt/consuluser/run/consul/consul.pid
ExecReload=/opt/consuluser/application/consul/consul reload
KillMode=process
Restart=on-failure
LimitNOFILE=102400

[Install]
WantedBy=multi-user.target

6.7 启动

6.7.1 首次启动consul

以下均使用consuluser账户。

acl.json

{
  "acl":{
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true
  }
}

使用以下命令依次启动3个节点的consul server。

/opt/consuluser/application/consul/consul agent -config-dir=/opt/consuluser/etc/consul/ -pid-file=/opt/consuluser/run/consul/consul.pid

加入acl.json,重启consul server

6.7.2 创建bootstrap token
[consuluser@registry03-consul consul]$ consul acl bootstrap
AccessorID:       12345678-1234-1234-1234-123456781234
SecretID:         12345678-1234-1234-1234-123456781234
Description:      Bootstrap Token (Global Management)
Local:            false
Create Time:      2020-05-28 18:36:29.632420315 +0800 CST
Policies:
   12345678-1234-1234-1234-123456781234 - global-management

使用该token,查看members, 响应正常表示token生成成功。

[consuluser@registry01-consul ~]$ consul members -token "12345678-1234-1234-1234-123456781234"
Node                                      Address             Status  Type    Build  Protocol  DC           Segment
registry01-consul  192.168.0.11:8301  alive   server  1.7.2  2         china-center  <all>
registry02-consul  192.168.0.12:8301  alive   server  1.7.2  2         china-center  <all>
registry03-consul  192.168.0.13:8301  alive   server  1.7.2  2         china-center  <all>
6.7.3 创建agent policy和token

和 token 相关的 policy 和 token create 的脚本和配置文件,均存放在以下目录,便于直接修改使用。

$HOME/data/consul/agent-token

其中agent-token目录为agent token使用,ui-token目录为ui token使用。

在每一个节点上执行以下操作,创建token。

  1. 设置master token环境变量

    export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234

  2. 创建policy配置文件agent-policy.hcl,对node可写,对service可读。node_prefix的值替换为每一个节点的node_name。

新建agent-policy.hcl文件。

vi agent-policy.hcl

填入以下内容,保存退出。

# agent-policy.hcl contains the following:
node_prefix "" {
   policy = "write"
}
service_prefix "" {
   policy = "read"
}
  1. 创建policy

执行以下命令

consul acl policy create -name "agent-policy" -rules @agent-policy.hcl

返回以下内容

ID:           12345678-1234-1234-1234-123456781234
Name:         agent-policy
Description:  
Datacenters:  
Rules:
node_prefix "registry01-consul" {
  policy = "write"
}
service_prefix "" {
   policy = "read"
}
  1. 创建token

执行创建token的命令

consul acl token create -description "Agent Token" -policy-name agent-policy

返回以下内容

AccessorID:       12345678-1234-1234-1234-123456781234
SecretID:         12345678-1234-1234-1234-123456781234
Description:      Agent Token
Local:            false
Create Time:      2020-05-28 19:10:20.010578858 +0800 CST
Policies:
   12345678-1234-1234-1234-123456781234 - agent-policy
  1. 如果需要创建和原数据中心一样的token,执行以下命令。(没必要,但是可以作为双中心service的token生成的命令参考)

执行以下命令

consul acl token create -description "Agent Token" -policy-name agent-policy -secret=12345678-1234-1234-1234-123456781234 -accessor=12345678-1234-1234-1234-123456781234

返回以下内容

AccessorID:       12345678-1234-1234-1234-123456781234
SecretID:         12345678-1234-1234-1234-123456781234
Description:      Agent Token
Local:            false
Create Time:      2020-05-28 19:17:18.456733101 +0800 CST
Policies:
   12345678-1234-1234-1234-123456781234 - agent-policy
6.7.4 修改Consul配置文件并重启Consul

修改各节点的acl.json配置文件,添加tokens信息,并依次重启consul。

registry01-consul

acl.json

[consuluser@registry01-consul consul]$ cat acl.json 
{
  "acl":{
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "tokens": {
       "agent": "12345678-1234-1234-1234-123456781234"
    }
  }
}

使用consuluser用户执行以下命令关闭consul。

[consuluser@registry01-consul consul]$ consul leave
Graceful leave complete

切换到root用户下,使用systemd启动consul。

[consuluser@registry01-consul consul]$ su -
密码:
上一次登录:四 5月 28 17:36:42 CST 2020pts/0 上
最后一次失败的登录:四 5月 28 20:06:06 CST 2020pts/1 上
最有一次成功登录后有 2 次失败的登录尝试。
[root@registry01-consul ~]# systemctl start consul

可以使用systemctl status consul查看服务状态。

registry02-consul

acl.json

[consuluser@registry02-consul consul]$ cat acl.json 
{
  "acl":{
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "tokens": {
       "agent": "12345678-1234-1234-1234-123456781234"
    }
  }
}

使用consuluser用户执行以下命令关闭consul。

[consuluser@registry02-consul consul]$ consul leave
Graceful leave complete

切换到root用户下,使用systemd启动consul。

[root@registry02-consul ~]# systemctl start consul

可以使用systemctl status consul查看服务状态。

registry03-consul

acl.json

[consuluser@registry03-consul consul]$ cat acl.json 
{
  "acl":{
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "tokens": {
       "agent": "12345678-1234-1234-1234-123456781234"
    }
  }
}

使用consuluser用户执行以下命令关闭consul。

[consuluser@registry03-consul consul]$ consul leave
Graceful leave complete

切换到root用户下,使用systemd启动consul。

[root@registry03-consul ~]# systemctl start consul

可以使用systemctl status consul查看服务状态。

6.7.5 添加UI Token (可选)

可以添加UI Token,赋予所有node/server/kv的只读权限,用于在UI中查看节点/服务/KV。

在任意节点上执行以下操作,创建UI Policy和UI Token。

  1. 设置master token环境变量

    export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234

  2. 创建policy配置文件ui-policy.hcl,对所有node/service/kv可读。

新建ui-policy.hcl文件。

vi ui-policy.hcl

填入以下内容,保存退出。

# ui-policy.hcl contains the following:
node_prefix "" {
   policy = "read"
}
service_prefix "" {
   policy = "read"
}
kv_prefix "" {
   policy = "read"
}
  1. 创建policy

执行以下命令

consul acl policy create -name "ui-policy" -rules @ui-policy.hcl

返回以下内容

ID:           12345678-1234-1234-1234-123456781234
Name:         ui-policy
Description:  
Datacenters:  
Rules:
service_prefix "" {
  policy = "read"
}
key_prefix "" {
  policy = "read"
}
node_prefix "" {
  policy = "read"
}
  1. 创建token

执行创建token的命令

consul acl token create -description "Token for UI" -policy-name ui-policy

返回以下内容

AccessorID:       12345678-1234-1234-1234-123456781234
SecretID:         12345678-1234-1234-1234-123456781234
Description:      Token for UI
Local:            false
Create Time:      2020-05-28 20:31:08.116028351 +0800 CST
Policies:
   12345678-1234-1234-1234-123456781234 - ui-policy
6.7.6 访问UI

打开浏览器,输入以下地址访问consul ui。

http://192.168.0.11:8500/ui

在ACL标签面板中,填入上一步创建的UI Token,即可查看所有节点、服务和KV的情况。

也可以填入ACL Bootstrap阶段创建的Master Token,用于在UI上管理ACL、节点、服务和KV等。

7. 维护

7.1 启动和停止

启动:

systemctl start consul

停止:

systemctl stop consul

状态:

systemctl status consul

7.2 日志查看

日志保存在/logs/consuluser/consul中,可以直接查看。

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