Docker consul

Docker consul 容器的自动发现与注册

什么叫微服务(容器)注册与发现

是一种分布式管理系统,定位服务的方法。

在传统架构中,应用程序之间直连到已知的服务,设备提供的网络:IP地址,基于tcp/ip:端口

由于现代微服务部署,服务的动态性,数量增加了,传统的基于IP+端口的形式已经不太适用,从而引申出了服务注册与发现:微服务的位置信息(IP+端口+健康状态)统一注册到一个中心化的服务注册表中

可以允许其他服动态的查询和发现这些服务

基本的工作流程:

Docker consul_第1张图片

总结一下:

服务注册:当一个服务启动时,会把自己的元数据(IP端口 服务名称 健康状态)注册到服务注册当中。

这个注册表服务(consul,zookeeper),也可以在云平台部署

服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(IP+端口),这样的话可以直接在服务注册表中,直接获取我要的信息,不需要到静态地址查看了

服务注册与发现的优点:

  1. 动态性:可以在运行时动态添加和移除服务,不需要额外的人工操作和配置
  2. 弹性:一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求的失败
  3. 可扩展性:适用不断变化的服务数量
  4. 服务方调用时,透明性,前端和后端实现解耦

服务注册与发现机制和其他的工具配合使用,负载均衡,健康检查,配属管理(一键同步)

微服务架构中非常重要的组件,所以我们有了consul:

Consul:

Consul是hashicrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式的系统协调

Consul的特点:

  1. 服务发现与自动注册,位置信息(IP+端口+服务名称)
  2. 健康检查,服务注册到consul之后,一并加入系统还有他的健康状态,定期发送一个心跳检查,如果服务挂了consul会自动移除
  3. 分布式锁:consul提供了一个分布式锁的功能,协调多个节点之间的操作,防止竞争条件和数据冲突(1).每一个服务的发现和注册都是一个会话seeion.微服务在注册到consul的时候,consul会和这个服务的会话创建一个锁,锁用来标识具体的服务器,会话和锁之间的关联(2).建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他的服务在占用,会给你分配一个新的锁(KV存储)释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系,删除与锁关联的键,实现资源释放
  4. KV存储:Key-Value分布式键值对存储系统,存储配置信息,锁,特性,应用程序,应用程序可以使用consul的键值对信息来动态的获取配置信息
  5. 多数据中心支持,consul可以在多个地域部署,可以在数据中心之间的发现和注册功能
  6. DNS和HTTP API:consul可以支持DNS接口,通过域名解析定位服务的位置,HTTP API:通过API应用接口可以调用consul的信息比方说服务信息,健康检查等等
  7. 事假通知,如有关键信息,可以随时获取信息通知

实验环节:

Consul部署和服务发现:

Docker1:

Consul服务器:docker1 20.0.0.61 consul docker-ce nginx二进制 consul-template(自动发现和自动部署)

Docker2:

Registrator服务器:提供微服务,20.0.0.62 运行注册机制(容器)

Docker3:

Consul服务器:多结点 20.0.0.63加入到consul的集群中

-------- consul服务器 --------

建立 Consul 服务

mkdir /opt/consul

cp consul_0.9.2_linux_amd64.zip /opt/consul

cd /opt/consul

unzip consul_0.9.2_linux_amd64.zip

mv consul /usr/local/bin/

Docker consul_第2张图片

//设置代理,在后台启动 consul 服务端

运行consul

Docker consul_第3张图片

consul agent \

-server \

-bootstrap \

-ui \

-data-dir=/var/lib/consul-data \

-bind=20.0.0.61 \

-client=0.0.0.0 \

-node=consul-server01 &> /var/log/consul.log &

解析:

Consul agent:开启监听服务

-server:指定集群当中的服务器的节点,consul的RAFT的算法实现分布式结构中节点的一致性,集群当中的成员,直接成为集群的leader,后续加入的服务器都是他的follower

-bootstrap:表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导程序,加入集群

-ui:启动图形化界面

-data-dir=/var/lib/consul-data:consul存储数据的路径

-bind=20.0.0.61:服务端绑定的IP地址,节点当中通信

-client=0.0.0.0:客户端的地址,所有主机都可以和sever建立通信(生产当中指定的服务器)

-node=consul-server01:指定consul节点的名称,在集群当中consul节点的名称都是唯一的,不可复制的

&>/var/log/consul.log:混合重定向输出到consul.log

&:后台运行

查看

netstat -antp | grep consul

这些端口的作用:

8300:raft协议的端口,保持分布式集群的一致性,端口处理复制和领导者选举

8301:LAN Gossip的端口,局域网内部进行节点的通信和信息传播的协议

8302:wan Gossip的端口,广域网内的节点的通信和信息传播的协议

8500:web ui的端口,用来访问consul的图形化界面

8600:DNS解析的端口

如何查看集群信息:

consul members

查看集群的状态:

consul operator raft list-peers

查看集群的server成员

curl 127.0.0.1:8500/v1/status/peers

查看集群的领导者

curl 127.0.0.1:8500/v1/status/leader

查看集群节点的详细信息:

curl 127.0.0.1:8500/v1/catalog/nodes

Docker consul_第4张图片

查看已经被集群发现和注册的服务

curl 127.0.0.1:8500/v1/catalog/services

查看已经被集群发现和注册的服务

curl 127.0.0.1:8500/v1/catalog/services

小结:

#查看集群状态

consul operator raft list-peers

consul info | grep leader

leader = true

leader_addr = 192.168.233.40:8300

