docker consul

2023-12-18 17:24:20

docker consul

docker consul:容器的自动发现于注册

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

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

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

由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用

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

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

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

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

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

服务注册于发现的优点:

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

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

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

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

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

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

consul:

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

consul的主要特点:

1、服务发现与自动注册:

(1)位置信息(ip+端口+服务名称)

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

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

(1)每一个服务的发现和注册都是一个会话 session

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

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

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

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

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

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

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

实验:

consul部署和服务发现:

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

registrator服务器:docker2 192.168.233.50 运行注册机制和微服务(容器)

consul服务器:多节点docker3 192.168.233.60(加入到consul的集群中)

三台服务器同步操作:

systemctl stop firewalld

setenforce 0

docker1(40):

拖软件包到/opt目录下

mkdir consul

cp consul_0.9.2_linux_amd64.zip /opt/consul

cd consul/

unzip consul_0.9.2_linux_amd64.zip

mv consul /usr/local/bin/

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

consul agent \

-server \

-bootstrap \

-ui \

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

-bind=192.168.233.40 \

-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.40:服务端绑定的ip地址,节点当中通信

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

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

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

&:后台运行

查看consul的端口

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

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

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

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

8600:DNS解析的端口

查看集群信息

查看members状态

consul members

查看集群状态

consul operator raft list-peers

通过 http api 获取集群信息

查看集群的server成员

curl 127.0.0.1:8500/v1/status/peers

通过 http api 获取集群信息

查看集群的领导者

curl 127.0.0.1:8500/v1/status/leader

通过 http api 获取集群信息

查看集群中注册的所有服务

curl 127.0.0.1:8500/v1/catalog/services

通过 http api 获取集群信息

查看集群节点的详细信息

curl 127.0.0.1:8500/v1/catalog/nodes

通过 http api 获取集群信息

查看 nginx 服务信息

curl 127.0.0.1:8500/v1/catalog/nginx

docker2(50):

容器服务自动加入 Nginx 集群

创建自动注册与发现的服务器

docker run -d \

--name=registrator \

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

--restart=always \

gliderlabs/registrator:latest \

--ip=192.168.233.50 \

consul://192.168.233.40:8500

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

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

--ip=192.168.233.50 \注册在consul的ip地址

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

查看一下镜像和容器是否存在

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

如果出现这个报错,就重启docker,然后删上面的test-1的容器docker rm -f test-1,再重新输入上面的命令

-h:是注册容器里的主机名

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

docker run -itd -p 83:80 --name test-3 -h test3 nginx(最好创两个nginx,方便实现下面实验的轮询)

访问服务器

192.168.233.40:8500

验证httpd消失

docker stop test-2

刷新就会消失

启动一下httpd

docker start test-2

刷新就会回来

借助consul-template文件实现

是HashCrop公司开发的一个工具,用于consul集成,自动更新配置文件,实现配置管理的自动化

作用:

1、动态的配置更新。consul-template监控consul当中key-value的存储键值对,键值对发生变化,会自动更新配置文件无需重启服务

2、支持多种后端的模板:nginx配置,ETCD等等

docker1(40):

准备 template nginx 模板文件

vim /opt/consul/nginx.ctmpl

upstream test1 {

?{{rang service nginx}}

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

??{{end}}

}

server {

??

??listen 8000;

??server_name localhost 192.168.233.40;

??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 $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;

}

}

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

server {{.Address}}:{{.Port}};:将发现和注册的nginx服务的ip地址和端口,添加到

安装依赖环境

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

设置软连接

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

vim nginx.conf

nginx -t

创建虚拟主机目录

mkdir /usr/local/nginx/conf/vhost

创建日志文件目录

mkdir /var/log/nginx

配置并启动 template

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

cd /opt/

mv consul-template /usr/local/bin/

consul-template --consul-addr 192.168.233.40:8500 \

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

--log-level=info

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

第二行第一部分:

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

第二部分:

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

第三部分:

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

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

再开一个终端docker1

docker2(50):

docker ps

刷新查看是否轮询

实现consul的多节点:

docker3(60):

拖安装包

解压安装包

unzip consul_0.9.2_linux_amd64.zip

mv consul /usr/local/bin

consul agent \

-server \

-ui \

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

-bind=192.168.233.60 \

-client=0.0.0.0 \

-node=consul-server02 \

-enable-script-checks=true ?\

-datacenter=dc1 ?\

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

浏览器查看192.168.233.40:8500

-enable-script-checks=true :设置检查服务为可用

-datacenter : 数据中心名称

-join :加入到已有的集群中

consul members

docker1(40):

consul members

consul operator raft list-peers

docker3(60):

脱离consul集群的方法

consul leave

文章来源:https://blog.csdn.net/wyh20030130/article/details/135061214
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。