centos7安装keepalived+docker安装nginx热备切换高可用

环境

VMware虚拟机1: 192.168.1.39

VMware虚拟机2: 192.168.1.40

keepalived-1.2.19

keepalived安装

可以查看上一篇文章centos7安装keepalived记录最新版踩坑
这个文章记录里面,之前的配置是有问题的,后来我编辑了下,改对了。具体改了哪里,在下面"问题"中说明

简单版本,试试keepalived的漂移

docker安装nginx(两台机器都要装)

docker pull nginx

docker run -p 8080:80 -d --name mynginx nginx

修改nginx 默认访问页面index.html 加上当前机器的ip地址,这样便于在浏览器访问时定位到是哪台机器在提供服务。
很多docker镜像里面是没有vi的。这里采用下面办法,先从容器cp出来->修改->cp回容器

  • docker cp mynginx:/usr/share/nginx/html/index.html .
  • vim index.html
  • 加上本机ip
  • docker cp index.html mynginx:/usr/share/nginx/html
  • docker restart mynginx
  • 单独打开服务器192.168.1.39:8080和192.168.1.40:8080都是能访问的。

问题

排查问题可以看下这篇文章 keepalived的vip无法ping通排查过程

测试

  • 打开http://192.168.1.222:8080/
  • 看到上面显示的ip是"IP:192.168.1.39"
  • 关闭1.39上的keepalived服务
  • 再打开打开http://192.168.1.222:8080/
  • 看到上面显示的ip是"IP:192.168.1.40"
  • 再重启1.39上的keepalived服务
  • 再打开打开http://192.168.1.222:8080/
  • 如果你配置的时候开启了抢占VIP,那就会切换回master,如果没开启抢占,就不会改变

高可用版本(在简单版本基础上)

拷贝配置

mkdir -p /opt/docker/nginx/config

mkdir -p /opt/docker/nginx/logs

mkdir -p /opt/docker/nginx/html

可以拷贝之前mynginx容器中的index.html或者自己创建一个index.html到/opt/docker/nginx/html

docker cp mynginx:/etc/nginx/nginx.conf /opt/docker/nginx/config

docker cp mynginx:/etc/nginx/conf.d /opt/docker/nginx/config

docker rm -f mynginx

创建运行nginx镜像的脚本

mkdir -p /opt/docker/nginx/script&& cd /opt/docker/nginx/script

vim docker_nginx.sh

粘贴如下内容:

#!/bin/bash
docker run --name mynginx --restart=always -p 8080:80 \
    -v /opt/docker/nginx/config/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v /opt/docker/nginx/config/conf.d:/etc/nginx/conf.d \
    -v /opt/docker/nginx/html:/usr/share/nginx/html \
    -v /opt/docker/nginx/logs:/var/log/nginx \
    -d nginx

sh docker_nginx.sh

修改keepalived配置文件

vim keepalived.conf

加入下面检查ngxin的脚本配置

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}
#添加部分1
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_pid.sh"   # 检查nginx状态的脚本
    interval 2
    weight 3
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface ens33
    virtual_router_id 51
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.222 
    }
    #添加部分2
    track_script {
        chk_nginx
    }
}

添加检查nginx状态的脚本

vim /etc/keepalived/nginx_pid.sh

#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
      docker restart mynginx
      sleep 3
            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                  systemctl stop keepalived
fi 
fi

chmod +x /etc/keepalived/nginx_pid.sh

脚本说明:

当nginx进程不存在时,会自动重启nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后BACKUP会自动接替MASTER的工作。

配置firewalld防火墙允许vrrp协议,关闭防火墙了,跳过此步

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.39" protocol value="vrrp" accept"
firewall-cmd --reload

如果是backup服务器,source address改成master服务器的IP

重启keepalived

service keepalived restart

测试

关闭MASTER的nginx容器 docker stop mynginx,关闭后立马重启

[root@vmware39 keepalived]# docker stop mynginx
mynginx
[root@vmware39 keepalived]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                  PORTS                                            NAMES
ba8b4299bcbe        nginx                 "nginx -g 'daemon ..."   59 minutes ago      Up Less than a second   0.0.0.0:8080->80/tcp      

关闭MASTER的keepalived服务service keepalived stop
这时候VIP漂移到BACKUP上,通过浏览器访问IP已经变成192.168.1.40。

至此笔记完成啦


其实还可以给ngxin加上负载均衡,转到另外的几台服务器上访问web内容,这样的话其中一台web服务器挂了也可以正常使用,真正实现高可用

你可能感兴趣的:(Docker,服务器,Linux)