通过 http api 获取集群信息

curl 127.0.0.1:8500/v1/status/peers #查看集群server成员

curl 127.0.0.1:8500/v1/status/leader #集群 server-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 #集群节点详细信息

-------- registrator服务器 --------

//容器服务自动加入 Nginx 集群

如何让集群自动发先和自动注册:

Docker2:

 安装 Gliderlabs/Registrator

Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。

目前支持 Consul、Etcd 和 SkyDNS2。

#客户端执行:

Docker consul_第5张图片

docker run -d \

--name=registrator \

-v /var/run/docker.sock:/tmp/docker.sock \

--restart=always \

gliderlabs/registrator:latest \

--ip=20.0.0.62 \

consul://20.0.0.61:8500

解析意思:

> -v /var/run/docker.sock:/tmp/docker.sock \

Docker.socker是docker守护进程unix的套接字文件,把它映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自动注册服务

> --ip=20.0.0.62 \

注册在consul的IP地址

> consul://20.0.0.61:8500

所有发现的服务都会注册指定的server节点

docker images

docker ps

Docker consul_第6张图片

docker run -itd -p 81:80 --name test-1 -h test1 nginx

docker run -itd -p 82:80 --name test-2 -h test2 nginx

Docker consul_第7张图片

验证 http 和 nginx 服务是否注册到 consul

浏览器中,输入 http://20.0.0.61:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。

Docker consul_第8张图片

//在consul服务器使用curl测试连接服务器

curl 127.0.0.1:8500/v1/catalog/services

{"consul":[],"httpd":[],"nginx":[]}

------------------------------------ consul-template ------------------------------------

Consul-template:他是一个hashiCrop公司开发的一个工具,用于consul集成,自定更新配置文件,实现配置管理的自动化

作用:

  1. 动态的配置更新,Consul-template监控consul当中的key-value的存储键值对,键值对发生变化,会自动更新配置文件,无需重启服务
  2. 支持多种后端的模板:nginx配置,ETCD等等

自动化更新配置文件:

准备 template nginx 模板文件

//在consul服务器上操作

vim /opt/consul/nginx.ctmpl

#定义nginx upstream一个简单模板

upstream http_backend {

  {{range service "nginx"}}

   server {{.Address}}:{{.Port}};

   {{end}}

}

server {

    listen 8000;

    server_name localhost 20.0.0.61;

    access_log /var/log/nginx/kgc.com-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_第9张图片

参考:

Docker consul_第10张图片

解析代码意思:

{{range server “nginx”}}

在这个配置当中,test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务,

server {{.Address}}:{{.Port}};

将发现和注册的nginx服务地址和端口,添加到test1upstream的方法配置当中

编译安装nginx:

安装依赖环境

yum -y install pcre-devel zlib-devel gcc gcc-c++ make

useradd -M -s /sbin/nologin nginx

tar zxvf nginx-1.22.0.tar.gz -C /opt/

cd /opt/nginx-1.22.0/

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j 4 && make install

Docker consul_第11张图片

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

netstat -antp | grep 80

Docker consul_第12张图片

修改nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf

include  vhost/*.conf;        #添加虚拟主机目录

//创建虚拟主机目录

mkdir /usr/local/nginx/conf/vhost

//创建日志文件目录

mkdir /var/log/nginx

//停止nginx

nginx -s stop

//启动nginx

nginx

Docker consul_第13张图片

配置并启动 template

unzip consul-template_0.19.3_linux_amd64.zip -d /opt/

cd /opt/

mv consul-template /usr/local/bin/

Docker consul_第14张图片

//在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。

consul-template --consul-addr 20.0.0.61:8500 \

--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \

--log-level=info

Docker consul_第15张图片

解析:

consul-template --consul -addr 20.0.0.61:8500 \

指定consul的地址,告诉consul-template从server节点获取数据

temple “/opt/consul/nginx.ctmpl:/usr/local/nginx/vhost/test.conf:/usr/local/nginx/sbin/nignx -s reload” \

第一部分:

temple “/opt/consul/nginx.ctmpl:配置文件大的模板的位置

第二部分:

/usr/local/nginx/vhost/test.conf:给予模版生成配置文件的位置

第三部分:

/usr/local/nginx/sbin/nignx -s reload” 只要集群中服务发生变化,可以随时更新到新的配置文件当中

--log-level=info:设置consul-template的日志级别为info

小结:

Consul是一个中间键:nginx服务通过consul-template获取模版,反向代理,consul-template--consul来获取注册服务的IP和端口,然后nginx调用

新开相同的终端查看;

Docker consul_第16张图片

还可以实现轮询

---------------------------consul 多节点------------------------------

//添加一台已有docker环境的服务器20.0.0.63加入已有的群集中

Docker3安装consul

Docker consul_第17张图片

Docker consul_第18张图片

consul agent \

-server \

-ui \

-data-dir=/var/lib/consul-data \

-bind=20.0.0.63 \

-client=0.0.0.0 \

-node=consul-server02 \

-enable-script-checks=true  \

-datacenter=dc1  \

-join 20.0.0.61 &> /var/log/consul.log &

解析:

-enable-script-checks=true  \

设置检查服务为可用,他也可以发现原集群当中的服务

-datacenter=dc1  \

加入到40的数据中心

-join 20.0.0.61

加入到已有的集群当中去

consul members

consul operator raft list-peers

Docker consul_第19张图片

浏览器查看

Docker consul_第20张图片

脱离集群:

consul leave

Docker consul_第21张图片

你可能感兴趣的:(docker,consul,容器)