docker + consul + nginx集成分布式架构

目录

  • 一、Docker Consul容器服务更新理论
    • 1.1 基本架构
    • 1.2 基于nginx和consul构建高可用及自动发现的Docker服务架构
    • 1.3 Docker consul自动发现服务架构的构建
    • 1.4 Consul-template相关参数
  • 二、Consul集群搭建
    • 2.1 案例环境
    • 2.2 环境搭建
      • 2.2.1 Consul搭建
      • 2.2.2 开启监听
    • 2.3 结果验证

一、Docker Consul容器服务更新理论

Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键功能:

服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。

健康检查: Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。

键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。

多数据中心: Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。

1.1 基本架构

docker + consul + nginx集成分布式架构_第1张图片

注册中心: 每个服务提供者向注册中心登记自己的服务,将服务名与主机Ip,端口等一些附加信息告诉注册中心,注册中心按服务名分类组织服务清单。

1.2 基于nginx和consul构建高可用及自动发现的Docker服务架构

docker + consul + nginx集成分布式架构_第2张图片

上方拓扑图是基于Docker完成的,然后将consul、consul template、registrator和nginx组装成一个值得信任且可扩展的服务框架,此架构可以灵活的、不需要重启任何服务、不需要重写任何配置的添加和移除服务

拓扑图解释

consul template:配置文件模板

registrator:注册机制

consul server:consul服务

例如:当后方增加了一个容器时,容器会注册registrator,registrator发现增加了一个容器的时候,会通知consul server要更新,consul server使用consul template模板更新

1.3 Docker consul自动发现服务架构的构建

  1. 每个提供服务的节点上都要部署和运行consul的agent
  2. consul agent有两种运行模式:server和client
  3. server和client只是consul集群层面的区分,与搭建在cluster之上的应用服务无关

1.4 Consul-template相关参数

参数 作用
-auth= 设置基本的认证用户名和密码
-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集群搭建

2.1 案例环境

主机 IP 软件
consul 10.0.0.101 Docker、Docker-Compose、Consul、Consul-template
docker 10.0.0.102 Docker、Registrator

2.2 环境搭建

2.2.1 Consul搭建

  • consul服务器
# 安装consul
[root@consul ~]# mkdir /root/consul
[root@consul ~]# mv consul_0.9.2_linux_amd64.zip consul
[root@dconsul ~]# cd consul
[root@dconsul  consul]# unzip consul_0.9.2_linux_amd64.zip 
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul                  
[root@dconsul  consul]# mv consul /usr/local/bin/

# 使用agent代理功能
[root@consul ~]# consul agent -server \
> -bootstrap \	# 选举领袖
> -ui \			# 提供web访问页面
> -data-dir=/var/lib/consul-data \
> -bind=10.0.0.101 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &  
[1] 59971

# 查看运行情况及集群信息
[root@consul ~]# jobs
[1]+  Running                 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.0.0.101 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
[root@consul ~]# consul members
Node             Address          Status  Type    Build  Protocol  DC
consul-server01  10.0.0.101:8301  alive   server  0.9.2  2         dc1
[root@consul ~]# consul info | grep leader
	leader = true
	leader_addr = 10.0.0.101:8300

