博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习Docker Consul工具一篇就够了!!!
阅读量:2026 次
发布时间:2019-04-28

本文共 9048 字,大约阅读时间需要 30 分钟。

文章目录

一、Consul 理论知识

1.1、Consul 简介

Consul 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。

主要特性:

  • Consul 支持健康检查,并允许 HTTP 、GRPC 和 DNS 协议调用 API 存储键值对。
  • 一致性协议采用 Raft 算法,用来保证服务的高可用。 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制。
    在这里插入图片描述

consul的实例叫agent,agent有两种运行模式:server和client 。

官方建议每个Consul Cluster数据中心至少有3个或以上的运行在Server Mode的Agent,Client节点不限。

1.2、Consul 使用场合

  • Docker 容器的注册与配置共享
  • Coreos 实例的注册与配置共享
  • SaaS 应用的配置共享、服务发现和健康检查。
  • vitess 集群
  • 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件

1.3、Consul 优势

  • 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。相比较而言,zookeeper 采用的是 Paxos,而 etcd
    使用的则是 Raft。
  • 支持 多数据中心,内外网的服务采用不同的端口进行监听。
    多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等. zookeeper 和 etcd
    均不提供多数据中心功能的支持。
  • 支持 健康检查。 etcd 不提供此功能。
  • 支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。
  • 官方提供 WEB管理界面,etcd 无此功能。

1.4、consul 端口

端口 说明
TCP/8300 8300
TCP/UDP/8301 8301端口用于单个数据中心所有节点之间的互相通信,即对LAN池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举时间)。
TCP/UDP/8302 8302端口用于单个或多个数据中心之间的服务器节点的信息同步,即对WAN池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。
8500 8500端口基于HTTP协议,用于API接口或web UI访问
8600 8600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息

二:基于Docker的Consul服务搭建

2.1、环境准备

在这里插入图片描述

主机 主机IP 安装工具
consul服务器 192.168.158.10 Docker、Consul、Consul-template模板、nginx代理服务
容器服务器 192.168.158.20 Docker、registrator、nginx容器

2.2、部署Consul服务

//先创建一个目录 mkdir /root/consulcd /root/consul
[root@server1 consul]# lsconsul-template_0.19.3_linux_amd64.zipconsul_0.9.2_linux_amd64.zip  nginx-1.12.2.tar.gz
unzip consul_0.9.2_linux_amd64.zip//使 consul 命令可以在任何目录下识别 mv consul /usr/bin[root@server1 consul]# consul agent \-server \-bootstrap \-ui \-data-dir=/var/lib/consul-data \-bind=192.168.158.10 \-client=0.0.0.0 \-node=consul-server01 &> /var/log/consul.log &[1] 19458[root@server1 consul]# netstat -natp | grep 8500tcp6       0      0 :::8500                 :::*                    LISTEN      19458/consul  #consul服务已经启动
#查看群集信息[root@server1 consul]# consul membersNode             Address              Status  Type    Build  Protocol  DCconsul-server01  192.168.158.10:8301  alive   server  0.9.2  2         dc1[root@server1 consul]# consul info | grep leader	leader = true	leader_addr = 192.168.158.10:8300

2.3:通过 httpd api 可以获取集群信息:

[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 服务信息

2.4:容器服务自动加入nginx集群

在容器服务器上安装 gliderlabs/registrator

  • 检查容器运行状态
  • 自动注册和注销docker容器的服务到服务配置中心
docker run -d \--name=registrator \--net=host \-v /var/run/docker.sock:/tmp/docker.sock \--restart=always \gliderlabs/registrator:latest \-ip=192.168.158.20 \                consul://192.168.158.10:8500

创建两个容器

docker run -dit -p:83:80 --name tom1 -h tom-01 nginxdocker run -dit -p:84:80 --name tom2 -h tom-02 nginx

验证nginx服务是否注册到consul

浏览器访问:192.168.158.10:8500

点击“NODES”----》“consurl-serve01”会出现刚刚创建的两个服务

在这里插入图片描述

三:安装 consul-template工具

Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上系统上任意数量的指定模板,生成配置文件。更新完成后,可以选择允许shell命令执行更新,重新加载Nginx。Consul-Template可以查询Consul中的服务目录,Key、Key-Values等,这种抽象的功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件

3.1:准备template nginx模板文件

在consul上操作

[root@server1 ~]# vi consul/nginx.ctmpl upstream http_backend {
{
{
range service "nginx"}} server {
{
.Address}}:{
{
.Port}}; {
{
end}}}server {
listen 83; server_name localhost 192.168.158.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; } }

3.2:编译安装一个nginx服务【做反向代理】

#安装环境[root@localhost ~]# yum install gcc gcc-c++ pcre pcre-devel zlib-devel -y[root@localhost ~]# cd /opt[root@localhost opt]# lscontainerd  mei  nginx-1.12.0.tar.gz  rh#解压缩[root@localhost opt]# tar zxvf nginx-1.12.0.tar.gz cd nginx-1.12.0/[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx#编译及安装[root@localhost nginx-1.12.0]# make && make install#创建启动软连接ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3.3:配置nginx

