目录
- 一、Consul 简介
- 二、Consul 特点
- 三、Consul容器服务更新理论
- 四、Docker consul自动发现服务架构的构建
- 五、Consul-template参数
- 六、consul 端口
- 七、搭建 consul 集群
- 八、安装 consul-template工具
一、Consul 简介
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。
二、Consul 特点
● Consul 支持健康检查,并允许 HTTP 、GRPC 和 DNS 协议调用 API 存储键值对。
● 一致性协议采用 Raft 算法,用来保证服务的高可用。 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制。
● 方便部署,与 Docker 等轻量级容器可无缝配合。
三、Consul容器服务更新理论
Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键功能:
● 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
● 健康检查: Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
● 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
● 多数据中心: Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。
四、Docker consul自动发现服务架构的构建
- 每个提高服务的节点上都需要部署和运行 consul 的 agent
- Consul agent 两种运行模式:server; client;
- server 与 client 只是 consul 群集层面的区分,与搭建在 cluster之上的应用服务无关。
五、Consul-template参数
参数 | 说明 |
-auth=<user[:pass]> | 设置基本的认证用户名和密码 |
-consul= | 设置Consul实例的地址 |
-max-stale= | 查询过期的最大频率,默认是1s |
-dedup | 启用重复数据删除,当许多consul template实例渲染一个模板的时候可以降低consul的负载 |
-ssl | 使用https连接Consul使用SSL |
-ssl-verify | 通过SSL连接的时候检查证书 |
-ssl-cert | SSL客户端证书发送给服务器 |
-ssl-key | 客户端认证时使用的SSL/TLS私钥 |
-ssl-ca-cert | 验证服务器的CA证书列表 |
-token= | 设置Consul API的token |
-syslog | 把标准输出和标准错误重定向到syslog,syslog的默认级别是local0 |
-syslog-facility= | 设置syslog级别,默认是local0,必须和-syslog配合使用 |
-template= | 增加一个需要监控的模板,格式是:‘templatePath:outputPath(:command)’,多个模板则可以设置多次 |
-wait= | 当呈现一个新的模板到系统和触发一个命令的时候,等待的最大最小时间。如果最大值被忽略,默认是最小值的4倍 |
-retry= | 当在和consul api交互的返回值是error的时候,等待的时间,默认是5s |
-config= | 配置文件或者配置目录的路径 |
-pid-file= | PID文件的路径 |
-log-level= | 设置日志级别,可以是"debug",“info”, “warn” (default), and “err” |
-dry | Dump生成的模板到标准输出,不会生成到磁盘 |
-once | 运行consul-template一次后退出,不以守护进程运行 |
-reap | 子进程自动收割 |
六、consul 端口
端口 | 说明 |
TCP/8300 | 8300 |
TCP/UDP/8301 | 8301端口用于单个数据中心所有节点之间的互相通信,即对LAN池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举时间)。 |
TCP/UDP/8302 | 8302端口用于单个或多个数据中心之间的服务器节点的信息同步,即对WAN池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。 |
8500 | 8500端口基于HTTP协议,用于API接口或web UI访问 |
8600 | 8600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息 |
七、搭建 consul 集群
服务器 | IP地址 | 需要安装的软件 |
nginx代理服务器 | 192.168.112.10 | Docker-ce 、Docker-Compose、Consul、Consul-template |
节点服务器 | 192.168.112.20 | Docker-ce |
● 配置 consul 服务器
[root@localhost ~]# mkdir consul
[root@localhost ~]# cd consul/
[root@localhost consul]# ls
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip nginx-1.12.2.tar.gz
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zip
inflating: consul
[root@localhost consul]# ll
总用量 55364
-rwxr-xr-x. 1 root root 42777946 8月 10 2017 consul
-rw-r--r--. 1 root root 10233177 11月 30 13:55 consul_0.9.2_linux_amd64.zip
-rw-r--r--. 1 root root 2694811 11月 30 13:55 consul-template_0.19.3_linux_amd64.zip
-rw-r--r--. 1 root root 981687 10月 14 11:18 nginx-1.12.2.tar.gz
[root@localhost consul]# mv consul /usr/bin/#便于系统识别
#安装 Consul 服务
[root@localhost consul]# consul agent \
> -server \ #服务功能
> -bootstrap \ #参与选举
> -ui \ #提供web界面
> -data-dir=/var/lib/consul-data \ #提供一个代理存储数据目录
> -bind=192.168.112.10 \ #绑定本地地址
> -client=0.0.0.0 \ #监控的地址,所有网段
> -node=consul-server01 &> /var/log/consul.log &#定义节点名称,日志混合输出到log,并且放到后台运行
[1] 47557
[root@localhost consul]# netstat -anpt | grep 8500
tcp6 0 0 :::8500 :::* LISTEN 47557/consul
● 查看集群信息
[root@localhost consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.112.10:8301 alive server 0.9.2 2 dc1
[root@localhost consul]# consul info | grep leader#查看管理信息
leader = true
leader_addr = 192.168.112.10:8300
● consul常用操作查看命令
[root@localhost consul]# consul members#查看集群信息
[root@localhost consul]# consul info | grep leader#查看管理信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/peers#查看群集server成员
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/leaders#群集中 Raf leader
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services#查看注册的所有服务
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes#群集节点详细信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nginx#查看 nginx 服务的信息
● 让容器服务自动加入 nginx 群集
配置192.168.112.20 节点
[root@client ~]# docker run -d \
> --name=registrator \ #定义容器名称
> --net=host \ #定义网络
> -v /var/run/docker.sock:/tmp/docker.sock \ #指定数据卷,存储信息
> --restart=always \
> gliderlabs/registrator:latest \ #定义镜像
> -ip=192.168.112.20 \ #指定本地地址
> consul://192.168.112.10:8500#指定consul管理节点地址、端口
● 测试服务、功能是否都正常
[root@client ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
852e50cd189d: Pull complete
571d7e852307: Pull complete
addb10abd9cb: Pull complete
d20aa7ccdb77: Pull complete
8b03f1e11359: Pull complete
Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
Status: Downloaded newer image for nginx:latest
8fd44ce5646726d5ec71d0f02554d540606a6c2f6dc69fe35e2d07235e961367
[root@client ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx
f7c9101d64fc2f564c591144514bbba332609d581e7c4b7ec14d4f5f9a4de9b5
[root@client ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c9101d64fc nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:84->80/tcp test-02
8fd44ce56467 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:83->80/tcp test-01
7373cf5983af gliderlabs/registrator:latest "/bin/registrator -i…" 11 minutes ago Up 11 minutes registrator
● 刷新
八、安装 consul-template工具
● consul-template
- 是基于 Consul 的自动替换配置文件的应用
- 可以查询 Consul 中的服务目录:Key、Key-values等
- 特别适合动态的创建配置文件
- 是一个守护进程,用于实时查询 consul 集群信息
● 准备 template nginx 模板文件
#在consul服务器上创建一个模板文件
[root@localhost ~]# vim consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 83;
server_name localhost 192.168.112.10;
access_log /var/log/nginx/tom.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
:wq
● 编译安装一个 nginx 服务
[root@localhost ~]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@localhost ~]# cd consul/
[root@localhost consul]# ls
consul_0.9.2_linux_amd64.zip nginx-1.12.2.tar.gz
consul-template_0.19.3_linux_amd64.zip nginx.ctmpl
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt/
[root@localhost consul]# cd /opt/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# make && make install
● 配置nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf;#添加虚拟主机目录
default_type application/octet-stream;
● 创建虚拟主机目录和日志文件目录
[root@localhost ~]# mkdir /usr/local/nginx/conf/vhost
[root@localhost ~]# mkdir /var/log/nginx
● 启动 nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 54114/nginx: master
● 配置并启动 template
[root@localhost ~]# cd /usr/bin/
[root@localhost bin]# rz -E
rz waiting to receive.
[root@localhost bin]# unzip consul-template_0.19.3_linux_amd64.zip
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
● 启动template
[root@localhost ~]# consul-template -consul-addr 192.168.112.10:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/whh.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info#会进入监控状态
/root/consul/nginx.ctmpl#模板文件目录
/usr/local/nginx/conf/vhost/whh.conf#文件生成的路径(生成到vhost中)
/usr/local/nginx/sbin/nginx -s reload#重载服务配置
log-level=info#日志级别
● 有日志文件生成
[root@localhost ~]# cd /var/log/nginx/
[root@localhost nginx]# ls
tom.cn-access.log
● 在服务端添加一个容器测试
[root@client ~]# docker run -itd -p:85:80 --name test-03 -h test03 nginx
e74df5e3adcfd7b20e9a6157f39d725e19265f50480d657cd89aab404e91704e
[root@client ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e74df5e3adcf nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:85->80/tcp test-03
f7c9101d64fc nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp test-02
8fd44ce56467 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:83->80/tcp test-01
7373cf5983af gliderlabs/registrator:latest "/bin/registrator -i…" 2 hours ago Up 2 hours registrator
[root@client ~]#
● 监控信息变化
● 删除一个容器
[root@client ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e74df5e3adcf nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:85->80/tcp test-03
f7c9101d64fc nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp test-02
8fd44ce56467 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:83->80/tcp test-01
7373cf5983af gliderlabs/registrator:latest "/bin/registrator -i…" 2 hours ago Up 2 hours registrator
[root@client ~]# docker stop 8fd44ce56467
8fd44ce56467
[root@client ~]# docker rm 8fd44ce56467
8fd44ce56467
[root@client ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e74df5e3adcf nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:85->80/tcp test-03
f7c9101d64fc nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:84->80/tcp test-02
7373cf5983af gliderlabs/registrator:latest "/bin/registrator -i…" 2 hours ago Up 2 hours registrator
[root@client ~]#
● 配置文件变化