目 录CONTENT

文章目录

Consul集群部署

简中仙
2023-05-25 / 0 评论 / 0 点赞 / 43 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-08,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

此处采用的是 3Server + 1Client 的集群架构,3 台 Server 在单独的虚拟机上,1 台 Client 则直接在部署服务的宿主机运行。

节点名称节点IPAgent类型OS版本
consul-01192.168.0.28serverCentos7.9
consul-02192.168.0.174serverCentos7.9
consul-03192.168.0.176serverCentos7.9
consul-client192.168.0.201clientCentos7.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'
0

评论区