Docker consul的容器服务更新与发现(理论加案例)

   日期:2020-09-26     浏览:85    评论:0    
核心提示:1.1:什么是consul,有什么作用consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置具有如下特性:1、consul支持健康检查,允许存储键值对2、一致性协议采用Raft算法,用来保证服务的高可用3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制4、方便部署,与Docker等轻量级容器可无缝配合1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构上方拓扑图是基于Docker完成的,然后将consul

文章目录

  • 前言
  • 一 :consul 理论介绍
    • 1.1consul具有如下特性:
    • 1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构
  • 二 :Docker consul自动发现服务架构的构建
  • 三 . 具体配置:
    • 3.1 环境部署
      • 安装环境
      • 设置阿里云镜像
      • 优化
      • 加速优化 阿里云镜像加速
      • 准备软件包
      • 下载安装docker
    • 3.2 代理服务器安装相关软件
      • 部署consul
      • consul常用操作查看命令
      • 关闭规则,不能关闭防火墙
    • 3.3节点服务器操作
      • 节点服务器安装 registrator 容器
      • 在节点创建容器进行测试:
    • 3.4 宿主机可访问 192.168.100.8:8500 测试
    • 3.5 代理服务器源码编译安装Nginx
    • 3.6 代理服务器安装 consul-template
      • 代理服务器 安装consul-template,准备模板文件
      • 编辑 template nginx 模板文件
      • 修改nginx 配置
      • 代理服务器 启动 template
    • 3.7 这时开一台终端 ,查看配置文件,发现配置以及自动写入
    • 3.8 然后访问测试,检查日志,发现在轮询访问容器节点
      • 访问 192.168.100.8:83
      • 利用 docker logs -f test2 查看容器 test2 日志
    • 3.9 在 节点操作 新增一个容器,测试 发现功能
      • 查看配置文件
  • 四 . 发散思维 ,如何 通过配置 将 apache 和 nginx 容器 一起进行轮询访问操作
    • 方案一 ,修改模板文件
    • 方案二 (骚操作,慎用)

前言

一 :consul 理论介绍

consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置

1.1consul具有如下特性:

1、consul支持健康检查,允许存储键值对

2、一致性协议采用Raft算法,用来保证服务的高可用

3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制

4、方便部署,与Docker等轻量级容器可无缝配合

1.2:基于nginx和consul构建高可用及自动发现的Docker服务架构


上方拓扑图是基于Docker完成的,然后将consul、consul template、registrator和nginx组装成一个值得信任且可扩展的服务框架,此架构可以灵活的、不需要重启任何服务、不需要重写任何配置的添加和移除服务

拓扑图解释

consul template:配置文件模板

registrator:注册机制

consul server:consul服务

例如:当后方增加了一个容器时,容器会注册registrator,registrator发现增加了一个容器的时候,会通知consul server要更新,consul server使用consul template模板更新

二 :Docker consul自动发现服务架构的构建

1、每个提供服务的节点上都要部署和运行consul的agent

2、consul agent有两种运行模式:server和client

3、server和client只是consul集群层面的区分,与搭建在cluster之上的应用服务无关
4、两个节点都安装Docker-ce,注意防火墙不要关闭。
5、在代理服务器上部署consul

主机 IP地址 需要安装的软件

三 . 具体配置:

3.1 环境部署

安装环境

[root@server 11 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

设置阿里云镜像

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo


[root@server 11 ~]# vim /etc/sysctl/conf
net.ipv4.ip_forward=1

优化

开启路由功能

 vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@server 11 ~]# sysctl -p
net.ipv4.ip_forward = 1

加速优化 阿里云镜像加速

sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF'
 {  
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
 } 
EOF
 sudo systemctl daemon-reload 

准备软件包

下载安装docker

[root@server 11 ~]# yum install -y docker-ce

sudo systemctl restart docker

3.2 代理服务器安装相关软件

安装 软件   docker-compose 
 chmod +x docker-compose
cp -p docker-compose  /usr/local/bin/
[root@docker2 compose_nginx]# yum install tree -y

部署consul

