如何在CentOS/RHEL 7/8上设置Consul群集

时间:2020-02-23 14:30:59  来源:igfitidea点击:

本教程将引导我们完成在CentOS/RHEL 7/8上安装和配置Consul群集的步骤。
Consul是用于服务发现,配置和分段功能的开源,分布式且高度可用的解决方案。
Consul提供了一个简单的内置代理,但支持Envoy等第三方代理集成。

在之前的指南中,我们介绍了在Ubuntu上安装三个节点的Consul Cluster。

Consul的主要功能

服务发现:客户注册服务,其他应用程序可以使用Consul通过DNS或者HTTP发现服务。
安全服务通信:Consul可以生成和分发用于服务的TLS证书以建立相互TLS连接。
用于动态配置,协调,领导者选举,功能标记等。
它具有简单易用的HTTP API健康检查:consul 客户端对服务(如果可以)和本地节点(例如资源利用率)都进行健康检查。
此信息有助于监视群集的运行状况以及不正常节点的流量路由。
多数据中心:Consul开箱即用地支持多个数据中心。

Consul架构

向Consul提供服务的每个节点都运行Consul代理,该代理负责对节点以及节点本身上的服务进行健康检查。
Consul代理与一台或者多台存储和复制数据的Consul服务器通信。
consul 服务器本身选举一名领导者。

我们需要发现其他服务或者节点的基础架构系统可以查询任何Consul服务器或者任何Consul代理。
代理会自动将查询转发到服务器。
虽然Consul可以与一台服务器一起工作,但建议在生产环境中使用3到5台Consul服务器,以避免可能导致完全数据丢失的故障情况。

在CentOS 7上的Consul群集设置

我的设置基于以下CentOS 7服务器。

consul-01192.168.10.10
consul-02192.168.10.11
consul-03192.168.10.12

设置服务器主机名,例如:

# Server 1
$sudo hostnamectl set-hostname consul-01.example.com --static
# Server 2
$sudo hostnamectl set-hostname consul-02.example.com --static
# Server 2
$sudo hostnamectl set-hostname consul-03.example.com --static

然后将SELinux置于许可模式。

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

步骤1:在CentOS 7上安装Consul

我们需要在所有三个节点上安装Consul。
我们可能需要在发布页面上检查最新版本。

sudo yum install -y wget unzip
export VER="1.6.2"
wget https://releases.hashicorp.com/consul/${VER}/consul_${VER}_linux_amd64.zip

解压缩文件

unzip consul_${VER}_linux_amd64.zip

移动提取 consul二进制到 /usr/local/bin目录

sudo mv consul /usr/local/bin/

要验证Consul是否已正确安装,请运行 consul -v在系统上。

$consul -v
Consul v1.6.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

要打印consul 帮助页面,请使用 --help选项。

$consul  --help
 Usage: consul [--version] [--help] 
 Available commands are:
     acl            Interact with Consul's ACLs
     agent          Runs a Consul agent
     catalog        Interact with the catalog
     connect        Interact with Consul Connect
     debug          Records a debugging archive for operators
     event          Fire a new event
     exec           Executes a command on Consul nodes
     force-leave    Forces a member of the cluster to enter the "left" state
     info           Provides debugging information for operators.
     intention      Interact with Connect service intentions
     join           Tell Consul agent to join cluster
     keygen         Generates a new encryption key
     keyring        Manages gossip layer encryption keys
     kv             Interact with the key-value store
     leave          Gracefully leaves the Consul cluster and shuts down
     lock           Execute a command holding a lock
     maint          Controls node or service maintenance mode
     members        Lists the members of a Consul cluster
     monitor        Stream logs from a Consul agent
     operator       Provides cluster-level tools for Consul operators
     reload         Triggers the agent to reload configuration files
     rtt            Estimates network round trip time between nodes
     services       Interact with services
     snapshot       Saves, restores and inspects snapshots of Consul server state
     tls            Builtin helpers for creating CAs and certificates
     validate       Validate config files/directories
     version        Prints the Consul version
     watch          Watch for changes in Consul

启用bash完成:

consul -autocomplete-install
complete -C /usr/local/bin/consul consul

第2步:引导并启动Consul群集

consul 引导在三个节点上一个接一个地完成。
如果要执行单个节点Consul设置,则可以跳过其他两个节点。

在所有Consul群集节点上运行 1.创建一个 consul系统用户/组

sudo groupadd --system consul
sudo useradd -s /sbin/nologin --system -g consul consul

2.创建consul 数据和配置目录,并将所有权设置为 consul用户

sudo mkdir -p /var/lib/consul /etc/consul.d
sudo chown -R consul:consul /var/lib/consul /etc/consul.d
sudo chmod -R 775 /var/lib/consul /etc/consul.d

设置DNS或者编辑 /etc/hosts文件来配置所有服务器的主机名(在所有节点上设置)。

$sudo vi /etc/hosts 
# Consul Cluster Servers
192.168.10.10 consul-01.example.com consul-01
192.168.10.11 consul-02.example.com consul-02
192.168.10.12 consul-03.example.com consul-03

代替 example.com与我们在主机名设置中使用的实际域名相同。

Bootstrap Consul第一个节点– consul-01

