4.Docker--Consul

2023-11-18

Docker–Consul

引言:Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。

一. Consul简介

1.什么是consul

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

2.consul 的两种模式

  • **在client模式下,**所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息
  • 在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的

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

每个端口解释:

8300:统一同步服务端的数据信息的端口

8301:统一同步客户端的数据信息的端口

8302:跨数据中心时互相通讯的端口

8500:DNS端口,用于已注册的服务发现,使用DNS协议查看节点信息的端口

8600:http端口,用于http接口和web ui 访问

3、Consul特性

支持健康检查、允许存储键值对
基于Golong语言,可移植性强
支持ACL访问控制

  • 服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
  • 健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
  • Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
  • 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
  • 多数据中心:Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

4、 Consul使用场景

Consul的应用场景包括服务发现、服务隔离、服务配置:

  • 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。

  • 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。

  • 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。

  • Consul可以帮助系统管理者更清晰的了解复杂系统内部的系统架构,运维人员可以将Consul看成一种监控软件,也可以看成一种资产(资源)管理系统。

    比如:docker实例的注册与配置共享、coreos实例的注册与配置共享、vitess集群、SaaS应用的配置共享、Consul与confd服务集成,动态生成nginx和haproxy配置文件或者Consul结合nginx构建高可用可扩展的Web服务。

5、服务发现与更新的原理

  • 发现:

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信息的变化,也就是说可以识别后端的节点,这样就可以在地址池中动态的调整后端的资源

  • 简述:

template 模板(更新)
registrator(自动发现)
后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新
**核心机制:**consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)

二. Consul集群搭建

image-20220913100618250

Consul agent有两种运行模式
Server
Client
Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关

image-20220913101122393

Consul部署

服务器类型 系统 IP地址 需要安装的组件
consul服务器(server) CentOS7.4(64 位) 20.0.0.37 运行consul服务、nginx服务、consul-template守护进程
registrator服务器(client) CentOS7.4(64 位) 20.0.0.38 运行registrator容器、nginx服务

2.1 server部署

#1.建立 consul 服务
cd /opt
#上传安装包,并解压
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin

image-20220914095112645

#2.设置代理,后台启动 consul 服务器
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.37 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &

#查看端口信息是否启动
[root@consul consul]# netstat -natp | grep consul

#查看谁是leader
[root@consul consul]# consul info | grep leader

#查看集群状态
[root@consul consul]# consul operator raft list-peers

image-20220914100835972

常用命令

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

2.2 client部署

容器服务自动加入nginx集群

1、安装Gliderlabs/Registrator Gliderlabs/Registrator

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

在20.0.0.38节点上,执行以下操作

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

image-20220914105238736

image-20220914105256437

测试:

systemctl restart docker
docker run -itd -p:81:80 --name test-01 -h test01 nginx
docker run -itd -p:82:80 --name test-02 -h test02 nginx

image-20220914105508567

浏览器访问

20.0.0.37:8500

image-20220914105806870

2.3 配置template模板

Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。

在server端更改配置模板

mkdir /opt/consul
cd /opt/consul/
vim nginx.ctmpl
#定义nginx upstream 一个简单模板
upstream http_backend {
 {{range service "nginx"}}
  server {{.Address}}:{{.Port}};
  {{end}}
}
#定义一个server,监听100端口,反向代理到upstream
server {
 listen 100;
 server_name localhost 20.0.0.38;
 access_log /var/log/nginx/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;
  }     
}

反向代理池
搜索consul中的nginx服务
将nginxl的ip与端口加载到此

image-20220914110224835

安装nginx,用于反向代理
此步骤用于测试,实际生产中并不会使用nginx代理nginx

