如何在ubuntu上搭建consul服务
在 Ubuntu 上搭建 Consul 服务相对简单,下面是详细的步骤来安装和配置 Consul。
1. 更新系统和安装依赖
在安装 Consul 之前,确保你的系统已经是最新的,并且安装了必要的依赖项。
1 | sudo apt update |
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 | unzip consul_*_linux_amd64.zip |
验证 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 | sudo mkdir --parents /etc/consul.d /var/lib/consul |
5. 创建 Consul 配置文件
在 /etc/consul.d 目录下创建一个 consul.hcl 配置文件。
1 | sudo nano /etc/consul.d/consul.hcl |
填入以下基础配置:
1 | datacenter = "dc1" |
datacenter:定义数据中心名称。bootstrap_expect:定义集群中预期的服务器实例数量(如果你是单节点模式,可以设置为 1)。bind_addr和client_addr:允许 Consul 在所有网络接口上监听请求。ui:启用 Consul 的 Web UI。
6. 创建 Systemd 服务文件
为了让 Consul 以服务的形式运行,我们需要创建一个 systemd 服务文件。
1 | sudo nano /etc/systemd/system/consul.service |
输入以下内容:
1 | [Unit] |
保存并退出。
7. 启动并启用 Consul 服务
现在重新加载 systemd,并启动 Consul 服务。
1 | sudo systemctl daemon-reload |
查看服务状态,确保 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 | sudo ufw allow 8500/tcp |
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 | { |
然后通过以下命令启动 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,并指定一个持久化的 数据目录。
你可以通过以下步骤来持久化数据:
创建数据目录:
创建一个目录来存储 Consul 的数据(例如/opt/consul/data),确保 Consul 进程有权限访问该目录。1
mkdir -p /opt/consul/data
使用持久化数据目录启动 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,数据也会被持久化到该目录,重启后数据仍然有效。访问 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 |
根据你的网络结构,选择你想要绑定的 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,你也可以将 bind 和 advertise 设置添加到配置文件中。例如,在 consul.hcl 中:
1 | bind_addr = "192.168.1.100" |
然后通过配置文件启动 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://kingjcy.github.io/post/middleware/serverdiscovery/consul/
https://developer.hashicorp.com/consul/tutorials/get-started-vms
原文链接: https://dashen.tech/2024/10/11/Consul的搭建和使用/
版权声明: 转载请注明出处.