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

浙公网安备 33010602011771号