微服务之 Consul 集群搭建
简介⌗
Consul 是基于 Golang 开发的 Service Mesh 解决方案,提供了功能齐全的控制平面。具有服务发现、配置管理和分割等功能。这些特性可以根据需要单独使用,也可以一起用于构建完整的服务网格。
它内置了简单的服务代理,当然你可以可以选择使用其他第三方的代理,如 Envoy 代理。
配合 HashiCorp 开发的其他 Micro Service 生态工具集成,可以让用户更加简单的落地微服务。
功能介绍⌗
服务发现⌗
Consul 允许某个服务注册到数据中心,如 API 或 MySQL 等,其他客户端可以使用 Consul 来发现服务,使用内建的 DNS 可以更好的找到所依赖的服务。
健康检查⌗
Consul 可以提供服务的健康检查,管理员可以通过这个功能及时的获取集群的健康状况,同时服务发现组件可以通过该功能,避免流量被路由到无法提供服务的节点。
K/V 存储⌗
Consul 提供了分布式的 K/V 存储功能,该功能可以适用于动态配置
,特性标记
,分布式锁
以及集群 Leader 的选举
等,并且提供了易于使用的 HTTP API。
安全服务通信⌗
Consul 可以为服务颁发 TLS 证书,以建立相互的 TLS 连接。
多数据中心⌗
Consul 支持多个数据中心的连接,即使规模庞大的企业,也可以轻松用它来构建自己的基础设施。
安装⌗
需要使用的端口⌗
端口号 | 说明 |
---|---|
8600 | DNS 服务(TCP&UDP) |
8500 | HTTP 服务(TCP) |
8301 | Serf 内网端口(TCP&UDP) |
8302 | Serf 公网端口(TCP&UDP) |
8300 | RPC(TCP) |
21000~21255 | 自动分配服务 Sidecar 代理的端口 |
考虑到实验环境的问题我这里采用 Docker 来部署 Consul 集群,如果你打算在多个节点上部署,配置和命令都差不多,只不过可能无需创建 Network。
Docker Step by step⌗
创建一个网络环境
$ docker network create betterde --subnet 10.0.0.0/28 --gateway 10.0.0.14
创建 ACL 配置文件
$ mkdir -p /etc/consul/conf.d
$ touch /etc/consul/conf.d/server.json
将如下配置写入 /etc/consul/conf.d/server.json,这里的 acl.tokens.master
是用于访问的凭证,你可以替换成自己的 Token。
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache",
"tokens": {
"master": "508hFauW5uEc11SegVpK0fQlBhDEBiLZSpOCG+2gbeM"
}
}
}
获取最新的镜像
$ docker pull consul:latest
运行 Consul 节点
$ docker run -d \
-h consul-1 \
--name consul-1 \
--net=betterde --ip 10.0.0.1 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.1 -datacenter=betterde -bind=10.0.0.1 \
-ui -client=0.0.0.0 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d
$ docker run -d \
-h consul-salver-1 \
--name consul-salver-1 \
--net=betterde --ip 10.0.0.2 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.2 -datacenter=betterde -bind=10.0.0.2 \
-ui -join=10.0.0.1 -retry-join=10.0.0.1 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d
$ docker run -d \
-h consul-salver-2 \
--name consul-salver-2 \
--net=betterde --ip 10.0.0.3 \
-v /etc/consul/conf.d:/etc/consul/conf.d
consul agent -server -node=10.0.0.3 -datacenter=betterde -bind=10.0.0.3 \
-ui -join=10.0.0.1 -retry-join=10.0.0.1 -bootstrap-expect=3 -config-dir=/etc/consul/conf.d
需要注意的是,为了避免脑裂
-bootstrap-expect=3
参数必须一致。
创建 /var/local/web/nginx.conf
配置文件
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 102400;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream consul {
server consul-4:8500;
}
server {
listen 80 default_server;
server_name _;
access_log /web/logs/consul/access.log;
error_log /web/logs/consul/error.log;
root html;
location / {
proxy_pass http://consul;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
创建目录
$ mkdir -p /var/local/web/logs/consul
运行 Nginx 容器
$ docker run -p 80:80 --name nginx --hostname nginx \
--net betterde --ip 10.0.0.253 \
-v /var/local/web/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /var/local/web/logs:/web/logs -d nginx:latest
Docker Compose⌗
另外我还提供了一个使用 Docker Compose 方式来启动集群的仓库
启动方式:
$ git clone [email protected]:betterde/architecture.git
$ cd architecture/consul
$ docker-compose up -d
如果不出意外的话,此时访问 http://consul.betterde.com (在配置文件中替换成你自己的域名) 就可以看到 Consul 的 Web UI 了。
因为开启了 ACL 所以,第一次访问需要点击 ACL 将
server.json
中的acl.tokens.master
输入并进行验证,然后刷新浏览器,这样偶能正常访问数据了。
接下来我将会发布更多的文章介绍 Consul 在不同场景下的使用方式,敬请期待!
I hope this is helpful, Happy hacking…