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

前言

一 :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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BIGmustang/article/details/108762948