Consul的搭建和使用

如何在ubuntu上搭建consul服务

在 Ubuntu 上搭建 Consul 服务相对简单,下面是详细的步骤来安装和配置 Consul。

1. 更新系统和安装依赖

在安装 Consul 之前,确保你的系统已经是最新的,并且安装了必要的依赖项。

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install unzip curl -y

2. 下载并安装 Consul

从 HashiCorp 的官方网站下载最新版本的 Consul 二进制文件。

1
curl -fsSL https://releases.hashicorp.com/consul/ | grep "linux_amd64" | head -n 1 | awk -F'[<>]' '{print $3}' | xargs -I {} curl -LO https://releases.hashicorp.com/consul/{}

不好使,直接 wget https://releases.hashicorp.com/consul/1.19.2/consul_1.19.2_linux_amd64.zip

解压下载的文件并将其移动到系统的可执行路径中。

1
2
unzip consul_*_linux_amd64.zip
sudo mv consul /usr/local/bin/

验证 Consul 是否安装成功:

1
consul --version

你应该看到类似如下输出,显示 Consul 的版本信息:

1
Consul v1.x.x

3. 创建 Consul 用户 (这步可以不做..安全起见可以搞,测试不需要~)

为了安全性,创建一个专用用户来运行 Consul 服务。

1
sudo useradd --system --home /etc/consul.d --shell /bin/false consul

4. 创建目录结构

为 Consul 创建必要的目录,用于存储配置和数据。

1
2
sudo mkdir --parents /etc/consul.d /var/lib/consul
sudo chown --recursive consul:consul /etc/consul.d /var/lib/consul

5. 创建 Consul 配置文件

/etc/consul.d 目录下创建一个 consul.hcl 配置文件。

1
sudo nano /etc/consul.d/consul.hcl

填入以下基础配置:

1
2
3
4
5
6
7
8
9
datacenter = "dc1"
data_dir = "/var/lib/consul"
log_level = "INFO"
node_name = "consul-server-1"
server = true
bootstrap_expect = 1
bind_addr = "0.0.0.0"
client_addr = "0.0.0.0"
ui = true
  • datacenter:定义数据中心名称。
  • bootstrap_expect:定义集群中预期的服务器实例数量(如果你是单节点模式,可以设置为 1)。
  • bind_addrclient_addr:允许 Consul 在所有网络接口上监听请求。
  • ui:启用 Consul 的 Web UI。

6. 创建 Systemd 服务文件

为了让 Consul 以服务的形式运行,我们需要创建一个 systemd 服务文件。

1
sudo nano /etc/systemd/system/consul.service

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Consul Agent
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

[Service]
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

保存并退出。

7. 启动并启用 Consul 服务

现在重新加载 systemd,并启动 Consul 服务。

1
2
sudo systemctl daemon-reload
sudo systemctl start consul

查看服务状态,确保 Consul 正常运行:

1
sudo systemctl status consul

如果一切正常,可以将 Consul 设置为开机自启:

1
sudo systemctl enable consul

8. 验证 Consul UI

如果 Consul 已成功启动,并且 UI 被启用,你可以通过浏览器访问 Consul 的 Web UI。

打开浏览器并访问 http://<你的服务器IP>:8500/ui/

例如,如果你在本地机器上运行:

1
http://localhost:8500/ui/

9. 防火墙配置(可选)

如果你使用了防火墙(例如 UFW),确保打开 Consul 使用的端口:

1
2
3
sudo ufw allow 8500/tcp
sudo ufw allow 8600/tcp
sudo ufw allow 8600/udp

10. 集群设置(可选)

如果你打算将 Consul 作为集群运行,需要配置多个节点。将 bootstrap_expect 设置为服务器的数量,并确保每个节点都有唯一的 node_name

在其他服务器上,安装 Consul 并使用 join 参数来加入集群:

1
consul agent -join <Consul服务器的IP地址>

