docker 容器部署nginx+keepalived实现高可用

准备两台机器分别部署nginx和keepalived,事先部署好docker容器环境。

主机名 ip地址 部署容器
kp-master 192.168.29.136 nginx+keepalived
kp-slave 192.168.29.130 nginx+keepalived

分别在两台机器上启动两个nginx容器

docker run -d \
  --name my-nginx -p 8005:8005 \
  -v /opt/nginxdir/default.conf:/etc/nginx/conf.d/default.conf \
  -v /opt/nginxdir/index.html:/usr/share/nginx/html/index.html \
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:stable
两台主机上/opt/nginxdir/default.conf内容如下
server {
    listen       8005;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
两台主机上/opt/nginxdir/index.html内容如下:
<h1>hello KP-master</h1>
<h1>hello KP-slave</h1>

分别访问看看

在启动 keepalived容器之前先把配置写好

root@kp-master opt]# cat /opt/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33  # 根据实际网络接口修改
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.29.113/24  # 替换为实际的虚拟 IP
    }
}
[root@kp-slave ~]# cat /opt/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33  # 根据实际网络接口修改
    virtual_router_id 51
    priority 60
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.29.113/24  # 替换为实际的虚拟 IP
    }
}

分别在两台机器启动keepalived容器

docker run -d --name keepalived \
  --network host \
  --cap-add=NET_ADMIN \
  -v ./keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/osixia/keepalived:2.0.20 \
  --copy-service

然后观察vip

可以看到vip在KP-master的ens33上启动了,跟我们配置的一样。

好了,我们现在访问192.168.29.113:8005这个vip+端口应该看到的就是hello KP-master

 现在我们手动停掉kp-master上的keepalived容器,模拟kp-master上nginx故障看看效果

可以看到kp-master上的vip漂移走了

惊不惊喜,vip漂移到了keep-slave上。那我们再通过vip访问看一下

最后在补充一个检查脚本,放在cronjob中每两秒执行检查一次。注意两个节点上都要有这个脚本,同时脚本中的ip写宿主机的ip,也就是各自检查各自节点上的nginx。

#!/bin/bash
# 向 Nginx 发送 HTTP 请求,检查返回状态码
response=$(curl -s -o /dev/null -w "%{http_code}" http://nginxip:8005)

if [ "$response" -ne 200 ]; then
    # 如果状态码不是 200,停止 Keepalived
    /etc/init.d/keepalived stop
fi

  

posted @ 2025-03-31 19:35  高佳丰  阅读(382)  评论(0)    收藏  举报