如何在CentOS/RHEL 7/8上设置Consul群集
本教程将引导我们完成在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-01 | 192.168.10.10 |
consul-02 | 192.168.10.11 |
consul-03 | 192.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群集。