从零开始搭建 LVS 高可用集群 (单机)
背景
从零开始搭建 LVS 高性能集群 (DR模式)
从零开始搭建 Keepalaived+Lvs 高可用集群 (Aliyun部署)
经过前面2篇关于lvs集群部署文章,相信跟着部署文档,实际部署过集群的大家对lvs服务有了深刻的了解。问题是:“无法在 Aliyun
上部署keepalived + lvs
高可用集群, 那我前面学的知识点就没用了?” 。其实 lvs 在 kubernetes
集群中的使用也比较广泛。k8s 资源 service
实际上就是实现了一个 lvs 路由配置。
现在的构想就是: 我不想在单个ECS实例上部署 Kubernetes
单节点,又想实现 lvs 部署 Nginx
高可用集群?
这篇文章就是关于如何在单个ESC实例上部署 Nginx
高可用集群。
架构
架构
本设计方案采用一台阿里云服务器搭建使用容器运行的Nginx集群,并通过LVS(Linux Virtual Server)的NAT模式实现负载均衡和高可用性。LVS作为负载均衡器运行在网络层,将进入的请求分发到后端的Nginx容器实例。
流程
- 准备一台阿里云ECS服务器,安装必要的操作系统和软件环境,如Docker。
- 配置Docker环境,创建Nginx镜像,并上传到阿里云容器镜像服务。
- 在ECS服务器上安装并配置LVS,设置NAT模式。
- 启动Nginx容器实例,确保它们可以正常运行并提供服务。
- 在LVS中配置虚拟IP(VIP)和后端容器的IP地址及端口映射。
- 配置网络规则,确保流量可以正确路由到LVS监听的VIP。
- 测试负载均衡和高可用性,确保系统在高负载下正常工作。
各服务功能
- LVS:作为负载均衡器,负责接收外部请求并分发到后端的Nginx容器。
- Docker:提供容器化环境,运行Nginx服务。
- Nginx:作为Web服务器,处理来自LVS的请求并提供内容服务。
部署
环境配置
- Aliyun 控制台开通
弹性EIP
- ECS 实例添加
弹性网卡
, 并与 EIP 绑定
绑定结果
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.19.68.106 netmask 255.255.240.0 broadcast 172.19.79.255inet6 fe80::216:3eff:fe04:9758 prefixlen 64 scopeid 0x20<link>ether 00:16:3e:04:97:58 txqueuelen 1000 (Ethernet)RX packets 435005 bytes 89706618 (89.7 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 403875 bytes 265589398 (265.5 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.19.68.108 netmask 255.255.240.0 broadcast 172.19.79.255inet6 fe80::216:3eff:fe27:98cd prefixlen 64 scopeid 0x20<link>ether 00:16:3e:27:98:cd txqueuelen 1000 (Ethernet)RX packets 144077 bytes 10924805 (10.9 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 83727 bytes 4877299 (4.8 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
部署
- 在阿里云控制台创建ECS实例,选择合适的配置以满足性能需求。
- 连接到ECS实例,安装Docker及其他依赖。
- 创建Nginx Dockerfile,构建镜像,并推送到容器镜像服务。
- 编写Docker Compose文件定义Nginx服务,使用Docker Compose启动Nginx容器。
- 安装LVS软件包,并配置NAT模式,设置VIP和后端Nginx容器的端口转发规则。
- 配置iptables规则,实现网络地址转换。
- 进行压力测试和故障转移测试,确保系统稳定性和可靠性。
nginx部署
docker-compose.yaml
version: "3"
services:nginx-8080:container_name: nginx-8080image: nginx:1.23.0-alpineports:- 8080:80volumes:- ./logs-8080:/var/log/nginxrestart: alwaysnginx-8081:container_name: nginx-8081image: nginx:1.23.0-alpineports:- 8081:80volumes:- ./logs-8081:/var/log/nginxrestart: alwaysnginx-8082:container_name: nginx-8082image: nginx:1.23.0-alpineports:- 8082:80volumes:- ./logs-8082:/var/log/nginxrestart: always
lvs部署
director.sh
#!/bin/bashiptables -t nat -F
# VIP=139.224.136.161
VIP=172.19.68.108 # 弹性EIPDIP=172.19.68.106 # ECS 内网IP
RIP1=172.19.68.106# director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward# 关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects# director设置 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t $VIP:8080 -s rr
$IPVSADM -a -t $VIP:8080 -r $RIP1:8080 -m # nat
$IPVSADM -a -t $VIP:8080 -r $RIP1:8081 -m
$IPVSADM -a -t $VIP:8080 -r $RIP1:8082 -mecho "start director nat mode"
测试
- lvs 链路规则
root@iZuf64d3yu2ti34bwqerlqZ:/home# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.19.68.108:8080 rr-> 172.19.68.106:8080 Masq 1 0 0 -> 172.19.68.106:8081 Masq 1 0 0 -> 172.19.68.106:8082 Masq 1 0 0
- Nginx 集群服务
root@iZuf64d3yu2ti34bwqerlqZ:/home/wcq/lvs/nginx# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
nginx-8080 "/docker-entrypoint.…" nginx-8080 running 0.0.0.0:8080->80/tcp, :::8080->80/tcp
nginx-8081 "/docker-entrypoint.…" nginx-8081 running 0.0.0.0:8081->80/tcp, :::8081->80/tcp
nginx-8082 "/docker-entrypoint.…" nginx-8082 running 0.0.0.0:8082->80/tcp, :::8082->80/tcp
- Nginx 服务访问
EIP:8080
负载均衡。
- lvs 转发记录
root@iZuf64d3yu2ti34bwqerlqZ:/home/w# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.19.68.108:8080 rr-> 172.19.68.106:8080 Masq 1 0 1 # 请求转发的次数-> 172.19.68.106:8081 Masq 1 0 1 -> 172.19.68.106:8082 Masq 1 0 2
优劣势
-
优势:
- 高可用性:LVS和Nginx容器的结合提供了高可用的Web服务。
- 易于扩展:通过增加更多的Nginx容器实例来扩展服务能力。
- 资源隔离:容器化确保了服务之间的资源隔离和安全性。
- 快速部署:Docker容器可以快速部署和启动。
-
劣势:
- 单点故障:如果ECS实例出现问题,整个集群将受到影响。
- 资源限制:容器数量和性能受限于ECS实例的资源。
- 网络复杂性:配置LVS和iptables可能相对复杂。
-
性能监控:使用阿里云监控服务或其他第三方工具监控系统性能。
-
日志管理:集中管理Nginx容器的日志,便于问题排查和分析。
通过这种设计,可以构建一个在阿里云上运行的高可用和负载均衡的Nginx集群。利用容器化和LVS的组合,实现了易于扩展和管理的Web服务架构。
ISSUE
-
单个ESC实例上,是否可以使用 DR 或 TUN 模式?
同一台ESC实例中,运行3个Nginx服务,通过同一个端口访问,DR 与 TUN 模式都不支持端口转发。 -
Nginx本身就支持负载均衡,采用LVS作为Nginx 集群负载均衡的意义?
这篇文章只是一个引子,Nginx服务可以替换成其他服务。使用 lvs的高性能,替换 Nginx 做负载均衡。