Docker Consul 容器自动更新与发现

一、Docker Consul 介绍

1.1 Consul 概述,什么是 Consul ?

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

  • 也可以说 Consul 是一个分布式、高可用的系统,用于实现分布式系统的服务发现与配置。
    它有多个组件,提供如下几个关键功能:

    • ① 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
    • ② 健康检查:Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
    • ③ 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
    • ④ 多数据中心:Consul队多数据中心有着非常好的支持,这意味着Consul用户不用担心由于创建更多抽象层而产生多个区域

1.2 Consul 特点与作用

1.2.1 特点

  • 支持健康检查,允许存储键值对;
  • 一致性协议采用Raft算法,用来保证服务高可用;
  • 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制;
  • 方便部署,与Docker等轻量级容器可无缝配合。

1.2.2 作用

  • 现在企业应用都向微服务化方向发展,当把我们的系统功能拆分成一个一个的微服务后,存在以下问题:
    • ① 需要配置N个服务的网络位置,加大配置的复杂性
    • ② 服务的网络位置变化,都需要改变每个调用者的配置
    • ③ 集群的情况下,除了反向代理方式,难以做负载

1.3 为什么需要 Consul

  • 在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性

二、Consul 一些基本概念

① Client

  • 表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群。

② Server

  • 表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个。

③ Server-leader

  • 表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader 出来。

④ Agent

  • Agent 是 Consul 的核心进程,Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程;

注意:

  • server 与 client 只是 consul 群集层面的区分,与搭建在 cluster 之上的应用服务无关。

三、Consul 与 etcd 的区别

1.consul 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。
相比较而言,zookeeper 采用的是 Paxos,而 etcd使用的则是 Raft。

2.consul 支持 多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等。
zookeeper 和 etcd 均不提供多数据中心功能的支持。

3.consul 支持 健康检查。 etcd 不提供此功能。

4.consul 支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。\

5.consul 官方提供 WEB管理界面,etcd 无此功能。

补充

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

四、构建Docker consul集群架构

4.1 项目环境

第一台centos 7 IP地址:192.168.140.22		(主节点)
需求的软件包:Docker-ce、Compose、Consul、Consul-template

第二台centos 7 IP地址:192.168.140.21	  (nginx服务器)
需求的软件包:Docker-ce 、registrator

4.2 配置 consul服务器

  • 注意:两个节点都安装需要 Docker-ce,防火墙不要关闭

4.2.1 在主节点上部署consul

  • 创建工作目录,上传并解压相关软件包
[root@docker ~]# mkdir consul
[root@docker ~]# cd consul/
[root@docker consul]# rz -E		//上传压缩包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip
[root@docker consul]# unzip consul_0.9.2_linux_amd64.zip -d /usr/bin		//解压到指定目录
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: /usr/bin/consul
  • 建立Consul 服务