yum install -y epel-release.noarch
yum install -y nginx
vim /etc/nginx/nginx.conf
...
include vhost/*.conf;
...

image-20220914110704277

mkdir /etc/nginx/vhost
cd /opt
#上传consul-template文件
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin

image-20220914110552940

consul-template -consul-addr 20.0.0.37:8500 -template "/opt/consul/nginx.ctmpl:/etc/nginx/vhost/nginx_consul.conf:/usr/sbin/nginx -s reload" --log-level=info

image-20220914110850145

新开一个终端查看配置文件是否生成

image-20220914111346641

在client上再启动一个容器,测试是否可以自动注册

docker run -itd -p:83:80 --name test-03 -h test3 nginx

image-20220914111448548

再此查看配置文件时候更改

image-20220914111518169

发现新服务,自动注册,重载nginx

image-20220914111710517

测试是否进行正常轮询

http://20.0.0.37:100/

docker logs -f test-01
docker logs -f test-02
docker logs -f test-03

image-20220914112420221

三、Consul 开机自启动

1.路径/usr/lib/systemd/system/,新建一个service命名为,consul.service

[Unit]
Description=consul-service

After=network.target

[Service]
Type=forking
PIDFile=/run/consul-service.pid
ExecStart=/usr/service/consul.start.sh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
    
[Install]
WantedBy=multi-user.target graphical.target

上面的ExecStart 是启动的脚本,我之前把consul 是安装在/user/service 下面,

2. 创建启动脚本

我们再service 目录中创建Consul开机自启动的脚本文件consul.start.sh

#!/bin/bash
/usr/service/consul agent -server  -bootstrap-expect 1 -node=127.0.0.1 -data-dir=/usr/service/data/  -log-file=/usr/service/log/consul_log-$(date +%Y-%m-%d--%H-%M) -bind=127.0.0.1

3. 重新加载配置

 systemctl daemon-reload

4. 设置开机自启动

systemctl enable consul.service

Consul 启动

systemctl start consul

Consul 停止

systemctl stop consul

上面创建开机自启动脚本实践的时候大家可能会发现 通过systemctl start consul 无法启动问题,这时候可以通过status 来查询状态,命令如下

systemctl status consul

查询创建的自启动脚本执行过程中出现code=exited, status=203/EXEC异常错误信息,这个信息一般有如下几个原因造成:

  • 错误的脚本路径
  • 脚本的权限无效
    • 服务用户没有读取脚本的权限
    • 脚本未标记为可执行

Consul 参考资料:
1.可以参考Consul的官方网站和其他网站上提供的信息。本文列举一些可用参考的资源如下:
2.Consul官方网站
3.Consul Github地址
4.Consul-template Github地址
5.Consul官方介绍
6.Consul 系统架构
7.Consul与其他开源软件或解决方案的对比
8.Dubbo用户指南 通过此指南可以了解Dubbo是什么,能做什么
9.借助 Consul 和 Docker 支持即插即用的服务发现 (service discovery)
10.使用Terraform与Consul自动化现代数据中心
11.基於swarm+consul+nginx達到HA和auto scaling的架構
12.使用Docker、Registrator、Consul、Consul Template和Nginx实现高可扩展的Web框架
13.Consul多数据中心配置

q.com/cn/news/2015/05/hashimoto-modern-datacenter)
11.基於swarm+consul+nginx達到HA和auto scaling的架構
12.使用Docker、Registrator、Consul、Consul Template和Nginx实现高可扩展的Web框架
13.Consul多数据中心配置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4.Docker--Consul 的相关文章

随机推荐

  • ACM输入输出

    写在前面 主要记录一下ACM输入输出的写法 一 输入数值 1 给定N的定长多行输入 题目 https ac nowcoder com acm contest 5657 B 代码 include
  • 【Java】基于朴素贝叶斯算法破解基于哈希表的随机字符替换加密算法

    Java 基于朴素贝叶斯算法破解基于哈希表的随机字符替换加密算法 不用看了 这篇文章是错的 得出的结果也不是正确的结果 我想错了 因为这个解密算法的前提是已经知道哈希表的情况下去计算的 而实际上应该是只靠统计去分析密文 所以实际破解所需要的
  • Unity模型导入相关知识

    文章目录 常见的模型格式 模型导入参数设置 Model页签 Scene设置 Meshes设置 Geometry设置 Rig页签 Animation Type 动画类型 Avatar化身信息设置 Animation页签 基础信息设置 动画剪辑
  • 童年回忆——切水果(内含源码inscode一键运行)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • vue项目中使用pdf.js预览pdf文件

    项目要求需要预览pdf文件 网上找了很久 大多数都是推荐pdf js 自己起了解了一下 最后决定用pdf js 但是发现 在vue中使用这个很少 所以我就写这一篇帮助一下vue使用pdfjs的朋友 其实 这和前端框架无关的 直接使用pdf
  • 网络模拟(Network_simulation)

    https en wikipedia org wiki Network simulation In computer network research network simulation is a technique whereby a
  • CocoaPods创建管理类库的步骤

    用到的命令 1 git clone https github com jackLeong MySDK git 克隆一份远程仓库 2 git add fileName 把文件纳入git的缓存区 可使用 代替目录下的所有文件 3 git sta
  • Android 13 - Media框架(5)- NuPlayerDriver

    前面的章节中我们了解到上层调用setDataSource后 MediaPlayerService Client IMediaPlayer 会调用MediaPlayerFactory创建MediaPlayerBase Android为我们提供
  • 第3讲 Camera Sensor 数据流

    Camera Sensor Block Camera Sensor Output Format raw8 一个像素点用8bit来表示 范围0 256 raw10 一个像素点用10bit来表示 范围0 1024 raw12 一个像素点用12b
  • 数字化转型需要解决的五大问题

    更多专业文档请访问 www itilzj com 数字化 数字中国被列为十四五规划的核心之一 数字经济席卷各行各业 新一轮的商业马拉松枪声已经响起 无形的革新重塑着商业大环境 也赋予了我们丰富的想象空间 数字化转型需要解决的问题包括 1 解
  • Unity --- 文本的使用

    1 先讲讲legacy 旧版 的文本text 在一个画布上创建一个文本 这个文本也是一个游戏物体 且是画布的子物体 上面这个就是文本的inspector界面 在字体参数处我们可以点开框框选择新的字体资源 前提是我们有导入这个字体资源 行间距
  • MySQL之添加联合唯一索引

    一 联合唯一索引 项目中需要用到联合唯一索引 例如 有以下需求 每个人每一天只有可能产生一条记录 处了程序约定之外 数据库本身也可以设定 例如 t aa 表中有aa bb两个字段 如果不希望有2条一模一样的记录 即 aa字段的值可以重复 b
  • visio2016上下标

    之前的visio版本是有上下标的快捷按钮的 但是在visio2016中没有了 需要选中文字之后在 字体 选项卡 点击右下角的小箭头 在 位置 中选择上下标 或者使用快捷键 选中要成为上标的文字 ctrl shift 选中要成为下标的文字 c
  • Windows下修改VSCode工作区存储目录workspaceStorage

    VSCode会将每个工作区的一些配置 扩展 缓存等保存在一个默认的目录 在Windows下 此默认目录为 AppData Code User workspaceStorage 当存在多个工作空间或扩展时 需要使用大量的磁盘空间 而VSCod
  • EMC经典问答85问(75-77问)

    75 某个手持测试产品 可以电池供电 同时也可以采取外置适配器供电方式 适配器单独带负载辐射发射 RE 测试可以通过 手持产品在电池供电情况下辐射发射 RE 也可以通过 并且余量都比较大 但是在带外置适配器的情况下 却在 160M 频率左右
  • 23种设计模式概述

    设计模式共有23种 创建型模式5种 结构型模式7种 行为型模式11种 本章只做概念性说明 一 创建型模式 01 工厂模式 定义 又叫做静态工厂方法 定义一个用于创建对象的接口 让子类决定实例化哪一个类 工厂模式使得一个类的实例化延迟到子类
  • Unity笔记-打飞碟游戏

    目的 创建一个打飞碟游戏 简陋 游戏要求 游戏要分多个 round 飞碟数量每个 round 都是 n 个 但色彩 大小 发射位置 速度 角度 每次发射数量可以变化 游戏过程中 仅能创建 n 个飞碟 且不容许初始化阶段生成任何飞碟 飞碟线路
  • windows关闭开机自启动

    如题 有时候windows软件会开机自动打开某些软件 当你不希望它开机自启动的时候 就需要进行设置不让它开机自动 下面介绍几个方法关闭开机自启动 一 通过指令集进行设置 按下电脑上的windows R 然后输入msconfig 点击确定 可
  • 虚拟机硬盘简简单单扩容

    今天写这个博客就是为了 以后各位午饭们在使用虚拟机为虚拟机硬盘扩容时 不要再走那么多弯路了 环境介绍 虚拟机 VMware Workation 8 操作系统 windows server 2008 硬盘容量 10G windows serv
  • 4.Docker--Consul

    Docker Consul 引言 Consul是HashiCorp公司推出的开源工具 Consul由Go语言开发 部署起来非常容易 只需要极少的可执行程序和配置文件 具有绿色 轻量级的特点 Consul是分布式的 高可用的 可横向扩展的用于