[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip            debian-7.0-x86-minimal.tar.gz
consul-template_0.19.3_linux_amd64.zip  docker-compose
mkdir -r /root/consul
cp consul_0.9.2_linux_amd64.zip /root/consul/
cd /root/consul/
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin

安装consul
[root@pc-8 bin]#
 consul agent \
-server \          //服务功能'
-bootstrap \      //参与选举'
-ui \                      //提供web界面'
-data-dir=/var/lib/consul-data \              //提供一个代理存储数据目录'
-bind=192.168.100.8 \            //绑定本地地址'
-client=0.0.0.0 \       监控的地址,所有网段
-node=consul-server01 &> /var/log/consul.log &    //定义节点名称,日志混合输出到log,并且放到后台运行'
[1] 77128

consul常用操作查看命令

consul members	'//查看集群信息'

consul info |grep leader	'//查看管理信息'
curl 127.0.0.1:8500/v1/status/peers '/查看集群server成员'

curl 127.0.0.1:8500/v1/status/leaders '//查看集群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   '//集群节点详细信息'

关闭规则,不能关闭防火墙

setenforce 0
iptables -F 清空规则

3.3节点服务器操作

节点服务器安装 registrator 容器

docker run -d \
--name=registrator \      '//定义容器名称'
--net=host \                                    '定义网络'
-v /var/run/docker.sock:/tmp/docker.sock \     '指定数据卷,存储信息' 
--restart=always \                                 
gliderlabs/registrator:latest \                          '定义镜像'
-ip=192.168.100.9 \                                      '指定本地地址 consul://192.168.100.8:8500 '指定consul管理节点地址、端口'   

在节点创建容器进行测试:

docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name  test-02 -h test02  nginx
docker run -itd -p:88:80 --name test-03  -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd

3.4 宿主机可访问 192.168.100.8:8500 测试

3.5 代理服务器源码编译安装Nginx

yum -y install gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl \
zlib-devel \
pcre
[root@localhost nginx-1.12.2]# tar -zxvf nginx-1.12.2.tar.gz
[root@localhost LNMP]# cd nginx-1.12.2/
[root@localhost nginx-1.12.2]# useradd -M -s /sbin/nologin nginx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

[root@localhost nginx-1.12.2]# make && make install
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3.6 代理服务器安装 consul-template

compose-template介绍

compose-template是一个守护进程,用于实时查询consul集群信息
并且运维人员可以在consul服务器上,定制任意的模板,生成配置文件
compose可以查询consul中的服务目录、key、key-values等
这种强大的抽象功能和查询语言模板使得consul-template特别适合动态的创建配置文件,也就是自动化增加服务

例如:创建apache/nginx proxy balacers、haproxy backends

代理服务器 安装consul-template,准备模板文件

[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip            debian-7.0-x86-minimal.tar.gz
consul-template_0.19.3_linux_amd64.zip  docker-compose
[root@pc-8 dockersoft]# unzip consul-template_0.19.3_linux_amd64.zip
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: consul-template
[root@pc-8 dockersoft]# ls
consul_0.9.2_linux_amd64.zip  consul-template_0.19.3_linux_amd64.zip  docker-compose
consul-template               debian-7.0-x86-minimal.tar.gz
[root@pc-8 dockersoft]# cp -p consul
consul_0.9.2_linux_amd64.zip            consul-template_0.19.3_linux_amd64.zip
consul-template
[root@pc-8 dockersoft]# cp -p consul
consul_0.9.2_linux_amd64.zip            consul-template_0.19.3_linux_amd64.zip
consul-template
[root@pc-8 dockersoft]# cp -p consul-template /usr/local/bin/

编辑 template nginx 模板文件

此模板用于nginx反向代理模板

nginx.ctmpl跟nginx没有直接关系,

consul是docker的一种自动管理机制

nginx.ctmpl中的参数以变量的形式写入


[root@pc-8 dockersoft]# vim /root/consul/nginx.ctmpl
upstream http_backend { 
  { { range service "nginx"}}               // 根据镜像名过滤包含nginx 的 地址和端口
   server { { .Address}}:{ { .Port}};
   { { end}}
}
server {                                           // 反向代理
  listen 83;
  server_name localhost 192.168.100.8;
  access_log /var/log/nginx/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;
   }
}

修改nginx 配置

[root@pc-8 dockersoft]# vim /usr/local/nginx/conf/nginx.conf
http { 
    include       mime.types;
    include   vhost/*.conf; 添加配置文件路径可识别 default_type application/octet-stream; 创建虚拟主机目录 [root@pc-8 dockersoft]# mkdir /usr/local/nginx/conf/vhost 创建日志文件目录 [root@pc-8 dockersoft]# mkdir /var/log/nginx [root@pc-8 dockersoft]# /usr/local/nginx/sbin/nginx [root@pc-8 dockersoft]# netstat -ntap 

代理服务器 启动 template

//指定模板路径,/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/sha.conf,然后重载nginx -s reload'
接下来会进入监控状态
consul-template -consul-addr 192.168.100.8:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/sha.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

3.7 这时开一台终端 ,查看配置文件,发现配置以及自动写入

[root@pc-8 vhost]# cat sha.conf
upstream http_backend { 

   server 192.168.100.9:83;

   server 192.168.100.9:84;

}

server { 
  listen 83;
  server_name localhost 192.168.100.8;
  access_log /var/log/nginx/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;
   }
}

3.8 然后访问测试,检查日志,发现在轮询访问容器节点

访问 192.168.100.8:83

利用 docker logs -f test2 查看容器 test2 日志

3.9 在 节点操作 新增一个容器,测试 发现功能

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

查看配置文件

四 . 发散思维 ,如何 通过配置 将 apache 和 nginx 容器 一起进行轮询访问操作

这里有两个实现方案

方案一 ,修改模板文件

实现同时轮询的方法,设置两个upstream 进行分别匹配 nginx 和 httpd

[root@docker vhost]# vim /root/consul/nginx.ctmpl 

upstream http_backend { 
   { { range service "nginx"}}
    server { { .Address}}:{ { .Port}};
     { { end}}
}

upstream http_httpd { 
   { { range service "httpd"}}
    server { { .Address}}:{ { .Port}};
     { { end}}
}

server { 
  listen 1111;
  server_name localhost 192.168.100.8;
  access_log /var/log/nginx/cllt.cn-access.log;
upstream http_backend { 
   { { range service "nginx"}}
    server { { .Address}}:{ { .Port}};
     { { end}}
}

upstream http_httpd { 
   { { range service "httpd"}}
    server { { .Address}}:{ { .Port}};
     { { end}}
}

server { 
  listen 1111;
  server_name localhost 192.168.100.8;
  access_log /var/log/nginx/cllt.cn-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;
  }
}
server { 
  listen 2222;
  server_name localhost 192.168.100.8;
  access_log /var/log/httpd/cllt.cn-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_httpd;
  }
}

结果可自行尝试

方案二 (骚操作,慎用)

将httpd像导出,重命名为 nginx:new ,因为 它的过滤是 基于镜像名来进行的,所以很有效果,
然后基于此镜像创建容器,即可达到目的。

[root@server-9 opt]# docker run -itd -p 91:80  --name test-08 -h test08 nginx:new
cce37a01c5cd1bf1fa7b665eade83c78c7ee00574e118fe9a618c0f9ce26e582
[root@server-9 opt]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
cce37a01c5cd        nginx:new                       "httpd-foreground"       5 seconds ago       Up 5 seconds        0.0.0.0:91->80/tcp   test-08
6d9c14e57792        nginx                           "/docker-entrypoint.…"   50 minutes ago      Up 50 minutes       0.0.0.0:85->80/tcp   test-05
19f647594be7        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:84->80/tcp   test-02
c7704ab68f10        httpd                           "httpd-foreground"       2 hours ago         Up 2 hours          0.0.0.0:89->80/tcp   test-04
d0fdaa6ae1f0        httpd                           "httpd-foreground"       2 hours ago         Up 2 hours          0.0.0.0:88->80/tcp   test-03
9b7dd5493a95        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:83->80/tcp   test-01
16f497d3290b        gliderlabs/registrator:latest   "/bin/registrator -i…"   4 hours ago         Up 4 hours                               registrator
[root@server-9 opt]#

查看日志文件

[root@server-9 ~]# docker logs -f test-08
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message
[Wed Sep 23 11:50:23.484954 2020] [mpm_event:notice] [pid 1:tid 139876988019840] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Wed Sep 23 11:50:23.485102 2020] [core:notice] [pid 1:tid 139876988019840] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.100.8 - - [23/Sep/2020:11:51:18 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:51:19 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:02 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:02 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:03 +0000] "GET / HTTP/1.0" 200 45
192.168.100.8 - - [23/Sep/2020:11:52:04 +0000] "GET / HTTP/1.0" 200 45

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服