Docker--consul

news2024/9/23 15:29:36

目录

前言

一、Consul 简介

1.1、 consul 概述

1.2 、consul 的两种模式

1.3、consul 提供的一些关键特性

二、Consul 容器服务更新与发现

三、consul 部署 

3.2、查看集群信息

四、registrator服务器

consul-template

五、consul 多节点


前言

服务注册与发现是微服务架构中不可或缺的重要功能。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中

一、Consul 简介

1.1、 consul 概述

consul 是 google 开源的一个使用 go 语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用 Raft 算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行 agent,他有两种运行模式 server 和 client。 每个数据中心官方建议需要 3或 5 个 server 节点以保证数据安全,同时保证 server-leader 的选举能够正确的进行。

1.2 、consul 的两种模式

在 client 模式下,所有注册到当前节点的服务会被转发到 server 节点,本身是不持久化这些信息的。

在 server 模式下,功能和 client 模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。

server-leader 是所有 server 节点的老大,它和其它 server 节点不同的是,它需要负责同步注册的信息给其它的 server 节点,同时也要负责各个节点的健康监测。

1.3、consul 提供的一些关键特性

  • 服务注册与发现:consul 通过 DNS 或者 HTTP 接口使服务注册和服务发现变的很容易,一些外部服务,例如 saas 提供的也可以一样注册。
  • 健康检查:健康检测使 consul 可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • Key/Value 存储:一个用来存储动态配置的系统。提供简单的 HTTP 接口,可以在任何地方操作。
  • 多数据中心:无需复杂的配置,即可支持任意数量的区域。
  • 基于 Golong 语言,可移植性强。
  • 支持 ACL 访问控制。
  • 与 Docker 等轻量级容器可无缝配合。

二、Consul 容器服务更新与发现

两个 nginx 之间做 keepalived,访问的时候通过 httpd 的方式访问 keepalived,访问到 nginx 的主服务器,并且这个主服务器会代理给后端服务器上的 Container,Container 上面可以跑 tomcat/php/apache 等服务。

发现:Consul 会在 docker 服务器上安插一个眼线(registrator),它会自己去探测当前主机上容器的状态变化(增加和减少),并且可以自己去进行调整。当发现容器变化了以后,会把变化的信息告诉 consul 的 server 端并且注册到 consul 的 server 端,注册以后在 UI 界面可以在 web 网页里面查看节点的变化。

更新:Consul agent 控制 consul template 模板,使用 template 组件去和 nginx.conf 来进行对接,使用 template 这种方式来构建模板,模板里面都是变量,引用变量的方式去加载后端由 consul 注册到 server 端之后,server 会把这个信息告诉 agent,agent 会和 template 进行对接并写入 template 中,更新完以后它会作为 nginx.conf 的子配置文件被前端的 nginx 所识别,最后 consul agent 会控制 nginx 来进行 reload,reload 后会识别到 nginx.conf 配置文件中 upstream 池和 proxy_pass 信息的变化,也就是说可以识别后端的节点,这样就可以在地址池中动态的调整后端的资源。

三、consul 部署 

consul服务器192.168.239.60运行consul服务、nginx服务、consul-template守护进程
registrator服务器192.168.239.70运行registrator容器、运行nginx容器

 

#关闭防火墙
systemctl stop firewalld.service
setenforce 0

3.1、consul服务器 

#将consul软件包上传到/opt目录
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/  #优化路径史系统识别命令

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

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.239.60 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &

-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。

-datacenter :指定数据中心名称,默认是dc1。
netstat -natp | grep consul

启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

 

3.2、查看集群信息

查看members状态

consul members  #查看集群成员

 查看集群状态

consul operator raft list-peers   #查看当前集群状态
consul info | grep leader         #查看日志的方式查看集群leader节点

通过 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 集群

安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.239.70 \
consul://192.168.239.60:8500

 

--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。

consul :指定consul服务器的IP和端口。

 

测试服务发现功能是否正常

docker run -itd -p:83:80 --name test-01 -h gb nginx
docker run -itd -p:84:80 --name test-02 -h gb1 nginx
docker run -itd -p:85:80 --name test-03 -h gb2 httpd	docker run -itd -p:86:80 --name test-04 -h gb3 httpd	
#-h:设置容器主机名

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

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

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

curl 127.0.0.1:8500/v1/catalog/services 

consul-template

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

Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。

 

 

 通过consul-template配置实现nginx负载均衡的自动配置

#将软件包拉取opt目录进行解压
unzip consul-template_0.19.3_linux_amd64.zip

#优化路径让系统识别
mv consul-template /usr/local/bin/

 准备 template nginx 模板文件

#在consul服务器上操作

mkdir consul           #创建工作目录