至此,你已经在 Ubuntu 上成功安装并配置了 Consul 服务。如果你需要更多高级功能或集群配置,可以参考 Consul 官方文档


现在我已经把consul安装好了,之后的希望简单点,因为是测试环境

好的,对于测试环境,简单配置 Consul 是一个不错的选择,减少复杂性。我们可以按照以下步骤来进行后续的基本配置和使用。

1. 启动 Consul Agent

在测试环境中,你可以以单机模式运行 Consul,这样无需考虑集群配置。

1
consul agent -dev

这会启动 Consul 并进入开发模式,自动配置为单节点模式,不需要额外的集群设置。开发模式下所有数据会保存在内存中,并且关闭时清除。

2. 检查 Consul Web UI

Consul 默认会在 localhost:8500 上启动 Web UI,你可以在浏览器中访问:

1
http://localhost:8500

从这里你可以查看节点、服务、KV 存储等。

3. 注册服务(可选)

如果你想在 Consul 中注册一个服务,可以手动创建一个配置文件,或者通过 API 注册。

一个简单的 JSON 配置文件(比如 web.json)如下:

1
2
3
4
5
6
7
{
"service": {
"name": "web",
"tags": ["nginx"],
"port": 8080
}
}

然后通过以下命令启动 Consul 并读取配置:

1
consul agent -dev -config-file=web.json

4. 使用 KV 存储

Consul 的 KV 存储可以用来存储一些简单的配置数据。你可以通过命令行或 Web UI 来操作。

设置一个键值对:

1
consul kv put my-key "Hello, Consul!"

获取一个键值对:

1
consul kv get my-key

5. 停止 Consul

测试完成后,你可以通过 Ctrl + C 停止 Consul Agent。


这些步骤应该足够你在测试环境中启动并运行 Consul。如果你以后需要更多的功能(如集群、服务发现等),可以再进行更复杂的配置。


简单,安装好二进制后,直接 consul agent -dev -client 0.0.0.0 就能启动,但是数据啥的都保存到内存里~



我现在是通过consul agent -dev -client 0.0.0.0启动的,是否ctrl+c后数据都没了?

是的,当你使用 consul agent -dev 启动 Consul 时,Consul 会以 开发模式-dev)运行。开发模式下,Consul 会将所有的数据存储在内存中,并且不会持久化到磁盘。这意味着 数据仅在 Consul 运行期间有效,一旦你按下 Ctrl + C 停止 Consul,所有的服务注册、KV 存储、健康检查等数据都会丢失。

为什么开发模式不保存数据?

开发模式(-dev)的主要目的是为了快速测试和开发,带来以下特性:

  • 单节点运行:不需要集群配置,自动充当服务器和客户端。
  • 内存存储:所有数据存储在内存中,便于快速测试。
  • 关闭即清除数据:当 Consul 停止时,所有数据都会被丢弃,不会保存在磁盘中。

如何持久化数据?

如果你想让 Consul 的数据在重启后仍然存在,应该在非开发模式下运行 Consul,并指定一个持久化的 数据目录

你可以通过以下步骤来持久化数据:

  1. 创建数据目录
    创建一个目录来存储 Consul 的数据(例如 /opt/consul/data),确保 Consul 进程有权限访问该目录。

    1
    mkdir -p /opt/consul/data
  2. 使用持久化数据目录启动 Consul
    不使用 -dev 模式,而是指定 -data-dir 参数来存储数据。

    1
    consul agent -server -bootstrap-expect=1 -data-dir=/opt/consul/data -client=0.0.0.0

    这会启动一个单节点的 Consul 服务器,并将数据保存到 /opt/consul/data 目录中。即使你按 Ctrl + C 停止 Consul,数据也会被持久化到该目录,重启后数据仍然有效。

  3. 访问 Web UI
    你仍然可以通过 http://<公网IP>:8500 访问 Web UI。