# 通过httpd api 获取集群信息
[root@consul ~]# curl localhost:8500/v1/status/peers
[root@consul ~]# curl localhost:8500/v1/status/leader
[root@consul ~]# curl localhost:8500/v1/catalog/services
[root@consul ~]# curl localhost:8500/v1/catalog/nginx
[root@consul ~]# curl localhost:8500/v1/catalog/nodes
[root@consul ~]# curl localhost:8500/v1/catalog/nodes
[{"ID":"66e72c06-4aee-927a-5efa-067abb8b6b77","Node":"consul-server01","Address":"10.0.0.101","Datacenter":"dc1","TaggedAddresses":{"lan":"10.0.0.101","wan":"10.0.0.101"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]

docker + consul + nginx集成分布式架构_第3张图片

  • docker服务器
# 安装registrator
[root@docker ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=10.0.0.102 \
> consul://10.0.0.101:8500

# 安装两个httpd以及nginx容器
[root@docker ~]# docker run -dit -P --name httpd-1 -h test01 d9a93e49fff2a987b01a9db4e3a5a498014268773046eae90db696814c057094
[root@docker ~]# docker run -dit -P --name httpd-2 -h test02 httpd 
4a4bdd5bceab586b586189e3c8c243fe95c18fe54d213fc0bab30e77e86bcdf7
[root@docker ~]# docker run -dit -P --name nginx-1 -h test03 nginx
d8acf2e77c12d8c8bc93a9475d2e2924103a8d078c1b5ed24648b03042fc045f
[root@docker ~]# docker run -dit -P --name nginx-2 -h test04 nginx 
db162f576a3afa14e9c95a2426588a671a687fac792e1adaa201bf0e23b13bb0

docker + consul + nginx集成分布式架构_第4张图片

2.2.2 开启监听

# 编辑 template nginx 模板文件
[root@consul ~]# vi consul/nginx.ctmpl

upstream http_backend {
   {
    {range service "nginx"}}
    server {
    {.Address}}:{
    {.Port}};			# 指定服务器
     {
    {end}}
}

server {
  listen 1818;
  server_name localhost 10.0.0.101
  access_log /var/log/nginx/chu.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-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
  }
}

# 安装nginx
[root@consul ~]# tar zxf nginx-1.12.2.tar.gz -C /opt
[root@consul ~]# cd /opt/nginx-1.12.2/
[root@consul nginx-1.12.2]# ./configure --prefix=/usr/local/nginx && make && make install

# 在nginx里添加关联文件
[root@consul ~]# vi /usr/local/nginx/conf/nginx.conf
    include       mime.types;
    include       vhost/*.conf;			# 添加conf文件夹下vhost文件夹的所有文件
    default_type  application/octet-stream;
    
# 配置consul-template启动
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip -d /usr/local/bin
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: /usr/local/bin/consul-template
[root@consul ~]# consul-template -consul-addr 10.0.0.101:8500 \			# 设置监听Consul的地址
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/chu.conf:/usr/local/nginx/sbin/nginx -s reload" \		#  增加一个需要监控的模板,格式是:'templatePath:outputPath(:command)',多个模板则可以设置多次
--log-level=info
2020/12/01 06:13:22.934652 [INFO] consul-template v0.19.3 (ebf2d3d)
2020/12/01 06:13:22.934679 [INFO] (runner) creating new runner (dry: false, once: false)
2020/12/01 06:13:22.935082 [INFO] (runner) creating watcher
2020/12/01 06:13:22.935416 [INFO] (runner) starting
2020/12/01 06:13:22.935454 [INFO] (runner) initiating run
2020/12/01 06:13:22.941201 [INFO] (runner) initiating run


# 观察nginx里的vhost文件夹
[root@consul ~]# cat /usr/local/nginx/conf/vhost/chu.conf 
upstream http_backend {
   
    server 10.0.0.102:32768;
     
    server 10.0.0.102:32769;
     
}

server {
  listen 1818;
  server_name localhost 10.0.0.101
  access_log /var/log/nginx/chu.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-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
  }
}

[root@consul ~]# netstat -antp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4086/nginx: master  
tcp        0      0 0.0.0.0:1818            0.0.0.0:*               LISTEN      4086/nginx: master 

2.3 结果验证

使用其他机器访问

docker + consul + nginx集成分布式架构_第5张图片

# docker服务器查看日志
[root@docker ~]# docker logs -f nginx-1

docker + consul + nginx集成分布式架构_第6张图片

添加一台服务器,查看是否会自动添加

docker服务器

[root@docker ~]# docker run -d -P --name nginx-3 nginx
e2211601f3f7f0b0c54ba12f75fd68f5dbec6103907bed37c1da1295816276fa

Consul服务器

[root@consul ~]# cat /usr/local/nginx/conf/vhost/chu.conf 
upstream http_backend {
   
    server 10.0.0.102:32769;
     
    server 10.0.0.102:32768;
     
    server 10.0.0.102:32772;
     
}

server {
  listen 1818;
  server_name localhost 10.0.0.101
  access_log /var/log/nginx/chu.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-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
  }
}

docker + consul + nginx集成分布式架构_第7张图片

docker + consul + nginx集成分布式架构_第8张图片

你可能感兴趣的:(Docker,Web服务器,群集,运维,docker,nginx,consul,负载均衡)