Consul是HashiCorp开源的分布式服务发现与配置管理工具,提供服务注册、健康检查、KV存储和多数据中心支持。在微服务架构和DevOps实践中,Consul作为服务注册中心解决了服务间动态寻址问题,配合健康检查机制实现自动故障摘除,是容器编排场景中替代硬编码地址的关键基础设施组件。
Consul集群架构与Server/Agent部署
Consul采用Gossip协议进行成员管理和故障检测,使用Raft协议保证强一致性。集群节点分为Server和Client两种角色:Server节点参与Raft共识和数据存储(建议3或5个节点),Client节点轻量级运行在应用主机上转发请求。
以下是在三台服务器上部署Consul Server集群的配置。每台Server节点配置如下:
# server.hcl - Consul Server节点配置
datacenter = "dc1"
data_dir = "/opt/consul/data"
server = true
bootstrap_expect = 3
bind_addr = "{{ GetInterfaceIP "eth0" }}"
client_addr = "0.0.0.0"
advertise_addr = "{{ GetInterfaceIP "eth0" }}"
raft_protocol = 3
performance = {
raft_multiplier = 1
}
verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
ca_file = "/opt/consul/tls/ca.crt"
cert_file = "/opt/consul/tls/server.crt"
key_file = "/opt/consul/tls/server.key"
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
connect = {
enabled = true
}
ports = {
grpc = 8502
grpc_tls = 8503
}
log_level = "INFO"
log_file = "/var/log/consul/"
log_rotate_bytes = 10485760
log_rotate_duration = "24h"
使用systemd管理Consul Server进程:
# /etc/systemd/system/consul.service
[Unit]
Description=Consul Server
After=network-online.target
Wants=network-online.target
[Service]
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/opt/consul/config
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Client节点配置更简单,去掉server和bootstrap_expect即可。Client启动后自动通过Gossip协议发现集群并加入。
服务注册与健康检查配置
服务可以两种方式注册到Consul:配置文件声明和HTTP API动态注册。配置文件方式适合静态服务,API方式适合容器化动态服务。
配置文件方式注册服务:
{
"services": [
{
"id": "web-1",
"name": "webapp",
"tags": ["v2", "primary"],
"address": "192.168.1.10",
"port": 8080,
"meta": {
"version": "2.1.0",
"team": "frontend"
},
"checks": [
{
"id": "web-http",
"name": "HTTP Health Check",
"http": "http://192.168.1.10:8080/health",
"method": "GET",
"interval": "10s",
"timeout": "3s",
"deregister_critical_service_after": "30s"
},
{
"id": "web-tcp",
"name": "TCP Port Check",
"tcp": "192.168.1.10:8080",
"interval": "5s",
"timeout": "1s"
}
]
}
]
}
HTTP API动态注册方式:
import requests
import json
CONSUL_URL = "http://consul-server:8500/v1"
def register_service(service_id, name, address, port, tags=None):
payload = {
"ID": service_id,
"Name": name,
"Address": address,
"Port": port,
"Tags": tags or [],
"Check": {
"HTTP": f"http://{address}:{port}/health",
"Interval": "10s",
"Timeout": "3s",
"DeregisterCriticalServiceAfter": "30s"
}
}
resp = requests.put(
f"{CONSUL_URL}/agent/service/register",
json=payload
)
return resp.status_code == 200
def deregister_service(service_id):
resp = requests.put(
f"{CONSUL_URL}/agent/service/deregister/{service_id}"
)
return resp.status_code == 200
def discover_service(name, healthy_only=True):
params = {}
if healthy_only:
params["filter"] = "Checks[0].Status == 'passing'"
resp = requests.get(
f"{CONSUL_URL}/health/service/{name}",
params=params
)
services = []
for entry in resp.json():
svc = entry["Service"]
services.append({
"id": svc["ID"],
"address": svc["Address"],
"port": svc["Port"],
"tags": svc.get("Tags", [])
})
return services
Consul Template实现动态配置渲染
Consul Template监控Consul KV或服务列表变化,自动渲染配置文件并触发服务重载。这在Nginx动态upstream配置场景中非常实用——当服务实例上下线时,Nginx配置自动更新。
# nginx-upstream.ctmpl
upstream backend {
{{ range service "webapp" }}
server {{ .Address }}:{{ .Port }} weight=5 max_fails=3 fail_timeout=30s;
{{ end }}
}
{{ key "nginx/worker_processes" | default "auto" }}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
运行Consul Template并配置自动重载:
consul-template -consul-addr="http://consul-server:8500" -template="/etc/consul-template/nginx-upstream.ctmpl:/etc/nginx/conf.d/upstream.conf:nginx -s reload" -log-level=info
Watch机制与事件通知集成
Consul的Watch机制可以监控服务或KV的变化并触发外部脚本,常用于与CI/CD流水线集成实现自动扩缩容:
{
"watches": [
{
"type": "service",
"service": "webapp",
"state": "critical",
"handler": "/opt/scripts/handle_service_failure.sh"
},
{
"type": "keyprefix",
"prefix": "config/",
"handler": "/opt/scripts/reload_config.py"
}
]
}
当服务健康检查失败时,handler脚本可以调用告警系统发送通知或触发自动修复流程。这种机制使得Consul不仅是服务注册中心,还能作为运维自动化的事件驱动引擎。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/consul-fu-wu-fa-xian-yu-kv-pei-zhi-guan-li-wei-fu-wu-zhu-ce/