• docker管理之consul注册中心


    目录

    前言

    一、Consul 简介

    1. consul 概述

    2. consul 的两种模式

    3. consul 提供的一些关键特性

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

    三、Consul 部署

    1. 服务器配置

    2. consul 服务器

    2.1 安装 docker-ce,docker-compose

    2.2 建立 consul 服务

    2.3 查看群集信息

    2.4 通过 http api 获取群集信息

    3. registrator 服务器

    3.1 安装 Gliderlabs/Registrator

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

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

    四、Consul-template

    1. consul-template 概述

    2. consul-template 的作用

    3. 准备 template nginx 模板文件

    4. 编译安装 nginx 并启动

    5. 编译安装 template 并启动

    6. 访问 template-nginx

    7. 增加节点,测试配置更新

    五、Consul 多节点


    前言

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

    一、Consul 简介

    1. consul 概述

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

    2. consul 的两种模式

    • 在 client 模式下,所有注册到当前节点的服务会被转发到 server 节点,本身是不持久化这些信息的。
    • 在 server 模式下,功能和 client 模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
    • server-leader 是所有 server 节点的老大,它和其它 server 节点不同的是,它需要负责同步注册的信息给其它的 server 节点,同时也要负责各个节点的健康监测。
       

    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 部署

    1. 服务器配置

    服务器IP地址主机名主要功能
    consul服务器192.168.223.53consuldocker-ce,docker-compose,consul,nginx,consul-template
    registrator 服务器192.168.223.37registratordocker-ce,registrator,nginx
    1. #两个节点
    2. systemctl disable --now firewalld.service
    3. setenforce 0
    4. #consul 服务器
    5. hostnamectl set-hostname consul
    6. su
    7. #registrator 服务器
    8. hostnamectl set-hostname registrator
    9. su

    2. consul 服务器

    2.1 安装 docker-ce,docker-compose

    1. [root@consul ~]#curl -SsL http://101.34.22.188/shells/docker.sh > docker.sh
    2. [root@consul ~]#bash docker.sh &> /dev/null
    3. [root@consul ~]#systemctl status docker | grep Active
    4. Active: active (running) since 一 2021-12-06 12:15:52 CST; 15s ago
    5. [root@consul ~]#wget http://101.34.22.188/docker-compose/docker-compose -P /usr/local/bin/ &> /dev/null
    6. [root@consul ~]#chmod +x /usr/local/bin/docker-compose
    7. [root@consul ~]#docker-compose -v
    8. docker-compose version 1.21.1, build 5a3f1a3

    2.2 建立 consul 服务

    1. [root@consul ~]#mkdir /opt/consul
    2. [root@consul ~]#cd /opt/consul/
    3. [root@consul /opt/consul]#wget http://101.34.22.188/consul/consul_0.9.2_linux_amd64.zip &> /dev/null
    4. [root@consul /opt/consul]#unzip consul_0.9.2_linux_amd64.zip &> /dev/null
    5. [root@consul /opt/consul]#mv consul /usr/local/bin/

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

    1. [root@consul /opt/consul]#consul agent \
    2. -server \
    3. -bootstrap \
    4. -ui \
    5. -data-dir=/var/lib/consul-data \
    6. -bind=192.168.223.53 \
    7. -client=0.0.0.0 \
    8. -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。
       
    1. [root@consul /opt/consul]#netstat -natp | grep consul
    2. tcp 0 0 192.168.10.20:8300 0.0.0.0:* LISTEN 60857/consul
    3. tcp 0 0 192.168.10.20:8301 0.0.0.0:* LISTEN 60857/consul
    4. tcp 0 0 192.168.10.20:8302 0.0.0.0:* LISTEN 60857/consul
    5. tcp6 0 0 :::8600 :::* LISTEN 60857/consul
    6. tcp6 0 0 :::8500 :::* LISTEN 60857/consul

    监听端口

    启动 consul 后默认会监听 5 个端口:

    • 8300:replication、leader farwarding 的端口
    • 8301:lan cossip 的端口
    • 8302:wan gossip 的端口
    • 8500:web ui 界面的端口
    • 8600:使用 dns 协议查看节点信息的端口
       

    2.3 查看群集信息

    查看 members 状态

    1. [root@consul /opt/consul]#consul members
    2. Node Address Status Type Build Protocol DC
    3. consul-server01 192.168.223.53:8301 alive server 0.9.2 2 dc1

    查看群集状态

    1. [root@consul /opt/consul]#consul operator raft list-peers
    2. Node ID Address State Voter RaftProtocol
    3. consul-server01 192.168.223.53:8300 192.168.223.53:8300 leader true 2

    2.4 通过 http api 获取群集信息

    1. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/status/peers
    2. ["192.168.223.53:8300"]
    3. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/status/leader
    4. "192.168.223.53:8300"
    5. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/services
    6. {"consul":[]}
    7. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/nginx
    8. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/nodes
    9. [{"ID":"6eac3213-77b3-d578-ab2b-4c4c642e080b","Node":"consul-server01","Address":"192.168.223.53","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.223.53","wan":"192.168.223.53"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
    1. curl 127.0.0.1:8500/v1/status/peers #查看集群 server 成员
    2. curl 127.0.0.1:8500/v1/status/leader #集群 server-leader
    3. curl 127.0.0.1:8500/v1/catalog/services #注册的所有服务
    4. curl 127.0.0.1:8500/v1/catalog/nginx #查看 nginx 服务信息
    5. curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息

    3. registrator 服务器

    3.1 安装 Gliderlabs/Registrator

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

    1. [root@registrator ~]#docker run -d \
    2. --name=registrator \
    3. --net=host \
    4. -v /var/run/docker.sock:/tmp/docker.sock \
    5. --restart=always \
    6. gliderlabs/registrator:latest \
    7. --ip=192.168.223.37 \
    8. consul://192.168.223.53:8500
    9. ......
    10. [root@registrator ~]#docker images
    11. REPOSITORY TAG IMAGE ID CREATED SIZE
    12. gliderlabs/registrator latest 3b59190c6c80 5 years ago 23.8MB
    13. [root@registrator ~]#docker ps -a
    14. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    15. c3f22213e1df gliderlabs/registrator:latest "/bin/registrator --…" 19 seconds ago Up 19 seconds registrator

    参数说明

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

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

    1. [root@registrator ~]#docker run -itd -p 81:80 --name test1 nginx
    2. ......
    3. ae534c6e3b21c5eb69347883dd2293fe4bb890ab94311e97b2b28f69a0638d3b
    4. [root@registrator ~]#docker run -itd -p 82:80 --name test2 nginx
    5. fd51252a6d2b5f835608da3e54ee299e930773094aba41ba5877e182119d7823
    6. [root@registrator ~]#docker run -itd -p 83:80 --name test3 httpd
    7. ......
    8. 2c6c64190ec77384a7ee5e0887f2debbd56fa990b814a706137ecca4ba0f5688
    9. [root@registrator ~]#docker run -itd -p 84:80 --name test4 httpd
    10. 78c024e77c5cc65bf5c227a1fbbdb59b242dcd823e52b2ada3c2c0849454a995
    11. [root@registrator ~]#docker ps -a
    12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    13. 78c024e77c5c httpd "httpd-foreground" 3 seconds ago Up 2 seconds 0.0.0.0:84->80/tcp, :::84->80/tcp test4
    14. 2c6c64190ec7 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 0.0.0.0:83->80/tcp, :::83->80/tcp test3
    15. fd51252a6d2b nginx "/docker-entrypoint.…" 35 seconds ago Up 34 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp test2
    16. ae534c6e3b21 nginx "/docker-entrypoint.…" 43 seconds ago Up 42 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp test1
    17. c3f22213e1df gliderlabs/registrator:latest "/bin/registrator --…" 4 minutes ago Up 4 minutes registrator

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

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

     

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

    1. [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/services
    2. {"consul":[],"httpd":[],"nginx":[]}

    四、Consul-template

    1. consul-template 概述

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

    2. consul-template 的作用

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

    3. 准备 template nginx 模板文件

    1. [root@consul ~]#cat > /opt/consul/nginx.ctmpl << EOF
    2. #定义 nginx upstream 一个简单模板
    3. upstream http_backend {
    4. {{range service "nginx"}}
    5. server {{.Address}}:{{.Port}};
    6. {{end}}
    7. }
    8. #定义一个 server,监听 8000 端口,反向代理到 upstream
    9. server {
    10. listen 8000;
    11. server_name localhost 192.168.223.53;
    12. #修改日志路径
    13. access_log /var/log/nginx/test.com-access.log;
    14. index index.html index.php;
    15. location / {
    16. proxy_set_header HOST $host;
    17. proxy_set_header X-Real-IP $remote_addr;
    18. proxy_set_header Client-IP $remote_addr;
    19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20. proxy_pass http://http_backend;
    21. }
    22. }
    23. EOF

    4. 编译安装 nginx 并启动

    编译安装

    1. [root@consul ~]#yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
    2. [root@consul ~]#useradd -M -s /sbin/nologin nginx
    3. [root@consul ~]#wget http://101.34.22.188/lnmp_wordpress/nginx-1.12.0.tar.gz -P /opt &> /dev/null
    4. [root@consul ~]#tar xf /opt/nginx-1.12.0.tar.gz -C /opt/
    5. [root@consul ~]#cd /opt/nginx-1.12.0/
    6. [root@consul /opt/nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j 4 && make install
    7. ......
    8. [root@consul /opt/nginx-1.12.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

    启动

    1. [root@consul /opt/nginx-1.12.0]#vim /usr/local/nginx/conf/nginx.conf
    2. ······
    3. http {
    4. include mime.types;
    5. include vhost/*.conf; #添加虚拟主机目录
    6. default_type application/octet-stream;
    7. ······
    8. #创建虚拟主机
    9. [root@consul /opt/nginx-1.12.0]#mkdir /usr/local/nginx/conf/vhost
    10. #创建日志文件目录
    11. [root@consul /opt/nginx-1.12.0]#mkdir /var/log/nginx
    12. [root@consul /opt/nginx-1.12.0]#nginx
    13. [root@consul /opt/nginx-1.12.0]#netstat -natp | grep nginx
    14. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 63708/nginx: master

    5. 编译安装 template 并启动

    1. [root@consul ~]#cd /opt/
    2. [root@consul /opt]#wget http://101.34.22.188/consul/consul-template_0.19.3_linux_amd64.zip &> /dev/null
    3. [root@consul /opt]#unzip consul-template_0.19.3_linux_amd64.zip -d /opt/ &> /dev/null
    4. [root@consul /opt]#mv consul-template /usr/local/bin/

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

    1. [root@consul /opt]# consul-template --consul-addr 192.168.223.53:8500 \
    2. --template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
    3. --log-level=info
    4. ······

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

    1. [root@consul ~]#cd /usr/local/nginx/conf/vhost/
    2. [root@consul /usr/local/nginx/conf/vhost]#ls
    3. test.conf
    4. [root@consul /usr/local/nginx/conf/vhost]#cat test.conf
    5. #定义 nginx upstream 一个简单模板
    6. upstream http_backend {
    7. server 192.168.223.37:81;
    8. server 192.168.223.37:82;
    9. }
    10. #定义一个 server,监听 8000 端口,反向代理到 upstream
    11. server {
    12. listen 8000;
    13. server_name localhost 192.168.223.53;
    14. #修改日志路径
    15. access_log /var/log/nginx/test.com-access.log;
    16. index index.html index.php;
    17. location / {
    18. proxy_set_header HOST $host;
    19. proxy_set_header X-Real-IP $remote_addr;
    20. proxy_set_header Client-IP $remote_addr;
    21. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    22. proxy_pass http://http_backend;
    23. }
    24. }

    6. 访问 template-nginx

    准备访问页面(registrator 服务器)

    1. [root@registrator ~]#docker exec -it test1 bash
    2. root@ae534c6e3b21:/# echo "this is test1 web" > /usr/share/nginx/html/index.html
    3. root@ae534c6e3b21:/# exit
    4. exit
    5. [root@registrator ~]#docker exec -it test2 bash
    6. root@fd51252a6d2b:/# echo "this is test2 web" > /usr/share/nginx/html/index.html
    7. root@fd51252a6d2b:/# exit
    8. exit

    浏览器访问 http://192.168.223.53:8000/ 并不断刷新即可查看

    rr 轮询,权重为 1

    7. 增加节点,测试配置更新

    增加一个 nginx 容器(registrator 节点)

    1. [root@registrator ~]#docker run -itd -p 85:80 --name test5 -h test5 nginx
    2. 78e0b2de66c22461870f1982dbaab3c3c3461b53640b7ce36a769c9332bc2b23
    3. [root@registrator ~]#docker ps -a | grep test5
    4. 78e0b2de66c2 nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:85->80/tcp, :::85->80/tcp test5

    观察 template 服务,会从模板更新 /usr/local/nginx/conf/vhost/test.conf 文件内容,并且重载 nginx 服务(consul 节点)

    1. [root@consul ~]#cat /usr/local/nginx/conf/vhost/test.conf
    2. #定义 nginx upstream 一个简单模板
    3. upstream http_backend {
    4. server 192.168.223.37:81;
    5. server 192.168.223.37:82;
    6. server 192.168.223.37:85; #新加的服务
    7. }
    8. #定义一个 server,监听 8000 端口,反向代理到 upstream
    9. server {
    10. listen 8000;
    11. server_name localhost 192.168.223.53;
    12. #修改日志路径
    13. access_log /var/log/nginx/test.com-access.log;
    14. index index.html index.php;
    15. location / {
    16. proxy_set_header HOST $host;
    17. proxy_set_header X-Real-IP $remote_addr;
    18. proxy_set_header Client-IP $remote_addr;
    19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20. proxy_pass http://http_backend;
    21. }
    22. }

    五、Consul 多节点

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

    1. [18:33:32 root@docker_test~]#wget http://101.34.22.188/docker-compose/docker-compose -P /usr/local/bin/ &> /dev/null
    2. [18:38:22 root@docker_test~]#chmod +x /usr/local/bin/docker-compose
    3. [18:38:27 root@docker_test~]#docker-compose -v
    4. docker-compose version 1.21.1, build 5a3f1a3
    5. [18:38:33 root@docker_test~]#mkdir /opt/consul
    6. [18:38:39 root@docker_test~]#cd /opt/consul/
    7. [18:38:44 root@docker_testconsul]#wget http://101.34.22.188/consul/consul_0.9.2_linux_amd64.zip &> /dev/null
    8. [18:38:59 root@docker_testconsul]#unzip consul_0.9.2_linux_amd64.zip &> /dev/null
    9. [18:39:05 root@docker_testconsul]#mv consul /usr/local/bin/
    10. [18:39:10 root@docker_testconsul]#consul agent \
    11. > -server \
    12. > -ui \
    13. > -data-dir=/var/lib/consul-data \
    14. > -bind=192.168.223.50 \
    15. > -client=0.0.0.0 \
    16. > -node=consul-server02 \
    17. > -enable-script-checks=true \
    18. > -datacenter=dc1 \
    19. > -join 192.168.223.53 &> /var/log/consul.log &
    20. [1] 32276

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

    1. [18:39:43 root@docker_testconsul]#consul members
    2. Node Address Status Type Build Protocol DC
    3. consul-server01 192.168.223.53:8301 alive server 0.9.2 2 dc1
    4. consul-server02 192.168.223.50:8301 alive server 0.9.2 2 dc1
    5. [18:39:50 root@docker_testconsul]#consul operator raft list-peers
    6. Node ID Address State Voter RaftProtocol
    7. consul-server01 192.168.223.53:8300 192.168.223.53:8300 leader true 2
    8. consul-server02 192.168.223.50:8300 192.168.223.50:8300 follower true 2

  • 相关阅读:
    java基础入门-15-【集合(Map&可变参数&集合工具类)】
    mysql、oracle 构建数据
    【附源码】Python计算机毕业设计数据时代下的疫情管理系统
    opensuse server连接wifi
    ZGC原理初识
    Spring事务什么时候会失效?
    算法刷题第二天:双指针--1
    开源项目Web Bench 详解,内附视频
    记录uniapp切换主题色能在抖音小程序上无效问题
    【分享】Excel“只读方式”的两种模式
  • 原文地址:https://blog.csdn.net/weixin_51099370/article/details/125899523