安装nginx+keepalived主要是防止nginx单点故障,keepalived可以有效监测nginx单点故障并热备切换到其他节点。

本文所用的实验环境是:

虚拟机安装ubuntu14.04 64位desktop版,在上面安装了docker1.9.1

docker中生成镜像版本为 centos最新版

nginx版本为 1.8.0 源码编译

keepalived 版本为:1.2.20

所用到相关库为: 

zlib 1.2.11 

perl 5.24

openssl为1.9版本

其他安装中需要的工具 比如gcc g++等请根据需要安装。

实验步骤:

在docker下run centos最新进行镜像,进入容器时使用命令 docer exec -ti  [镜像名称或者id]  /bin/bash

此处如果不加后面的/bin/bash,会在启动service相关命令时报总线执行错误。

(1) 编译安装nginx ,解压源码,编译安装nginx不在赘述。

(2) 编译安装Keepalived


cd /usr/local/src  
tar -zxvf keepalived-1.2.20.tar.gz  
cd keepalived-1.2.20  
./configure --prefix=/usr/local/keepalived  
make && make install

(3)将 keepalived 安装成 Linux 系统服务(因为没有使用 keepalived 的默认路径安装(默认是/usr/local),安装完成之后,需要做一些工作)

#复制默认配置文件到默认路径  
mkdir /etc/keepalived  
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/  
#复制 keepalived 服务脚本到默认的地址  
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  
ln -s /usr/local/sbin/keepalived /usr/sbin/  
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

(4)设置 keepalived 服务开机启动

chkconfig keepalived on

(5) 修改keepalived配置文件

修改master的配置文件

! Configuration File for keepalived
global_defs {
    notification_email {
        ****@example.com   #邮箱可以配置
        ****@example.com  #邮箱可以配置
    }
    notification_email_from itsection@example.com
    smtp_server mail.example.com
    smtp_connect_timeout 30
    router_id LVS_DEVEL  #表示节点id 可以修改 比如 nodeA nodeB
}


vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"  #执行一段监测nginx进程是否正常如果不正常尝试启动
    interval 2
    weight -5
    fall 3
    rise 2
}


vrrp_instance VI_1 {
    state MASTER   #标识该节点是master 还是backup
    interface eth0   #该处必须是ifconfig之后得到的网卡名称
    mcast_src_ip 172.17.0.2   #当前节点ip
    virtual_router_id 2   #虚拟节点id 与backup的需保持一致
    priority 101  #优先级,master的优先级数值要大于backup
    advert_int 2
    authentication {
        auth_type PASS  #相关授权 可以配置,也可不修改
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.210   #虚拟节点ip ,需要配置,这样在网关处可以访问该ip 用来跳转到某一个节点
    }
    track_script {
       chk_nginx #调用执行脚本的函数,上面已经定义该函数
    }}

(6)编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh


!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx    #nginx所在的启动bin文件
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fifi

(7) 赋予该脚本执行权限

chmod +x /etc/keepalived/nginx_check.sh

(8) 修改backup的配置文件

如果是按照docker方式构建容器,只需要将刚才的master容器提交到镜像,无需再次安装nginx和keepalived服务。

docker commit d6567f3effad matthew:v_1

然后再run该镜像生成容器

docker run --privileged   -tid --name  matthew01  matthew:v_1  /usr/sbin/init

docker ps -a 看一下该容器是否生成,容器生成后可以执行

docker exec -ti  matthew01 /bin/bash 进入到该容器

进入到keepalived配置文件目录 修改该配置文件为BACKUP配置文件

! Configuration File for keepalived
global_defs {
    notification_email {
        ****@example.com   #邮箱可以配置
        ****@example.com  #邮箱可以配置
    }
    notification_email_from itsection@example.com
    smtp_server mail.example.com
    smtp_connect_timeout 30
    router_id LVS_DEVEL  #表示节点id 可以修改 比如 nodeA nodeB
}


vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"  #执行一段监测nginx进程是否正常如果不正常尝试启动
    interval 2
    weight -5
    fall 3
    rise 2
}


vrrp_instance VI_1 {
    state BACKUP #标识该节点是master 还是backup
    interface eth0   #该处必须是ifconfig之后得到的网卡名称
    mcast_src_ip 172.17.0.3   #当前节点ip
    virtual_router_id 2   #虚拟节点id 与backup的需保持一致
    priority 100  #优先级,master的优先级数值要大于backup
    advert_int 2
    authentication {
        auth_type PASS  #相关授权 可以配置,也可不修改
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.210   #虚拟节点ip ,需要配置,这样在网关处可以访问该ip 用来跳转到某一个节点
    }
    track_script {
       chk_nginx #调用执行脚本的函数,上面已经定义该函数
    }}

需要修改的地方 橙色标出,已经修改为backup配置。

(9)测试keepalived可用性 

修改nginx 默认访问页面index.html  加上当前机器的ip地址,这样便于在浏览器访问时定位到是哪台机器在提供服务。

通过两个容器中输入 ip add

观察虚拟ip是否已经产生

docker kubenetes 安装 docker安装keepalived_nginx

红色框中的ip为keepalived中配置的虚拟ip,如果你的配置中未有虚拟ip出现,说明你的配置有问题 两台nginx无法通信。

可用通过浏览器访问该虚拟ip看看页面跳转到哪个页面

docker kubenetes 安装 docker安装keepalived_nginx_02

通过停止某一台机器的keepalived服务和nginx服务,用来测试热备是否能及时切换。

至此 docker下构建keepalived服务实验结束。

文章参考了部分有关keepalived的配置,引文如下

https://www.centos.bz/2017/08/nginx-keepalived-web-ha/