对于单个节点consul :

对于单个服务器Consul设置,请在以下位置创建系统服务文件: /etc/systemd/system/consul.service具有以下内容。

# Consul systemd service unit file
[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 -server -ui \
	-advertise=192.168.10.10 \
	-bind=192.168.10.10 \
	-data-dir=/var/lib/consul \
	-node=consul-01 \
	-config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target

其中:192.168.10.10是Consul节点服务器选项的IP地址:将代理切换到服务器模式。
-advertise:设置要使用的发布地址。
-ui:启用内置的静态Web UI服务器节点:名称这个节点。
在集群中必须是唯一的。
-data-dir:用于存储代理状态的数据目录的路径

对于三节点群集:

创建一个系统服务文件 /etc/systemd/system/consul.service并添加:

# Consul systemd service unit file
[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 \
	-node=consul-01 \
	-config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target

生成consul 秘密

# consul keygen
pzDVYxESgPSkPhBFudHU5w==

然后为该节点中的节点创建一个json配置文件 /etc/consul.d/config.json

{
     "advertise_addr": "192.168.10.10",
     "bind_addr": "192.168.10.10",
     "bootstrap_expect": 3,
     "client_addr": "0.0.0.0",
     "datacenter": "DC1",
     "data_dir": "/var/lib/consul",
     "domain": "consul",
     "enable_script_checks": true,
     "dns_config": {
         "enable_truncate": true,
         "only_passing": true
     },
     "enable_syslog": true,
     "encrypt": "pzDVYxESgPSkPhBFudHU5w==",
     "leave_on_terminate": true,
     "log_level": "INFO",
     "rejoin_after_leave": true,
     "retry_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "server": true,
     "start_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "ui": true
 }

替换所有出现的 192.168.10.10使用此节点的正确IP地址以及使用我们生成的secret进行加密的值。
验证consul 配置。

# consul validate /etc/consul.d/config.json 
Configuration is valid!

我们需要为短DNS名称(consul-01,consul-02和consul-03)配置DNS或者主机文件才能正常工作。

Bootstrap Consul第二和第三个节点

consul 节点2

创建Consul systemd服务:

$sudo vi /etc/systemd/system/consul.service
[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 \
	-node=consul-02 \
	-config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target

创建Consul json配置文件:

$sudo vi  /etc/consul.d/config.json 
{
     "advertise_addr": "192.168.10.11",
     "bind_addr": "192.168.10.11",
     "bootstrap_expect": 3,
     "client_addr": "0.0.0.0",
     "datacenter": "DC1",
     "data_dir": "/var/lib/consul",
     "domain": "consul",
     "enable_script_checks": true,
     "dns_config": {
         "enable_truncate": true,
         "only_passing": true
     },
     "enable_syslog": true,
     "encrypt": "pzDVYxESgPSkPhBFudHU5w==",
     "leave_on_terminate": true,
     "log_level": "INFO",
     "rejoin_after_leave": true,
     "retry_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "server": true,
     "start_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "ui": true
}

consul 节点3

创建Consul systemd服务:

$sudo vi /etc/systemd/system/consul.service
[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 \
	-node=consul-03 \
	-config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target

创建Consul json配置文件:

$sudo vi  /etc/consul.d/config.json 
{
     "advertise_addr": "192.168.10.12",
     "bind_addr": "192.168.10.12",
     "bootstrap_expect": 3,
     "client_addr": "0.0.0.0",
     "datacenter": "DC1",
     "data_dir": "/var/lib/consul",
     "domain": "consul",
     "enable_script_checks": true,
     "dns_config": {
         "enable_truncate": true,
         "only_passing": true
     },
     "enable_syslog": true,
     "encrypt": "pzDVYxESgPSkPhBFudHU5w==",
     "leave_on_terminate": true,
     "log_level": "INFO",
     "rejoin_after_leave": true,
     "retry_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "server": true,
     "start_join": [
         "consul-01",
         "consul-02",
         "consul-03"
     ],
     "ui": true
}

启动consul 服务

在防火墙上允许consul 端口。

sudo firewall-cmd  --add-port={8300,8301,8302,8400,8500,8600}/tcp --permanent
sudo firewall-cmd  --add-port={8301,8302,8600}/udp --permanent
sudo firewall-cmd --reload

有关更多详细信息,请参见consul 端口。
在所有节点上启动consul 服务

sudo systemctl start consul

启用服务以在启动时启动

sudo systemctl enable consul

可以通过以下方式检查服务状态:

检查consul 群集成员:

# consul members
Node       Address             Status  Type    Build  Protocol  DC   Segment
consul-01  192.168.10.10:8301  alive   server  1.6.1  2         dc1  <all>
consul-02  192.168.10.11:8301  alive   server  1.6.1  2         dc1  <all>
consul-03  192.168.10.12:8301  alive   server  1.6.1  2         dc1  <all>

输出显示了地址,运行状况,集群中的角色以及集群中每个节点的consul版本。
我们可以通过提供 -detailed旗帜。

# consul members -detailed

访问consul UI

我们可以使用URL访问Consul内置的Web界面 http://@@@consul-IP>:8500/ui

我们已在CentOS/RHEL 7/8上成功安装了三节点Consul群集。