## 设置代理
[root@docker consul]# consul agent \	
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.140.22 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 114525
[root@docker consul]# jobs
[1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.140.22 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
  • 查看集群信息
[root@docker consul]# consul members				//查看集群信息
Node             Address              Status  Type    Build  Protocol  DC
consul-server01  192.168.140.22:8301  alive   server  0.9.2  2         dc1
[root@docker consul]# consul info | grep leader		//查看管理信息
	leader = true
	leader_addr = 192.168.140.22:8300
  • 通过 http api 可以获取到集群信息
curl 127.0.0.1:8500/v1/status/peers '/查看集群server成员'

curl 127.0.0.1:8500/v1/status/leaders '//查看集群Raf leader'

curl 127.0.0.1:8500/v1/catalog/services '//查看注册的所有服务'

curl 127.0.0.1:8500/v1/catalog/nginx '//查看nginx服务的信息'

curl 127.0.0.1:8500/v1/catalog/nodes   '//集群节点详细信息'

4.2.2 后端服务器配置

  • 让容器服务自动加入 nginx 集群
    也就是在nginx服务器上连接consul,创建nginx容器服务
[root@docker consul]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.140.21 \
> consul://192.168.140.22:8500

Unable to find image 'gliderlabs/registrator:latest' locally
latest: Pulling from gliderlabs/registrator
Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
c87f684ee1c2: Pull complete 
a0559c0b3676: Pull complete 
a28552c49839: Pull complete 
Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
Status: Downloaded newer image for gliderlabs/registrator:latest
4bf16763f7f0cbbe66f0e9ea37a8def1b858b0559aba5fac2935446a1cb2847b


查看镜像和容器列表
[root@nginx ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE

[root@nginx ~]# docker ps -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED         STATUS                          PORTS                   NAMES
4bf16763f7f0   gliderlabs/registrator:latest   "/bin/registrator -i…"   2 minutes ago   Restarting (1) 32 seconds ago                           registrator
  • 创建两个nginx容器
[root@nginx ~]# docker run -itd -p 85:80 --name test-01 -h test01 nginx		
//创建容器,用来测试服务发现功能是否正常
[root@nginx ~]# docker run -itd -p:86:80 --name test-02 -h test02 nginx		
//-name 给容器命名;-h 设置容器主机名
  • 访问网址 http://192.168.140.22:8500/
    如果访问失败,需要在主节点上查看防火墙是否开启,可以进行以下配置
[root@docker ~]# systemctl start firewalld.service
[root@docker ~]# firewall-cmd --get-active-zones
public
  interfaces: ens33
[root@docker ~]# firewall-cmd --zone=public --add-port=8500/tcp
success

在这里插入图片描述
在这里插入图片描述
此时表示nginx与httpd服务已注册到consul

4.3 Consul集群添加compose-template

  • 目的:实现容器自动加入Nginx集群

4.3.1 compose-template介绍

  • Consul-Template 是一个守护进程,用户实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成后,可以选择运行shell命令执行更新操作,重新加载Nginx

  • 特点:

1.consul-template是基于Consul的自动替换配置文件的应用

2.可以查询Consul中的服务目录,key、key-values

3.其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,

例如:Nginx/Apache Proxy Balancers、Haproxy Backends

4.3.2 配置思路

  • 思路(以nginx为例):
① 定义template nginx.ctmpl 模板

此配置文件仅与consul有关(consul使用此配置文件模板生成nignx的主配置文件)

② 配置nginx(修改文件,添加配置文件的路径)

③ 启动template(自动生成/更新配置文件供与nginx使用)

4.3.3 配置过程

  • 主节点安装consul-template,准备 Template nginx模板文件
先上传并解压consul-template软件包
[root@docker consul]# rz -E		//上传consul-template软件包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip  consul-template_0.19.3_linux_amd64.zip

[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip -d /usr/bin
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: /usr/bin/consul-template

在consul服务器上编写template nginx模板文件,添加nginx模板
[root@docker consul]# vim nginx.ctmpl

upstream http_backend {
    
    
   {
    
    {
    
    range service "nginx"}}
    server {
    
    {
    
    .Address}}:{
    
    {
    
    .Port}};
     {
    
    {
    
    end}}
}

server {
    
    
  listen 88;
  server_name localhost 192.168.140.22;
  access_log /var/log/nginx/tang.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@docker consul]# yum install gcc gcc-c++ pcre-devel zlib-devel -y

[root@docker consul]# rz -E		//上传Nginx1.12.2软件包

[root@docker consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt

[root@docker consul]# cd /opt/nginx-1.12.2/
[root@docker nginx-1.12.2]# ./configure --prefix=/usr/local/nginx && make && make install	 //编译安装
  • 修改nginx配置文件并启动nginx
[root@docker nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@docker conf]# vim nginx.conf
...//在http模块下 添加
http {
    include       mime.types;
    include       vhost/*.conf;			//添加的配置,且vhost目录需手动创建
...//省略部分信息

[root@docker conf]# mkdir vhost		//创建vhost文件目录
[root@docker conf]# mkdir /var/log/nginx		//创建nginx访问日志目录
[root@docker conf]# ln -s /usr/local/nginx/sbin/nginx /usr/bin		//创建软链接
[root@docker conf]# nginx		//启动nginx
  • 配置、启动Template
配置template
[root@docker ~]# cd consul/
[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip		//解压缩consul-template
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: consul-template
[root@docker consul]# mv consul-template /usr/bin		//将脚本放入/usr/bin中

启动template
[root@docker consul]# consul-template -consul-addr 192.168.140.22:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info

在这里插入图片描述

参数详解:

-consul-addr 192.168.140.22:8500:指向consul服务端节点

-template "/root/consul/nginx.ctmpl:指定模板路径

:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf

:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效

–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)

4.4 测试

  • 另起一个终端,查看nginx的/vhost文件中是否生成test.conf配置文件
[root@docker ~]# cd /usr/local/nginx/conf/vhost/
[root@docker vhost]# ls
tang.conf  test.conf

在这里插入图片描述

  • 查看test.conf配置文件中的地址池信息(是否已自动更新添加)
[root@docker vhost]# vim test.conf
upstream http_backend {
    
    

    server 192.168.140.21:85;

    server 192.168.140.21:86;

}

server {
    
    
  listen 88;
  server_name localhost 192.168.140.22;
  access_log /var/log/nginx/tang.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;
  }
}

在这里插入图片描述

  • 在后端服务器中再次添加一个容器,查看vhost中配置文件是否会自动发现/更新
[root@nginx ~]# docker run -itd -p:87:80 --name test-03 -h test03 nginx		//添加容器
[root@docker ~]# cat /usr/local/nginx/conf/vhost/tang.conf

在这里插入图片描述

总结

  • docker-consul 就是实现对后端节点的自动发现(增加或减少的服务器),对前端nginx的反向代理地址池(upstream)的自动更新(动态更新)。也就是说,docker-consul 实现了服务的自动更新与发现
  • Docker Compose 简单的容器编排重心在于consul-template 的编写,服务器节点指向的对象、参数变量的设置。

猜你喜欢

转载自blog.csdn.net/weixin_42449832/article/details/114822603