docker consul

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

问:什么叫做微服务(容器)注册与发现?

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

在传统架构中,应用程序之间直连到已知的服务,设备提供的网络: p地址,基于tcp/ip: 端口。由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用。

服务注册以及发现:微服务的位置信息(IP+端口+健康状态)统一注册到一个中心化的服务注册表中

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

docker consul_第1张图片

服务注册:当一个服务启动时,会把自己的元数据(IP 端口 服务名称 健康状态(服务是否在正常运行))注册到服务注册表中

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

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

服务注册与发现的优点

1、动态性。可以在运行的时候动态添加和移除服务,不需要额外的人工操纵和配置

2、弹性。一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求的失败

3、可扩展。可以适应不断变化的服务数量

4、透明性。服务方调用时,前端和后端实现解耦

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

微服务架构中非常重要的组件

consul:

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

consul的主要特点:

1、服务发现与自动注册(最主要),位置信息(ip+端口+服务名称)

2、健康检查。服务注册到consul,一并加入系统的还有其他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除

3、分布式锁机制:consul提供了一个分布式锁的功能,可以协调多个节点之间的操作,防止竞争条件和数据冲突

①每一个服务的注册和发现都是一个会话SESSION

微服务在注册到consul的时候,consul会和这个服务的会话创建一个锁,锁用来标识具体的服务器。会话和锁之间关联

获取锁:微服务2建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他的服务在占用,会给你分配一个新的锁(KV存储)

释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和所之间的关系。删除与锁关联的键,实现资源的释放

4、KV存储:key-value分布式的键值对存储系统。可以存储配置信息、锁、特性等。应用程序可以使用consul的键值对信息来动态的获取配置信息

5、多数据中心支持,consul可以在多个地域部署,可以在数据中心之间的发现和注册功能

6、DNS和HTTP、API:consul支持DNS接口,通过域名解析定位服务的位置。http api:通过API应用接口,可以调用consul的信息。服务信息、健康检查等

7、事件通知,如有关键信息可以随时获取通知

consul部署和服务发现

consul服务器  docker1  192.168.233.20 consul docker-ce nginx二进制 consul-trmplate(自动发现和配置)

registrator服务器 docker2 192.168.233.30 运行注册机和微服务(容器)

consul服务器 多节点 docker3 192.168.233.40 加入到consul的集群中

[root@20 consul]# consul agent \

-server \

-bootstrap

-ui \

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

-bind=192.168.233.20 \

-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=192.168.233.20 \:服务端绑定的IP地址,节点当中通信

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

-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

curl 127.0.0.1:8500/v1/status/peers

查看集群的server成员

curl 127.0.0.1:8500/v1/status/leader

查看集群的leader

curl 127.0.0.1:8500/v1/catalog/services

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

curl 127.0.0.1:8500/v1/catalog/nodes

查看集群节点的详细信息

30上操作

cd

docker run -d --name=registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always \

gliderlabs/registrator :latest --ip=192.168.233.30 consul://192.168.233.20:8500

-v /var/run/docker.sock:/tmp/docker.sock:docker.sock的是docker守护进程的UNIX的套接字文件,把它映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自

动注册服务

consul://192.168.233.20:8500:所有发现的服务都会注册到指定server节点

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

192.168.233.20:8500

docker consul_第2张图片

docker consul_第3张图片

20上操作

cd /opt

cd consul/

vim nginx.ctmpl

upstream test1{

  {{range service nginx}}

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

   {{end}}

}

server {

   listen 8000;

   server_name localhost 192.168.233.20;

   access_log /var/log/nginx/test1-access.log;

   index index.html index.php;

   location / {

      proxy_set_header HOST $host;

proxy_set header X-Real-IP_Sremote addr;

proxy_set header Client-Ip'$remote addr;

proxy_set header X-Forwarded-For $

proxy add x forwarded for;

proxy_pass http://test1;

}

}

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

server {{.Address}};{{.Port}}; :将发现和注册的nginx

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

useradd -M -s /sbin/nologin nginx

cd /opt

 tar -xf nginx-1.22.0.tar.gz

./confuture

In -s /usr/local/nginx/sbin/nginx /usr/local/sbin

netstat -antp l grep 80

cd /usr/local/nginx/conf

cp nginx.conf nginx.conf.bak

vim nginx.conf

18gg

o

include vhost/*.conf;

:wq!

nginx -t

mkdir /usr/local/nginx/conf/vhost

mkdir /var/log/nginx

netstat -antp | grep 80

nginx

netstat -antp | grep 80

consul-template 0.19.3 linux amd64.zip /opt/

ls

cd /opt

unzip consul-template_0.19.3_linux_amd64.zip

mv consul-template /usr/local/bin/

再开一个20

cat /usr/local/nginx/conf/vhost/test.conf

在原来20上操作

consul-template --consul-addr 192.168.233.40:8500 --template “/opt/consul/nginx.ctmpl:/usr/local/nginx/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload --log-level=info

第一个部分

/opt/consul/nginx.ctmpl: 配置文件大的模版的位置

第二个部分:

/usr/local/nginx/vhost/test.conf

给予模版生成配置文件的位置

第三个部分

/usr/local/nginx/sbin/nginx -s reload

只要集群中服务发生变化,可以随时更新到配置文件当中

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

consul是一个中间件: nginx服务通过onsul-template获取模版,反向代理,consul-template--.consul来获取注册服务的ip和端口,然后nginx调用发现的服务来实现负载均衡。

30上操作

cd

docker exec -it test-1 bash

cd /usr/share/nginx/html/

echo 123 > index.html

exit

docker exec -it test-3 bash

root@test3:/# cd /usr/share/nginx/html/

root@test3:/usr/share/nginx/html# echo 456 > index.html

root@test3:/usr/share/nginx/html# exit

docker consul_第4张图片

docker consul_第5张图片

docker consul_第6张图片

sonsul的多节点:

40上操作

cd

docker consul_第7张图片

consul agent \

-server \

-ui \

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

-bind=192.168.233.40 \

-client=0.0.0.0 \

-node=consul-server02 \

-enable-script--checks=true \

-datacenter=dc1 \

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

192.168.233.20:8500

docker consul_第8张图片

-enable-script-checks=true 设置检查服务为可用,他也可以发现原集群当中的服务datacenter=dc1 : 加入到20的数据中心

join 192.168.233.20 加入到已有的集群当中去

docker-consul的核心就是发现,微服务。可以动态的管理

docker consul:查、看元数据:IP、端口、健康状态、服务名称

consul-template:自动化管理配置文件的工具,获取consul当中注册的服务信息,可以自动的添加到配置文件当中,即时生效,无需重启服务

consul的多节点:一旦选举出leader,后续的服务器都是follower。server的名称不能重复,但是可以在同一个数据中心

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