目录
- 部署节点
- 部署设计
- 依赖
- 安装与运行
- 维护
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。
-
设置master token环境变量
export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234
创建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"
}
- 创建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"
}
- 创建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
- 如果需要创建和原数据中心一样的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。
-
设置master token环境变量
export CONSUL_HTTP_TOKEN=12345678-1234-1234-1234-123456781234
创建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"
}
- 创建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"
}
- 创建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中,可以直接查看。