此处采用的是 3Server + 1Client 的集群架构,3 台 Server 在单独的虚拟机上,1 台 Client 则直接在部署服务的宿主机运行。
节点名称 | 节点IP | Agent类型 | OS版本 |
---|---|---|---|
consul-01 | 192.168.0.28 | server | Centos7.9 |
consul-02 | 192.168.0.174 | server | Centos7.9 |
consul-03 | 192.168.0.176 | server | Centos7.9 |
consul-client | 192.168.0.201 | client | Centos7.9 |
1、安装 Consul
配置主机名,命令示例:(以下操作在所有节点配置)
hostnamectl set-hostname consul-01
hostnamectl set-hostname consul-02
hostnamectl set-hostname consul-03
hostnamectl set-hostname consul-client
下载consul二进制文件
export VER="1.15.1"
wget https://releases.hashicorp.com/consul/${VER}/consul_${VER}_linux_amd64.zip
解压安装
yum install -y unzip
unzip consul_${VER}_linux_amd64.zip -d /usr/local/bin/
查看版本
consul version
创建consul用户和组
groupadd --system consul
useradd -s /sbin/nologin --system -g consul consul
创建consul安装目录
mkdir -p /data/consul/{config,data,logs}
chown -R consul:consul /data/consul
chmod -R 775 /data/consul
设置 DNS 或编辑/etc/hosts 文件以配置所有服务器的主机名,替换example.com
为您的实际域名。
cat >/etc/hosts<<EOF
192.168.0.28 consul-01.example.com consul-01
192.168.0.174 consul-02.example.com consul-02
192.168.0.176 consul-03.example.com consul-03
192.168.0.201 consul-client.example.com consul-client
EOF
2、Server 节点配置
生成Consul secret
# consul keygen
AHYXF5HS6FBX98fm+0urgJzutS4/tFfXd79bda8Ny1g=
为server节点创建json配置文件,其他节点配置修改IP地址及节点名称即可
consul-01节点
cat >/data/consul/config/consul.hcl<<EOF
datacenter = "dc1"
data_dir = "/data/consul/data"
encrypt = "AHYXF5HS6FBX98fm+0urgJzutS4/tFfXd79bda8Ny1g="
retry_join = ["consul-01","consul-02","consul-03"]
performance {
raft_multiplier = 1
}
server = true
bootstrap_expect = 3
ui = true
advertise_addr = "192.168.0.28"
client_addr = "0.0.0.0"
bind_addr = "192.168.0.28"
log_level = "INFO"
node_name = "consul-01"
log_rotate_bytes = 100000000
log_rotate_duration = "24h"
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
tokens = {
agent = "3970fb02-5120-329d-d240-a573dbcb718c"
}
}
domain = "consul"
enable_script_checks = true
dns_config {
enable_truncate = true
only_passing = true
}
enable_syslog = true
leave_on_terminate = true
rejoin_after_leave = true
start_join = ["consul-01","consul-02","consul-03"]
EOF
配置参数说明:
datacenter:此标志控制运行代理的数据中心。如果未提供,则默认为dc1。Consul 对多个数据中心有一流的支持,但它依赖于正确的配置。同一数据中心中的节点应位于单个 LAN 上。
data_dir:该标志为代理提供了一个数据目录来存储状态。
node_name:节点名字,一般为主机名。
server:指定是否为server节点。
bootstrap_expect:在一个datacenter中期望提供的server节点数目,当提供该值的时候,consul一直等到达到指定sever数目才会引导整个集群,该标记不能和bootstrap公用。
bind_addr:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
client_addr:Consul 将绑定客户端接口的地址,包括 HTTP 和 DNS 服务器。默认情况下,这是127.0.0.1,仅允许环回连接。在 Consul 1.0 及更高版本中,这可以设置为要绑定到的以空格分隔的地址列表。
log_json:此标志使代理能够以 JSON 格式输出日志。默认为false。
log_level:在 Consul 代理启动后显示的日志级别。默认为 info 。可用的日志级别是trace、debug、info、warn和err。
retry_join:指定将要置入集群的IP列表,如果失败,会自动重试,知道直到成功加入。
start_join:启动时加入集群的地址
ui_config:此对象允许设置多个子键,用于控制 UI 中可用的显示或功能。
rejoin_after_leave :允许重新加入集群
consul-02节点
cat >/data/consul/config/consul.hcl<<EOF
datacenter = "dc1"
data_dir = "/data/consul/data"
encrypt = "AHYXF5HS6FBX98fm+0urgJzutS4/tFfXd79bda8Ny1g="
retry_join = ["consul-01","consul-02","consul-03"]
performance {
raft_multiplier = 1
}
server = true
bootstrap_expect = 3
ui = true
advertise_addr = "192.168.0.174"
client_addr = "0.0.0.0"
bind_addr = "192.168.0.174"
log_level = "INFO"
node_name = "consul-02"
log_rotate_bytes = 100000000
log_rotate_duration = "24h"
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
}
domain = "consul"
enable_script_checks = true
dns_config {
enable_truncate = true
only_passing = true
}
enable_syslog = true
leave_on_terminate = true
rejoin_after_leave = true
start_join = ["consul-01","consul-02","consul-03"]
EOF
consul-03节点
cat >/data/consul/config/consul.hcl<<EOF
datacenter = "dc1"
data_dir = "/data/consul/data"
encrypt = "AHYXF5HS6FBX98fm+0urgJzutS4/tFfXd79bda8Ny1g="
retry_join = ["consul-01","consul-02","consul-03"]
performance {
raft_multiplier = 1
}
server = true
bootstrap_expect = 3
ui = true
advertise_addr = "192.168.0.176"
client_addr = "0.0.0.0"
bind_addr = "192.168.0.176"
log_level = "INFO"
node_name = "consul-03"
log_rotate_bytes = 100000000
log_rotate_duration = "24h"
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
}
domain = "consul"
enable_script_checks = true
dns_config {
enable_truncate = true
only_passing = true
}
enable_syslog = true
leave_on_terminate = true
rejoin_after_leave = true
start_join = ["consul-01","consul-02","consul-03"]
EOF
3、Client 节点配置
client是consul客户端,客户端不保存数据,客户端将接收到的请求转发给Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都是一个consul agent。
创建consul-client节点配置文件
cat >/data/consul/config/consul.hcl<<EOF
datacenter = "dc1"
data_dir = "/data/consul/data"
encrypt = "AHYXF5HS6FBX98fm+0urgJzutS4/tFfXd79bda8Ny1g="
retry_join = ["consul-01","consul-02","consul-03"]
server = false
ui = true
advertise_addr = "192.168.0.201"
client_addr = "0.0.0.0"
bind_addr = "192.168.0.201"
log_level = "INFO"
node_name = "consul-client"
log_rotate_bytes = 100000000
log_rotate_duration = "24h"
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
}
domain = "consul"
enable_script_checks = true
dns_config {
enable_truncate = true
only_passing = true
}
enable_syslog = true
leave_on_terminate = true
rejoin_after_leave = true
start_join = ["consul-01","consul-02","consul-03"]
EOF
4、systemd 启动文件
所有节点创建systemd 服务文件/etc/systemd/system/consul.service
,所有节点具有相同内容,配置如下:
cat >/etc/systemd/system/consul.service<<EOF
[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/data/consul/config/consul.hcl
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target
EOF
所有节点启动consul服务
systemctl enable --now consul.service
查看consul服务运行状态
# systemctl status consul
第1步:为所有 Consul Server 启用 ACL
首先要在配置文件中启用 ACL。如下,我们设置默认策略是“deny”,表示我们运行在白名单模式;而下行政策是“extend-cache”,表示我们将在中断期间忽略 TTL。
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache"
}
}
请重启 server 以应用新的配置。请一次只重启一台,成功之后再重启其他的。
注意,我们现在启用了 ACL,需要一个 token 才能进行操作。我们在创建 master token 之前是无法做任何事情的。简单起见,接下来我们将一直使用这个 master token。
第2步:创建引导 Token
当 ACL 启动后我们就可以创建第一个 bootstrap token,这是一个有无限权限的管理 token。它会被加入状态存储中,并共享到所有相关 server 上。
# consul acl bootstrap
AccessorID: 1e277021-29a8-16c0-d25e-40dd05f9f091
SecretID: 2f6eaffe-905c-0ea7-29b9-d6a3898ccc69
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2023-03-16T15:13:05.054717458+08:00
Policies:
00000000-0000-0000-0000-000000000001 - global-management
由于 ACL 已经启用,我们需要用它来完成别的操作。比如在获取成员列表时也要传递该 token:
$ consul members -token "2f6eaffe-905c-0ea7-29b9-d6a3898ccc69"
除了可以在参数中传递,还可以设置环境变量:
# export CONSUL_HTTP_TOKEN=2f6eaffe-905c-0ea7-29b9-d6a3898ccc69
该 bootstrap token 也可以写到 server 配置文件的 master
token 字段。
注意,bootstrap token 只能创建一个,在创建 master token 之后该 token 就会被禁用。当 ACL 成功引导并启动后,可以通过 ACL API 来管理这些 token。
第3步:创建 Agent Token 策略
在创建 token 之前,我们需要创建它的策略。一条策略(policy)是一系列规则(rule)的集合,可以指定细粒度的权限。
# vim agent-policy.hcl
node_prefix "" {
policy = "write"
}
service_prefix "" {
policy = "read"
}
该策略允许所有节点可被注册和访问,允许所有服务可读。注意,不建议在生产中使用这个简单策略。最佳实践是对集群中每个节点配置精确的策略和 token。
只需要创建一条策略就可以应用到所有 server 上。如果你没有设置 CONSUL_HTTP_TOKEN
变量,请参考上文配置成 bootstrap token。
# consul acl policy create -name "agent-token" -description "Agent Token Policy" -rules @agent-policy.hcl
ID: f0542ac4-348e-2197-537e-f9fbafb9d866
Name: agent-token
Description: Agent Token Policy
Datacenters:
Rules:
node_prefix "" {
policy = "write"
}
service_prefix "" {
policy = "read"
}
返回的是我们新创建的策略,可以用于接下来要创建的 agent token 了。
第4步:创建 Agent Token
用刚创建的策略可以创建 agent token 了,我们可以在任一server 上执行该操作。本文中,所有 agent 共享同一个 token。注意,SecretID
才是用于验证 API 和 CLI 命令的 token,而不是上面那个。
# consul acl token create -description "Agent Token" -policy-name "agent-token"
AccessorID: 24cc9050-7b5c-02d8-5190-67d731eed30e
SecretID: 3970fb02-5120-329d-d240-a573dbcb718c
Description: Agent Token
Local: false
Create Time: 2023-03-16 15:25:07.73529189 +0800 CST
Policies:
f0542ac4-348e-2197-537e-f9fbafb9d866 - agent-token
第5步:将 Agent Token 加到其他 Server
配置 server 的最后一步,就是通过配置文件把该 token 分配到各 Consul server 上,然后重启:
# vim /data/consul/config/consul.hcl
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
tokens = {
agent = "3970fb02-5120-329d-d240-a573dbcb718c"
}
}
第6步:为所有 Consul Client 启用 ACL
因为 ACL 措施也会影响 Consul client,我们也要写上配置文件并重启这些 client 以启用 ACL。我们可以使用与 server 相同的 ACL agent token。之所以能这么用,是因为我们没有指定节点或服务的前缀。
# vim /data/consul/config/consul.hcl
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
down_policy = "extend-cache"
tokens = {
agent = "3970fb02-5120-329d-d240-a573dbcb718c"
}
}
# consul members
Node Address Status Type Build Protocol DC Partition Segment
consul-01 192.168.0.28:8301 alive server 1.15.1 2 dc1 default <all>
consul-02 192.168.0.174:8301 alive server 1.15.1 2 dc1 default <all>
consul-03 192.168.0.176:8301 alive server 1.15.1 2 dc1 default <all>
consul-client 192.168.0.201:8301 alive client 1.15.1 2 dc1 default <default>
删除服务
# curl --request PUT http://192.168.0.28:8500/v1/agent/service/deregister/node_exporter-192.168.0.176 --header 'X-Consul-Token: 2f6eaffe-905c-0ea7-29b9-d6a3898ccc69'
添加服务
# curl -X PUT -d '{"id": "node_exporter-192.168.0.174","name": "node_exporter","address": "192.168.0.174","port": 9100,"tags": ["192.168.0.174:9100","node_exporter","prod"],"checks": [{"http": "http://192.168.0.174:9100/metrics", "interval": "5s"}]}' http://192.168.0.28:8500/v1/agent/service/register -H 'x-consul-token: 2f6eaffe-905c-0ea7-29b9-d6a3898ccc69'
评论区