总结

  • 开发模式(-dev:数据不会持久化,停止 Consul 后数据会丢失。
  • 非开发模式:通过 -data-dir 参数指定数据目录后,Consul 会将数据保存在该目录中,即使重启也不会丢失。

如果你只是做简单的测试,开发模式是合适的。如果需要持久化数据,建议使用非开发模式并指定数据目录。

consul agent -server -bootstrap-expect=1 -data-dir=/data/consul2024/consul-data -client=0.0.0.0


会报 ==> Multiple private IPv4 addresses found. Please configure one with ‘bind’ and/or ‘advertise’.

当你启动 Consul 时遇到 ==> Multiple private IPv4 addresses found. Please configure one with 'bind' and/or 'advertise'. 这个警告,说明你的机器有多个私有 IP 地址,Consul 不知道应该使用哪个 IP 地址来绑定和宣传(advertise)服务。

这是因为机器可能有多个网络接口(例如多个网卡、Docker 虚拟网卡、VPN 等),Consul 需要明确知道应该绑定和宣传哪个 IP 地址。

解决方法

你可以通过 -bind-advertise 参数来明确指定 Consul 应该使用哪个 IP 地址:

  • -bind:指定 Consul 绑定的网络接口,用于内部通信(例如节点之间的通信)。
  • -advertise:指定 Consul 向其他节点宣传的 IP 地址(通常是其他节点用来连接该节点的地址)。

1. 获取机器的私有 IP 地址

首先,确认你要使用哪个私有 IP 地址。你可以通过以下命令查看机器的所有 IP 地址:

1
ip addr show

输出中,你会看到类似的内容:

1
2
3
4
5
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 10.0.0.100/24 brd 10.0.0.255 scope global eth1

根据你的网络结构,选择你想要绑定的 IP 地址。例如,如果你想让 Consul 绑定到 192.168.1.100,你就可以使用这个地址。

2. 使用 -bind-advertise 参数启动 Consul

现在,你可以通过以下命令明确指定 Consul 绑定和宣传的 IP 地址:

1
consul agent -dev -client 0.0.0.0 -bind 192.168.1.100 -advertise 192.168.1.100
  • -bind:将 Consul 绑定到 192.168.1.100,用于内部节点通信。
  • -advertise:将 192.168.1.100 宣传给其他节点,其他节点会通过这个 IP 地址与此节点通信。

3. 使用配置文件(可选)

如果你使用配置文件启动 Consul,你也可以将 bindadvertise 设置添加到配置文件中。例如,在 consul.hcl 中:

1
2
3
bind_addr = "192.168.1.100"
advertise_addr = "192.168.1.100"
client_addr = "0.0.0.0"

然后通过配置文件启动 Consul:

1
consul agent -config-file=consul.hcl

总结

  • 为什么会出现这个问题? 当机器有多个私有 IP 地址时,Consul 不知道应该使用哪个地址进行绑定和通信。

  • 解决方法:使用 -bind-advertise 参数明确指定 Consul 应该使用的 IP 地址。

  • 命令示例

    1
    consul agent -dev -client 0.0.0.0 -bind 192.168.1.100 -advertise 192.168.1.100

这将解决 Consul 在多 IP 环境中的问题,确保它使用你指定的 IP 地址。

consul agent -dev -client 0.0.0.0 -bind 172.22.0.137 -advertise 172.22.0.137

consul agent -server -bootstrap-expect=1 -data-dir=/data/consul2024/consul-data -client=0.0.0.0 -bind 172.22.0.137 -advertise 172.22.0.137

用-data-dir指定存储目录,这样应该重启后也不会丢失了~

但是这样启动,webui访问不了~

还是用之前的启动方式…

持久化的方式到时再看看

https://www.google.com/search?q=consul+%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%8B%E8%BD%BD&oq=consul+%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%8B%E8%BD%BD&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQIRigATIHCAIQIRigAdIBCDQxOTdqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8

https://kingjcy.github.io/post/middleware/serverdiscovery/consul/

https://developer.hashicorp.com/consul/tutorials/get-started-vms