2.31:配置nginx#在http模板添加虚拟主机目录[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.confhttp {
include mime.types; include vhost/*.conf; #加虚拟主机目录' default_type application/octet-stream;

在这里插入图片描述

创建虚拟主机目录[root@server1 ~]# mkdir /usr/local/nginx/conf/vhost创建日志文件目录[root@server1 ~]# mkdir /var/log/nginx
  • 启动nginx
[root@server1 ~]# /usr/local/nginx/sbin/nginx[root@server1 ~]# netstat -anpt |grep nginxtcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22384/nginx: master

3.4:配置并启动template

#进入consul解压缩包[root@localhost ~]# cd consul/[root@localhost consul]# lsconsul_0.9.2_linux_amd64.zip            nginx.ctmplconsul-template_0.19.3_linux_amd64.zip[root@localhost consul]# unzip consul-template_0.19.3_linux_amd64.zip 复制到/bin目录下,方便直接使用[root@localhost consul]# mv consul-template /usr/local/bin/
consul-template -consul-addr 192.168.158.10:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tom.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info '//会进入监控状态'/root/consul/nginx.ctmpl:template        模板文件目录/usr/local/nginx/conf/vhost/tom.conf    文件生成的路径 【生成到vhost中】/usr/local/nginx/sbin/nginx -s reload     重载服务配置 log-level=info                            日志级别

3.4:添加一个容器测试

[root@client1 ~]# docker run -dit -p:121:80 --name tom121-h tom-121 nginx9cda804b7d1fae290aff4f4c47417ac43c7276e5f71ec45025a2028713145ec8

在这里插入图片描述

自动添加负载
在这里插入图片描述

3.5:添加一个nginx容器节点

为了展示轮询处理请求,可以用logs命令,来查看三台nginx容器的容器日志,

都会显示来自同一IP地址的访问

#查看tom1同样没有访问日志[root@client1 ~]# docker logs -f tom1/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d//docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh/docker-entrypoint.sh: Configuration complete; ready for start up#查看tom2同样没有访问日志[root@client1 ~]# docker logs -f tom2/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d//docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh/docker-entrypoint.sh: Configuration complete; ready for start up

3.6:我们去刷新几次nginx首页192.168.158.10:83;并查看日志

[root@client1 ~]# docker logs -f tom1192.168.158.10 - - [01/Dec/2020:02:52:02 +0000] "GET / HTTP/1.0" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"192.168.158.10 - - [01/Dec/2020:02:52:04 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"[root@client1 ~]# docker logs -f tom2192.168.158.10 - - [01/Dec/2020:02:53:50 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"192.168.158.10 - - [01/Dec/2020:02:53:50 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"[root@client1 ~]# docker logs -f tom4192.168.158.10 - - [01/Dec/2020:02:52:04 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"192.168.158.10 - - [01/Dec/2020:02:53:50 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "-"

3.7:新增一个Apache容器节点,测试服务器发现及配置更新功能

[root@client1 ~]# docker run -itd -p:87:80 --name tom11 -h tom-11 nginx

在这里插入图片描述

四:多节点加入

consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.158.20  -client=0.0.0.0 -node=consul-server02 -enable-script-checks=true -datacenter=dc1 -join 192.168.158.10 & > /var/log/consul.log &

在这里插入图片描述

项目资源

consul-template_0.19.3_linux_amd64.zipconsul_0.9.2_linux_amd64.zipnginx-1.12.0.tar.gz链接: https://pan.baidu.com/s/1CzumDgfpoOXVi_8mqITtRg 提取码: tyv2

如果对您有帮助的话,给个三联吧

转载地址:http://lfdaf.baihongyu.com/

你可能感兴趣的文章
前端经典面试题:行内元素与块级元素比区别
查看>>
CSS float 属性——清除浮动
查看>>
jQuery解决input中placeholder值在ie中无法支持的问题
查看>>
腾讯QQ和淘宝旺旺在线客服代码
查看>>
js判断是否获得焦点
查看>>
[Java] I/O底层原理之一:字符流、字节流及其源码分析
查看>>
Java中的关键字 transient
查看>>
Java—Object对象和Collection对象的toString()方法
查看>>
Java泛型的学习和使用
查看>>
代码整洁之道——最佳实践小结
查看>>
代码整洁 vs 代码肮脏
查看>>
svn更新失败提示cleanup的解决方法
查看>>
SecureCRT中文乱码问题的解决
查看>>
java rmi 使用教程【一】
查看>>
java rmi 使用教程【二】
查看>>
java rmi 使用教程【三】
查看>>
java RMI原理
查看>>
一文深度揭秘Redis的磁盘持久化机制
查看>>
DataGrip常用的快捷键总结2
查看>>
什么是编译型语言和解释型语言
查看>>