vim nginx.ctmpl        #定义nginx upstream一个简单模板
upstream http_backend {
  {{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
#定义一个server,监听8080端口,反向代理到upstream
server {
    listen 8080;
    server_name www.gb.com;
    access_log /var/log/nginx/kgc.com-access.log;
    index index.html index.php;
    location / {
        proxy_pass http://http_backend;
        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;
    }
}

 

yum安装nginx

准备nginx -yum源

cd /etc/yum.repos.d/

 vim nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx -y #安装
systemctl start nginx
netstat -natp |grep 80

 

 

启动 template

#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.239.60:8500 --template "/opt/consul/nginx.ctmpl:/etc/nginx/conf.d/gb-consul.conf:/usr/sbin/nginx -s reload" --log-level=info

#--consul-addr 指定consul的ip和端口号;8500既是UI界面端口也是管理服务端口
#/opt/consul/nginx.ctmpl:模板文件路径
#nginx/conf.d/gb-consul.conf:生成的配置文件的路径
#/usr/sbin/nginx -s reload:重载
#--log-level=info:日志的级别

 

另外打开一个终端查看生成配置文件

cat /etc/nginx/conf.d/gb-consul.conf

upstream http_backend {

server 192.168.239.70:83;

server 192.168.239.70:84;

}

server {
    listen 8080;
    server_name www.gb.com;
    access_log /var/log/nginx/gb.com-access.log;
    index index.html index.php;
    location / {
        proxy_pass http://http_backend;
        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;
    }
}

 

访问 template-nginx 

docker ps -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED        STATUS       PORTS                               NAMES
ca49c5b1948e   httpd                           "httpd-foreground"       24 hours ago   Up 4 hours   0.0.0.0:86->80/tcp, :::86->80/tcp   test-04
2c1fbf05eae9   httpd                           "httpd-foreground"       24 hours ago   Up 4 hours   0.0.0.0:85->80/tcp, :::85->80/tcp   test-03
82eeea53ebca   nginx                           "/docker-entrypoint.…"   25 hours ago   Up 4 hours   0.0.0.0:84->80/tcp, :::84->80/tcp   test-02
682af3b7c713   nginx                           "/docker-entrypoint.…"   25 hours ago   Up 4 hours   0.0.0.0:83->80/tcp, :::83->80/tcp   test-01
6f8e0a158c62   gliderlabs/registrator:latest   "/bin/registrator --…"   25 hours ago   Up 4 hours                                       registrator
#进入nginx容器在站点目录写入文件
docker exec -it 682af3b7c713 bash
echo "this is test01 web" > /usr/share/nginx/html/index.html

docker exec -it 82eeea53ebca bash
echo "this is test02 web" > /usr/share/nginx/html/index.html

 

浏览器访问:http://192.168.239.60:8080/ ,并不断刷新

 

增加一个 nginx 容器节点,测试服务发现及配置更新功能。

docker run -itd -p:85:80 --name test-05 -h test05 nginx

 

观察 template 服务,会从模板更新/etc/nginx/conf.d/gb-consul.conf文件内容,并且重载 nginx 服务。

#查看/etc/nginx/conf.d/gb-consul.conf 文件内容
cat /etc/nginx/conf.d/gb-consul.conf
upstream http_backend {

server 192.168.239.70:83;

server 192.168.239.70:84;

server 192.168.239.70:87;

}

 

查看第三胎 nginx 容器web站点目录写入文件,网页访问测试是否正常轮询到各个容器节点上

docker exec -it f6a8b57d3a52 bash

echo "this is test03 web" > /usr/share/nginx/html/index.html

浏览器访问:http://192.168.239.60:8080/ ,并不断刷新。 

 

 

五、consul 多节点

#将consul文件传输给50节点让系统识别consul命令
cd /usr/local/bin/
scp consul 192.168.239.50:`pwd`
#添加一台已有docker环境的服务器192.168.239.50/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.239.50 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.239.60 &> /var/log/consul.log &

#################################################
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中

#查看集群成员
consul members   
Node             Address              Status  Type    Build  Protocol  DC
consul-server01  192.168.239.60:8301  alive   server  0.9.2  2         dc1
consul-server02  192.168.239.50:8301  alive   server  0.9.2  2         dc1


#查看当前集群状态
consul operator raft list-peers    
Node             ID                   Address              State     Voter  RaftProtocol
consul-server01  192.168.239.60:8300  192.168.239.60:8300  leader    true   2
consul-server02  192.168.239.50:8300  192.168.239.50:8300  follower  true   2

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试十大必考题目(通用)

目录 (1) 为什么想进本公司? (2) 喜欢这份工作的哪一点? (3) 自己的优缺点为何? (4) 对公司的了解有多少? (5&#xf…

C++创建多线程的方法总结

下个迭代有个任务很有趣,用大量的线程去访问一个接口,直至其崩溃为止,这就需要多线程的知识,这也不是什么难事,总结一下C中的多线程方法:std、boost、pthread、windows api。 目录 一、多线程预备知识 二…

图解浏览器渲染页面详细过程

渲染详细过程 产生渲染任务,开启渲染流程 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。…

IDEA 常用快捷键回顾

一 Alt 数字键 1. Alt 1: 打开项目 2. Alt 2: 打开Favorites 3. Alt 3: 打开Find 4. Alt 4: 打开Run 5. Alt 5: 打开Debug 6. Alt 6: 打开当前所在文件 7. Alt 7: 打开Structure 8. Alt 8: 打开Services 9. Alt 9: 打开Git日志 二 Ctrl 其他键 1. Ctrl…

【Flink】详解JobGraph

概述 JobGraph 是 StreamGraph 优化后的产物,客户端会将优化后的 JobGraph 发送给 JM。接下来的文章涉及到一些前置知识点,没有看前几期的小伙伴最好看一下前几期: 【Flink】详解StreamGraph【Flink】浅谈Flink架构和调度【Flink】详解Flin…

【Flutter入门到进阶】Dart进阶篇---进阶用法

1 Dart对象扩展 1.1 extension 1.1.1 介绍 可以在不更改类或创建子类的情况下,向类添加扩展功能的一种方式。灵活使用 extension 对基础类进行扩展,对开发效率有显著提升。 1.1.2 需求 在开发项目中碰到需求:将单位为分的数值转换成单位为…

RabbitMQ(黑马spring cloud笔记)

MQ 目录MQ一、同步通讯和异步通讯1. 同步通讯2. 异步通讯二、RabbitMQ1. 部署2. 架构3. 常见消息模型3.1 基本消息队列(Basic Queue)3.2 工作消息队列(Work Queue)3.3 发布订阅(Publish、Subscribe)4. 消息…

TPAMI 2022 | RC-Explainer:图神经网络的强化因果解释器

文章目录 一、论文关键信息二、基础概念三、主要内容1. Motivations2. Insights3. 解决方案的关键四、总结与讨论CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Reinforced Causal Explainer for Graph Neural Networks 期刊信息:IEEE Transact…

【C++】内存管理

🍅不同的数据放在不同的地方,需要内存管理 目录 ☃️1.C/C中的内存分布 ☃️2.C语言中动态内存管理方式 ☃️3.C内存管理方式 🐝3.1 new/delete操作内置类型 🐝3.2 new和delete操作自定义类型 🐝3.3 operator n…

FISCO BCOS节点扩容和使用console进行群组扩容

一、安装并启动FISCO BCOS 搭建单机单群组4节点的教程查看:https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 二、下载扩容脚本 在fisco目录下输入以下命令: curl -#LO https://raw.githubusercontent.com/FI…

155、【动态规划】leetcode ——474. 一和零:三维数组+二维滚动数组(C++版本)

题目描述 原题链接:474. 一和零 解题思路 (1)三维数组 本题是要在已有的字符串中,找到给定的m个0和n个1,组出最大的子集。将字符串集合中的各个字符串看作物品,m个0和n个1看作背包的重量,则该…

jenkins +docker+python接口自动化之jenkins容器安装python3(二)

jenkins dockerpython接口自动化之jenkins容器安装python3(二) 目录:导读 前提是在docker下已经配置好jenkins容器了,是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器&#xff1…

NLP方向的论文可投的核心期刊

目录1、《计算机仿真》北大核心、科技核心2、《通信学报》北大核心、科技核心、CSCD核心3、《计算机科学》北大核心、EI来源期刊、CSCD核心4、《计算机工程》北大核心、科技核心5、《计算机应用》北大核心、科技核心、CSCD核心6、《计算机工程与应用》北大核心、科技核心、CSCD…

Python - 数据容器dict(字典)

目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{},不过存储的元素是一个个的:键值对&#…

golang的web框架Gin(一)---Gin的Resutful风格

Restful风格是什么? REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。 RESTFUL特点包括: 每一个URI代表1种资源&#xff…

STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

文章目录1. I2C与SPI通信协议对比2. 四脚OLED与六脚OLED3. I2C驱动OLED显示oled.h & oled.c:汉字取模 & oledfont.h:main.c 显示示例:连线方法:4. SPI驱动OLED显示1. I2C与SPI通信协议对比 I2C(Inter-Integra…

基于springboot的毕业设计管理系统

摘要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

【开源】祁启云网络验证系统V1.11

简介 祁启云免费验证系统 一个使用golang语言、Web框架beego、前端Naive-Ui-Admin开发的免费网络验证系统 版本 当前版本1.11 更新方法 请直接将本目录中的verification.exe/verification直接覆盖到你服务器部署的目录,更新前,请先关闭正在运行的验…

搭建云端vscode-server,使用web ide进行远程开发

使用乌班图系统,搭建自己的网页vs code开发环境github地址:GitHub - coder/code-server: VS Code in the browser安装脚本curl -fsSL https://code-server.dev/install.sh | sh出现deb package has been installed.表示已经正确安装。测试启动2.1修改配置…

Idea打包springboot项目war包,测试通过

pom.xml文件 <!--包名以及版本号&#xff0c;这个是打包时候使用&#xff0c;版本可写可不写&#xff0c;建议写有利于维护系统--> <artifactId>tsgdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <!--打包形式--> <packaging&…